1. 概述
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。更多详情请参阅官网 Dockerfile构建Docker镜像有以下三个步骤
编写Dockerfile
docker build命令构建镜像
docker run命令运行容器实例
2. Dockerfile构建过程
2.1. Dockerfile基础
- 每条保留字指令都必须为大写字母,且后面要跟至少一个参数
- 指令按照从上到下依次执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
2.2. Docker执行Dockerfile流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
2.3. Dockerfile、Docker镜像和Docker容器三者的区别
从应用软件的角度来看,三者分别代表软件的三个不同阶段
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器是软件镜像的运行态,即依照镜像运行的容器实例
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器涉及部署和运维,三者缺一不可
Dockerfile
定义了进程需要的一切东西,涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道时,需要考虑如何设计namespace的权限控制)
Docker镜像
在用Dockerfile定义一个文件后,docker build时会产生一个Docker镜像,当运行Docker镜像时会真正开始提供服务
Docker容器
用于直接提供服务
3. Dockerfile常用保留字
FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,位于Dockerfile第一条
MAINTAINER
镜像维护者姓名和邮箱
RUN
容器构建时需要运行的命令
有两种格式,即shell格式和exec格式
RUN <命令行命令>
例如:RUN yum -y instal vim
RUN ["可执行文件", "参数1", "参数2"]
例如:RUN ["/bin/bash", “-c”, “echo hello”]
EXPOSE
当前容器对外暴露出的端口
WORKDIR
指定在创建容器后,终端默认登录的工作目录
USER
指定该镜像以什么样的用户去执行,默认root
ENV
用于构建镜像过程中设置环境变量,可以在后续的任何RUN指令中使用
ADD
将宿主机目录下得文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY
拷贝文件和目录到镜像中,将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
例如:
COPY src dest
COPY ["src", "dest"]
src原路径:源文件或者源目录
dest目标路径:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定容器启动后要干的事,命令中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
CMD于RUN的区别
- CMD在docker run时运行
- RUN在docker build时运行
ENTRYPOINT
指定一个容器启动时需要运行的命令,与CMD不同的是其不会被docker run后面的指令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序
ENTRYPOINT可以和CMD一起使用,一般情况变参会使用CMD,此时CMD等于是给ENTRYPOINT传参
常用指令如下表
BUILD | Both | RUN |
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
ONBUILD | ||
.dockerignore |