前言
Docker 是世界领先的软件容器平台。
开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。
企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
检查环境
1、 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker; 通过 uname -r 命令查看你当前的内核版本
# 查看内核版本
uname -r
3.10.0-862.14.4.el7.x86_64
2、查看系统是否已经安装过docker 如果安装过就先卸载
yum list installed | grep docker
yum -y remove docker-ce.x86_64 18.03.1.ce-1.el7.centos @docker-ce-stable
准备安装
安装需要使用root用户操作。
1、更新安装包
yum update
2、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
3、更新yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装
1、查看可用的安装版本
yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@iZwz92d3g8mjsxop9ljh16Z docker]# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
可安装的软件包
Loading mirror speeds from cached hostfile
docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.11-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.10-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
2、安装选定版本 (此外使用 18.06.3.ce-3.el7)
yum install docker-ce-18.06.3.ce-3
...
已安装:
docker-ce.x86_64 0:18.06.3.ce-3.el7
作为依赖被安装:
audit-libs-python.x86_64 0:2.8.5-4.el7 checkpolicy.x86_64 0:2.5-8.el7 container-selinux.noarch 2:2.119.2-1.911c772.el7_8 libcgroup.x86_64 0:0.41-21.el7 libsemanage-python.x86_64 0:2.5-14.el7
libtool-ltdl.x86_64 0:2.4.2-22.el7_3 policycoreutils-python.x86_64 0:2.5-34.el7 python-IPy.noarch 0:0.75-6.el7 setools-libs.x86_64 0:3.3.8-4.el7
完毕!
3、设置开机启动
systemctl start docker
systemctl enable docker
4、验证是否安装成功
docker version
Client:
Version: 18.06.3-ce
API version: 1.38
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:26:51 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.3-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:28:17 2019
OS/Arch: linux/amd64
Experimental: false
Docker 常用命令
# 查看docker版本信息
docker -v
# 查看docker详细信息
docker info
# 查看镜像 列表
docker images
# 搜索远程镜像
docker search ${image_name}
# 构建镜像
docker build -t ${author/}${image_name}:${tag} ${dir}
${image_name} 镜像名字
${tag} TAG 不写则使用latest
${dir} 目录
# 查看容器列表
docker ps
docker ps -a
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看特定的容器状态
docker ps | grep ${CONTAINER_ID} #查看容器状态
# 启动一个容器
docker run ${image_name}
docker run --name ${container_name} -d -p ${device_port}:${docker_port} ${author/}${image_name}:${tag} -it -v ${device_dir}:${docker_dir} /bin/bash
--name ${container_name} 指定容器名字
-d 后台运行
-p ${device_port}:{docker_port} 映射端口 服务器物理端口:Docker端口
-P 随机分配端口
-it 分配交互式终端
-v ${device_dir}:${docker_dir} 服务器地址:Docker地址
/bin/bash 覆盖容器的指令(放在image_name后)
# 启动容器
docker start ${container_id}|${container_name}
# 停止一个容器
docker stop ${container_id}|${container_name}
# 查看容器日志
docker logs ${container_id}|${container_name}
# 实时查看
docker logs -f ${container_id}|${container_name}
# kill 容器
docker kill ${container_name}
# 移除container
docker rm ${container_name}
docker container rm ${container_name}
# 移除所有container
docker rm -f 'docker ps -a -q`
# 进入容器命令行
docker exec -it 77cd6bef4dc9 /bin/bash
DockerFile 详解
制作Docker image 有两种方式:
- 一是使用 Docker container,直接构建容器,再导出成 image 使用。
- 二是使用 Dockerfile,将所有动作写在文件中,再 build 成 image。Dockerfile 的方式非常灵活,推荐使用。
Dockerfile 分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令。
其中 ’#’ 为 Dockerfile 中的注释。
一个简单制作nginx的例子
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER tianfeiyu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
参数详解
FROM 基础镜像
具体使用:
FROM
FROM :
说明:此命令必须为Dockerfile里的第一句。
MAINTAINER 作者信息
具体使用:
MAINTAINER
RUN 运行命令
RUN
# 使用exec 执行命令
RUN ["executable", "param1", "param2"]
# 使用指定的命令工具执行
RUN [“/bin/bash”, “-c”,”echo hello”]
WORKDIR 指定路径
具体使用
WORKDIR /path/to/workdir
# 每一次WORKDIR都会基于上一次WORKDIR 来指定目录
WORKDIR /dira
WORKDIR dirb
WORKDIR dirc
# 最终目录为 /dira/dirb/dirc
说明: 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
EXPOSE 指定容器暴露的端口
具体使用:
# 可以指定多个端口
EXPOSE [...]
说明:如果在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
ENV 定义环境变量
具体使用:
ENV PATH /usr/local/nginx/sbin:$PATH
COPY 复制文件(不会进行解压)
具体使用
# 复制物理主机上的文件到docker容器中
COPY
ADD 也是复制文件(如果是压缩文件,会自动解压)
具体使用:
ADD
说明: 其中src可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件,复制进容器会自动解压。
VOLUME 挂载文件夹
具体使用
VOLUME
VOLUME []
说明:
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER 指定运行用户
具体使用
USER daemon
说明:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN useradd -s /sbin/nologin -M www
ENTRYPOINT 容器启动后执行命令
具体使用:
ENTRYPOINT ["executable", "param1", "param2"]
# shell中执行
ENTRYPOINT command param1 param2
说明: 不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效
CMD
具体使用
# 使用 exec 执行,推荐方式
CMD ["executable","param1","param2"]
# 在 /bin/bash 中执行,提供给需要交互的应用
CMD command param1 param2
# 提供给 ENTRYPOINT 的默认参数
CMD ["param1","param2"]
说明:指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
ENTRYPOINT 和 CMD 的区别:
ENTRYPOINT 指定了该镜像启动时的入口,CMD 则指定了容器启动时的命令,当两者共用时,完整的启动命令像是 ENTRYPOINT + CMD 这样。使用 ENTRYPOINT 的好处是在我们启动镜像就像是启动了一个可执行程序,在 CMD 上仅需要指定参数;另外在我们需要自定义 CMD 时不容易出错。
ENTRYPOINT 不能覆盖掉执行时的参数,CMD 可以掉覆盖默认的参数。
可以使用以下命令覆盖默认的参数,方便调试 Dockerfile 中的 bug:
docker run -it --entrypoint=/bin/bash /:
参考文章
为什么要使用docker
Dockerfile详解