1、基础指令
1.1、FROM
语法:
FROM <image>
FROM <image>:<tag>
解释:
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
1.2、MAINTAINER
语法:
MAINTAINER <name>
解释:
指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
1.3、RUN
1.3.1、语法介绍
语法:
RUN <command> (shell模式)
RUN ["executable", "param1", "param2"]。 (exec 模式)
解释:
表示当前镜像构建时候运行的命令
1.3.2、shell与exec执行模式
模式 格式 示例
shell模式 类似于 /bin/bash -c command RUN echo hello
exec 模式 类似于 RUN ["/bin/bash", "-c", "command"] RUN ["echo", "hello"]
1.4、EXPOSE
语法:
EXPOSE <port> [<port>...]
解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
1.5、ENTRYPOINT
语法:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
解释:
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT
该命令不会被覆盖,如果运行容器的时候,添加了命令,
则作为参数交给 ENTRYPOINT 指定的命令
如果该参数不被 ENTRYPOINT 指定的命令承认,则发生报错
1.6、CMD
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
CMD
该命令会被 运行容器的时候添加的命令 覆盖
在Dockerfile里面可以存在多个CMD但是只有最后一个生效
2、其它指令
2.1、ADD
语法:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
解释:
将指定的 文件复制到容器文件系统中的
src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
2.2、COPY
语法:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
解释:
单纯复制文件场景,Docker推荐使用COPY
2.3、VOLUME
语法:
VOLUME ["/data"]
解释:
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
2.4、ENV
语法:
ENV <key> <value>
ENV <key>=<value> ...
解释:
设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。
2.5、WORKDIR
语法:
WORKDIR /path/to/workdir (shell 模式)
解释:
切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd
3、构建解析
3.1、基础知识
3.1.1、构建过程
1)从基础镜像1创建一个容器A
2)遇到一条Dockerfile指令,都对容器A做一次修改操作
3)执行完一条指令,提交生成一个新镜像2
4)再基于新的镜像2运行一个容器B
5)遇到一条Dockerfile指令,都对容器B做一次修改操作
6)执行完一条指令,提交生成一个新镜像3
...
3.1.2、构建历史
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能
看到我们每次构建的效果。
提供了镜像调试的能力,我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像
3.1.3、镜像原理

对于Docker镜像文件整体来说,它是一个只读的文件,但是根据我们对构建过程的理解,我们发现,对于
Docker镜像还有很多更深层的东西:
1 镜像文件是基于分层机制实现的
- 最底层是bootfs用于启动容器之前系统引导的文件系统,容器启动完毕后,卸载该部分内容以便节省资源
- 其他层是rootfs,有内核挂载为只读模式,而后通过"联合挂载"在其基础上挂载一个"可写层"
2 下层镜像是上层镜像的父镜像,最底层的称为基础镜像
- 最上层的是可写的,其他各层都是只读的。
3.1.4、构建缓存
第一次构建很慢,之后的构建都会很快,因为它们用到了构建的镜像缓存。
不使用构建缓存方法:
全部不用缓存:
docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
部分不用缓存:
更改Dockerfile的部分代码即可
3.2、镜像的完整流程
3.2.1、流程图

3.2.2、简介
在工作中,我们经常会因为业务需求,而定制各种各样的Doker镜像,由于Dockerfile的便捷性,所以我们经常会基于Dockerfile来创建我们业务场景中所需要的各种镜像。
根据我自己的工作经验,我们在使用Dockerfile的过程中,一般只需要关注三个方面即可:
1、Dockerfile在使用的过程中,构建的指令越少越好,能合并的就合并。
2、基于Docker镜像的分层特性,我们最好按照项目的架构级别来定制不同层的镜像
3、Dockerfiel构建的过程中,功能越简单越好,最好只有一个
3.2.3、代码合并示例
# 原来效果
COPY ./setuptools_scm-3.3.3-py2.py3-none-any.whl /data/softs/
RUN apt-get update -y
RUN apt-get install nginx -y --allow-unauthenticated
RUN mkdir /data/meiduo -p && cd /data/meiduo
RUN apt-get install -y libjpeg-dev libfreetype6-dev libssl-dev --allowunauthenticated
RUN pip3 install /data/softs/setuptools_scm-3.3.3-py2.py3-none-any.whl
RUN pip install -r /data/softs/requirements.txt
RUN pip3 uninstall haystack -y
RUN rm -rf /usr/local/lib/python3.7/site-packages/haystack/
RUN pip3 uninstall django-haystack -y
RUN pip3 install django-haystack==2.8.1
RUN apt-get clean
RUN apt-get autoclean
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf ~/.cache/pip/
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf ~/.cache/pip/
# 改造效果
RUN apt-get update -y && apt-get install nginx libjpeg-dev libfreetype6-dev
libssl-dev -y --allow-unauthenticated && pip3 install
/data/softs/setuptools_scm-3.3.3-py2.py3-none-any.whl && pip3 install -r
/data/softs/requirements.txt && pip3 uninstall haystack -y && rm -rf
/usr/local/lib/python3.7/site-packages/haystack/ && pip3 uninstall djangohaystack -y && pip3 install django-haystack==2.8.1 && apt-get clean && apt-get
autoclean && rm -rf /var/lib/apt/lists/* && rm -rf ~/.cache/pip/
3.2.4、分层效果图

3.2.5、功能效果图
