Docker镜像是层级的,且可复用。Dockerfile每一行语句生成一层。
docker build -t images_tage .
执行过程:
提取Dockerfile,对其内容按行进行分析。
执行每一行命令,每执行一行命令,其执行方式均为:
以当前镜像运行容器;执行bash命令;创建新一层;删除容器;在新的一层基础上执行下一行。
-t 指定其标签
. 构建镜像的上下文路径。
docker采用C/S架构,所以docker build 实际是在服务端中构成,而构镜像是通常会用到其他文件,所以就需要指定上下文路径,在发送docker build后将指定路径中的文件打包发给服务端。如果该目录下有些文件不希望发送给服务端,则写一个文件.dockerignore来剔除指定文件。文件中直接指定忽略文件即可,可进行模式匹配。例:*/temp*指指定目录下所有二级目录中以temp开头的文件。
#开头进行注释
FROM 镜像名称 --Dockerfile第一句,指定基础镜像
scratch 空白镜像,当程序执行所需要的库都在可执行文件中时,可以使用此镜像构建,以使镜像体积更加小巧
RUN --执行命令行命令
shell格式:RUN <命令>
exec格式: RUN [“可执行文件”,"参数1","参数2"]
因为每一句RUN都会生成一个新的镜像层,所以尽量将相同的命令写在一个RUN下。
要注意构建每一层时保证添加的文件都是有用的,不要有冗余。
COPY <源路径> <目标路径> --复制文件
目标路径可以是绝对路径,也可以是相对于工作路径的相对路径,文件连同其元数据一同复制。
CMD 容器启动命令,若启动容器时指定命令,则该命令被覆盖,指定命令作为CMD内容被执行
shell格式: CMD <命令>
exec格式: CMD ["可执行文件","参数1","参数2"]
容器是一个进程,而不是一个虚拟机,所以没有前台或后台之分。
所以不能使用CMD systemcl start nginx,因为这会转化为CMD ["sh","-c","systemctl start nginx"]
执行完程序,sh就退出了,nginx也就退出了。
所以,正确方式应为CMD ["nginx","-g","daemon off;"]
ENTRYPOINT 入口点
如果指定该选项,则CMD的内容将作为参数传给ENTRYPOINT的命令。
ENV 设置环境变量
格式:ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>·····
VLPLUME 指定匿名卷
VOLUME ["<路径1>","<路径2>","<路径3>"····]
VOLUME <路径>
容器运行时,最好不要将数据写在容器存储层,应该保存在卷中。为防止用户运行容器时忘记设置,可以在dockerfile
中设置匿名卷。运行容器指令可覆盖设置。
EXPOSE 声明暴露端口
EXPOSE <端口1> [<端口2>·····]
仅用作声明,不会自动开启该端口的服务。用于帮助镜像使用者理解镜像服务的守护端口以及在使用-P时自动映射到该端 口。
WORKDIR 指定工作目录
WORKDIR <工作目录路径>
USER 指定当前用户
USER <用户名>
该用户必须是事先建立好的
HEALTHCHECK 健康检查
HEALTHCHECK [选项] CMD <命令>
可以通过该指令来检查容器运行状态,查看服务是否正常。
用该指令构建的镜像,用其启动容器,初始状态为starting,指令检查成功后为healthy,如果连续一定次数失败则会变 为unhealthy。
--interval=<间隔> 两次健康检查的间隔,默认为30s
--timeout=<时长> 健康检查命令失败认定时间,默认30s
--retrise=<次数> 失败次数超过次次数,则unhealthy
ONBUILD 以此镜像为基础镜像时执行的指令
ONBUILD <其他指令>
此指令后面跟的是RUN,COPY等其他指令,这些指令是在以此次构建的镜像为基础构建镜像时执行的命令。
可以用
docker history image_id/image_tag
来查看构建镜像的历史命令。