基础概念章节是告一段落了,不知道各位童鞋是否阅读的顺畅,欢迎各位童鞋踊跃的提出意见和看法并指正。
本章内容
Dockerfile基础命令详解。
本文实操全部基于Ubuntu 20.04
宿主机 => linux服务器本身
上节粗略介绍了Dockerfile
相关命令,这节把一些常用的命令进行详细解释,我们还是以Nginx
的Dockerfile
为主。
指令
FROM 【指定创建镜像的基础镜像】
在Dockerfile
必须首行可存在多条,大部分Dockerfile
基础镜像可以选用体积较小的镜像如Alpine或Debian作为基础镜像,有些则可以使用基础依赖为基础镜像,比如启动Java
项目就可以使用JDK
作为基础镜像,Vue
项目则可以使用node
作为基础镜像。
--------------------------------------------------------------------------------------------------------------------------
LABEL 【为镜像添加标签信息】
标签你懂得,有快速筛选出某个特征镜像的东东,可存在多条。
--------------------------------------------------------------------------------------------------------------------------
ENV 【指定镜像的环境变量】
变量嘛~你也懂得,就是肯定会有调用它的地方,Dockerfile
也一样,一般会在RUN
中被调用到,后续镜像启动的容器中也会存在,可被docker run --env
命令显式覆盖替换,不建议相同变量名被多次赋值,可存在多条。
--------------------------------------------------------------------------------------------------------------------------
RUN 【运行命令】
RUN
有俩种格式,RUN 命令
以shell
终端执行命令即/bin/sh -c
,RUN ["exec","参数1","参数2"]
则是以exec
执行,可以指定用何种终端执行命令,执行多条命令类似shell
,可以使用\
来进行换行,可存在多条RUN
命令,每一条为一镜像层,跟CMD
类似,在docker build
时运行。
--------------------------------------------------------------------------------------------------------------------------
COPY 【复制内容到镜像】
复制以当前Dockerfile
上下相对路径中的内容到镜像中的路径下,镜像中的目录不存在则自动创建,支持正则匹配,可存在多条,类似ADD
,但不会对压缩内容进行解压。
--------------------------------------------------------------------------------------------------------------------------
ENTRYPOINT 【指定镜像默认入口命令】
其实就是镜像创建的容器启动时的初始命令,有俩种格式,参考RUN
,不可存在多条,若存在多条,则以最后一条为准,可被docker run --entrypoint
命令显式覆盖替换。
--------------------------------------------------------------------------------------------------------------------------
EXPOSE 【声明镜像监听端口】
该命令只有声明作用,并不能自动分配端口去映射,可以在运行容器时显式指定端口docker run -p 宿主机端口:容器端口
,可存在多条。
--------------------------------------------------------------------------------------------------------------------------
STOPSIGNAL 【指定镜像创建的容器退出的信号值】
指定在执行docker stop
执行停止容器时,会发给容器的信号,默认情况下会发出SIGTERM
,其目的是为了让容器能够优雅的退出,但是如果容器在接受相应指令后(10s)内还是没有停止,此时Docker
会帮它退出,此时会发送SIGKILL
信号将容器杀死。
--------------------------------------------------------------------------------------------------------------------------
CMD 【指定启动容器时默认执行的命令】
CMD
有三种格式,CMD ["exec","参数1","参数2"]
相当于执行exec 参数1 参数2
,如图中则为nginx -g daemon off;
;CMD exec 参数1 参数2
相当于在shell
中执行,一般用于交互的应用;CMD ["参数1","参数2"]
给ENTRYPOINT
提供默认参数,不可存在多条,若存在多条,则以最后一条为准,可被docker run
命令显式覆盖替换,跟RUN
类似,在docker run
时运行。
--------------------------------------------------------------------------------------------------------------------------
ADD 【添加内容到镜像】
复制以当前Dockerfile
上下相对路径中的内容到镜像中的路径下,复制的内容可以是url
、tar
压缩文件,普通文件;镜像中的目录不存在则自动创建,支持正则匹配,可存在多条,类似COPY
,但会对压缩内容进行解压。
--------------------------------------------------------------------------------------------------------------------------
WORKDIR 【指定镜像的工作目录】
为后续Dockerfile
中的指令指定工作目录,可存在多条,不推荐使用相对路径,若使用相对路径,则会基于之前的指定路径,推荐使用绝对路径。
--------------------------------------------------------------------------------------------------------------------------
VOLUM 【给镜像创建一个挂载点】
可以在镜像创建的容器运行时从本地主机或其他容器挂载数据卷。
构建
编写Dockerfile
完成后,可以在该文件目录下执行docker build
,也可以通过-f
来指定Dockerfile
的路径,命令如下。
通过-t
指定镜像标签,末尾追加构建镜像的上下文路径,构建中ADD
、COPY
、RUN
都会生成一层新的镜像,构建成功后会返回相对应的镜像ID。
当一个Dockerfile
存在多个FROM
时,每一个FROM
都代表一个阶段,不起别名的情况下(as
),从上到下依次从0递增,即假设上图的第一个FROM
不指定别名builder
下,第二个FROM
下的COPY
则是COPY --from=0 /app/dist /data
;不管指不指定别名,其都是从指定阶段拷贝资源到该阶段。
当然docker build
也提供了大量的附加命令,比如指定其可使用的内存量、缓存量等,还有像上文的指定镜像的标签,镜像文件的路径等等,这里就不做展开了,感兴趣的童鞋自行去了解。
构建之父镜像
一般情况下构建新的镜像都需要指定其父镜像,其是生成镜像的基本,会直接影响镜像生成后的大小等,我们可以选择俩种父镜像来构建镜像,一种是基础镜像(如FROM scratch
),另一种是普通镜像(如上文中图片里的node
,nginx
,debian
等)。
类似于git
的.gitignore
,Docker
也有自己的忽略文件. dockerignore
,同理可以让Docker
忽略匹配的路径或文件,这里就不过多扩展。
写在文末。
接下来的更新就是实践篇了,文章将转变为代码为基础,我会尽可能的将注释写明,方便各位童鞋理解与掌握,敬请期待吧~;附大纲。
☆ 参考文献:
《Docker技术入门与实战》 第2版
《Docker技术入门与实战》 第3版
◎ 文中所用到的资源链接:
【Debian和 Alpine作为基准Docker映像的对比】
https://blog.csdn.net/jiagoushipro/article/details/125061841
【Docker Hub】
https://hub.docker.com/
【基础镜像之scratch】
https://hub.docker.com/_/scratch