Table of Contents

Docker简介

新服务器安装Docker及容器

Docker安装

Docker for Windows

Docker CE for Ubuntu

参考Docker CE for Ubuntu官方文档

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo docker run hello-world

Docker CE for CentOS (通过yum安装)

参考Docker CE for CentOS官方安装文档

    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install docker-ce
    sudo systemctl start docker

Docker CE for CentOS(Offline)

参照:Setup Docker Engine on Centos Offline - Hybrid Chat

下载安装包

Docker Toolbox

Docker for ArchLinux

# Arch源自带docker安装包,所以直接使用pacman就可以安装
sudo pacman -Sy docker

Docker配置

Docker国内镜像加速

参考Docker中国镜像加速

/etc/docker/daemon.json(如果没有该文件则创建该文件)中添加如下内容:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

如果是阿里云服务器,建议使用阿里云镜像加速,具体见https://www.jianshu.com/p/1a4025c5f186

Docker for Linux安装后配置

非root用户使用Docker

如果将当前用户添加到docker用户组:

  sudo usermod -aG docker $USER

如果将其他用户添加到docker用户组:

  sudo usermod -aG docker <user_name>

Docker常用操作

Docker操作流程

Docker镜像操作

Docker容器操作

Docker复制操作

Dockerfile

Java Web示例:

# 基于Uuntu16.04
FROM ubuntu:16.04
 
# 避免安装软件提示dpkg配置错误
ARG DEBIAN_FRONTEND=noninteractive
# 支持显示中文
ENV LANG C.UTF-8
 
# 切换Ubuntu源为中国的源
RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y --no-install-recommends bash-completion
RUN apt-get install -y --no-install-recommends apt-transport-https ca-certificates
RUN apt-get install -y --no-install-recommends vim openssh-server wget
# 安装tomcat和mysql等
RUN apt-get install -y --no-install-recommends git maven openjdk-8-jre openjdk-8-jdk
RUN apt-get install -y --no-install-recommends mariadb-server mariadb-client tomcat8
 
# 修改maven镜像
RUN wget -q https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
RUN cp jenkins.war /var/lib/tomcat8/webapps
 
# 修改ssh配置以允许远程登录root用户
RUN sed -i 's/PermitRootLogin\ prohibit-password/PermitRootLogin\ yes/g' /etc/ssh/sshd_config
# 配置tomcat内存
RUN sed -i 's/Xmx128m/Xmx4096m/g' /etc/default/tomcat8
 
# 清理apt缓存
RUN rm -rf /var/cache/apt/archives/*
 
# 开放端口
EXPOSE 3306
EXPOSE 8080
EXPOSE 80
EXPOSE 22
 
# 命令行自动补全
RUN echo "if ! shopt -oq posix; then" > ~/.bashrc
RUN echo "  if [ -f /usr/share/bash-completion/bash_completion ]; then" >> ~/.bashrc
RUN echo "    . /usr/share/bash-completion/bash_completion" >> ~/.bashrc
RUN echo "  elif [ -f /etc/bash_completion ]; then" >> ~/.bashrc
RUN echo "    . /etc/bash_completion" >> ~/.bashrc
RUN echo "  fi" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
 
# 自启动脚本
RUN echo "#!/usr/bin/env bash" > ~/start.sh
RUN echo "service ssh start" >> ~/start.sh
RUN echo "service mysql start" >> ~/start.sh
RUN echo "service tomcat8 start" >> ~/start.sh
RUN chmod a+x ~/start.sh
 
# 其他bashrc配置
RUN echo "alias ll='ls -alF'" >> ~/.start.sh
 
CMD ~/start.sh && /bin/bash

Django示例

# 基于Uuntu16.04
FROM ubuntu:16.04
 
# 避免安装软件提示dpkg配置错误
ARG DEBIAN_FRONTEND=noninteractive
# 支持显示中文
ENV LANG C.UTF-8
 
# 切换Ubuntu源为中国的源
RUN sed -i 's/archive/cn\.archive/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y --no-install-recommends bash-completion
RUN apt-get install -y --no-install-recommends apt-transport-https ca-certificates
RUN apt-get install -y --no-install-recommends vim openssh-server wget
# 安装Apache2, python3等
RUN apt-get install -y --no-install-recommends git apache2 python3 python3-pip libapache2-mod-wsgi-py3 python3-setuptools python3-dev build-essential
RUN apt-get install -y --no-install-recommends mariadb-server mariadb-client libmysqlclient-dev
 
# 清理apt缓存
RUN rm -rf /var/cache/apt/archives/*
 
# 开放端口
EXPOSE 3306
EXPOSE 8000
EXPOSE 80
EXPOSE 22
 
# 命令行自动补全
RUN echo "if ! shopt -oq posix; then" > ~/.bashrc
RUN echo "  if [ -f /usr/share/bash-completion/bash_completion ]; then" >> ~/.bashrc
RUN echo "    . /usr/share/bash-completion/bash_completion" >> ~/.bashrc
RUN echo "  elif [ -f /etc/bash_completion ]; then" >> ~/.bashrc
RUN echo "    . /etc/bash_completion" >> ~/.bashrc
RUN echo "  fi" >> ~/.bashrc
RUN echo "fi" >> ~/.bashrc
 
# 自启动脚本
RUN echo "#!/usr/bin/env bash" > ~/start.sh
RUN echo "service ssh start" >> ~/start.sh
RUN echo "service mysql start" >> ~/start.sh
RUN echo "service apache2 start" >> ~/start.sh
RUN chmod a+x ~/start.sh
 
# 其他bashrc配置
RUN echo "alias ll='ls -alF'" >> ~/.bashrc
 
CMD ~/start.sh && /bin/bash

常见问题解决

修改已有容器的端口映射

方法一:提交容器为新的镜像,删除原容器后重新创建一个容器,创建时修改端口映射

方法二:直接修改容器的配置文件(Docker version 17.09.0-ce, build afdb6d4测试通过)

参考Docker Change Port Mapping for an Existing Container(需要自备梯子)

sudo service docker stop
sudo vim /var/lib/docker/containers/<container id>/config.v2.json
# 在ExposedPorts中添加类似"8888/tcp": {}
sudo vim /var/lib/docker/containers/<container id>/hostconfig.json
# 添加或修改PortBindings,类似 "80/tcp":[{"HostIp": "","HostPort": "80"}],
sudo service docker start
sudo docker start <container_id_or_container_name>

自动启动容器内的service

在dockerfile中通过加入CMD service <service_name> start && /bin/bash参考链接

在run image的时候加入需要启动时执行的命令或者脚本即可,如果container已经存在则提交后再run,类似docker run --name=test -dit ubuntu service <service_name> start && /bin/bash

Tomcat在容器内通过service方式启动提示Failed

在执行docker run命令时,增加参数--cap-add SYS_PTRACE

修改Docker镜像和容器文件路径

参考链接:How to change the docker image installation directory?,How do I change the Docker image installation directory?

Docker for Linux的镜像和容器文件默认存储在/var/lib/docker文件夹中,可以改为其他路径,修改步骤为

容器内中文字符无法显示

临时解决方案:

永久解决方案:

方法一:docker run时增加-e LANG=C.UTF-8

方法二:Dockerfile中增加ENV LANG=C.UTF-8

Redhat EL 6.8 docker 安装问题

按照网上常见的办法去安装docker-io,一直失败,无奈只能采用离线安装的方式进行解决,主要的解决办法如下: - 下载离线需要的依赖包, 备用下载地址: 百度云盘 提取码: rhi3 - 按照依赖包里面的readme 安装即可

容器内vim中文乱码

在~/.vimrc中添加如下内容(参考Docker 容器中文乱码解决方案_cuigelasi的博客-CSDN博客_docker中文乱码

:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8

容器内git log中文乱码

参考:docker中使用Ubuntu中文乱码问题解决 - 尚叶鑫的个人主页

git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8

执行上述命令后,在~/.bashrc中加入export LESSCHARSET=utf-8