阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。
今天我们继续来学习Docker技术,本篇文章主要介绍Dockerfile,Dockerffile是一个文本文件,Docker通过读取Dockerfile文件来自动构建镜像。
下面就由成哥来介绍Dockerfile的语法及使用方法吧!
01 Dockerfile概述
Dockerfile相当于一个文档,用户可以基于dockerfile生产新的容器。Dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指令进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像层是多层叠加的,镜像层数越多,效率越低。所以创建镜像时尽量通过越少的指令完成需要的动作。Docker通过dockerfile进行build及build后的镜像运行流程逻辑如下图所示。
02 Dockerfile的编写
(1) 上下文
上下文就是指我们build Docker镜像时Dockerfile文件所在的目录,构建镜像是由Docker守护程序而不是CLI运行的,该过程的第一件事是将 Dockerfile 文件所在目录下的所有内容递归的发送到守护进程。所以在大多数情况下,最好是创建一个新的目录,在其中保存 Dockerfile,并在其中添加构建 Dockerfile 所需的文件。
现在我们就在系统中创建一个空目录以便下面Dockerfile文件的创建及后面的镜像构建
(2) Dockerfile格式
Dockerfile的语法格式如下所示:
1. #?格式为语法+参数??
2. INSTRUCTION?arguments??
该指令不区分大小写。但是,约定将它们大写,以便更轻松地将它们与参数区分开。Dockerfile按顺序运行指令。
(3) Dockerfile常用指令
1)FROM
一个Dockerfile 必须以开始FROM的指令。使用FROM指令指定一个基础镜像,后续指令将在此镜像的基础上运行,在一个Dockerfile文件中FROM可以出现多次,下面我们来看看FROM的语法格式
1. FROM?[--platform=]??[AS?]??
我们创建一个Dockerfile文件,其中FROM指定以centos为基础镜像
1. #?指定以centos为基础镜像进行build??
2. FROM?centos??
2)WORKDIR
WORKDIR用于指定工作目录,所有执行的shell语句都会在该指定的目录中运行,我们后面讲的 RUN,CMD,COPY,ADD 等指令将会在指定的工作目录中去执行。该指令也可以在一个Dockerfile文件中出现多次,最后一次出现的目录依次是上个目录的子目录。如下所示:
1. WORKDIR?/a??
2. WORKDIR?b??
3. WORKDIR?c??
4. RUN?pwd??
最后这个pwd的命令执行的目录为/a/b/c。我们继续基于上面的指令来指定WORKDIR目录为'/'
3)RUN
RUN 指令用于执行命令,该指令有两种形式:
a. RUN
b. RUN ["executable", "param1", "param2"],使用可执行的文件或程序后面并可以跟上相关参数
下面我们通过这两种形式来创建执行命令
1. #?第一种RUN指令方式??
2. RUN?yum?update??
3. ??
4. #?第二种RUN指令方式??
5. RUN?["/bin/bash",?"-c",?"echo?hello"]?
4)CMD
CMD 的使用方式跟 RUN 类似,其跟RUN的区别是RUN是在构建镜像是运行执行而CMD是容器运行后执行的指令。在一个 Dockerfile 文件中只能有一个 CMD 指令,如果有多个 CMD 指令,则只有最后一个会生效。CMD也有三种命令格式具体如下
1. #?第一种执行命令推荐用法??
2. CMD?["executable","param1","param2"]??
3. ??
4. #?第二种该格式主要配合ENTRYPOINT使用,CMD?指令的值会作为?ENTRYPOINT?指令的参数??
5. CMD?["param1","param2"]??
6. ??
7. #?第三种执行shell?form,该方法与第一种的执行效果一致??
8. CMD?command?param1?param2???
我们通过第一种方式来创建来执行wc的帮助指定具体如下
1. CMD?["/usr/bin/wc","--help"]??
第二种方法需要在Dockerfile中使用ENTRYPOINT指令,ENTRYPOINT 指令会覆盖 CMD 指令作为容器运行时的默认指令,并且不会在 docker run 时被覆盖,如下示例
1. FROM?centos??
2. ENTRYPOINT?["ls",?"-a"]??
3. CMD?["-l"]??
上述构建的镜像,在我们使用 docker run
5)COPY&ADD
COPY 和 ADD 都用于将文件,目录等复制到镜像中。两者的区别在于ADD可以使用远程URL路径作为复制源,如果只复制本地文件建议使用COPY,两个指令的语法格式如下:
1. #?ADD命令格式??
2. ADD?[--chown=:]?...???
3. ADD?[--chown=:]?["",...?""]??
4. ??
5. #?COPY命令格式??
6. COPY?[--chown=:]?...???
7. COPY?[--chown=:]?["",...?""]??
--chown用于指定文件目录用户与权限,
6)ENV
ENV用于定义Dockerfile的环境变量,变量设置的值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。其命令格式如下:
1. ENV?=?...??
使用示例如下
1. #?$MYDIR将被替换成"/mydir"??
2. ENV?MYDIR="/mydir"??
3. RUN?mkdir?$MYDIR??
7)VOLUME
VOLUME用于在Dockerfile文件中指定挂载目录,在容器运行时,将自动创建相应的匿名卷,其命令格式如下
1. VOLUME?["/data"]??
该条命令会在容器运行时创建一个匿名卷,同时将容器中/data目录挂载到该卷上。
8)EXPOSE
EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档类型,有关打算发布哪些端口的信息。如果要将容器端口暴露出来,需要在 dcoker run 命令中使用 -p。
EXPOSE指令格式与用法示例如下:
1. #?EXPOSE命令格式??
2. EXPOSE??[/...]??
3. ??
4. #?使容器同时监听TCP与UDP的80端口??
5. EXPOSE?80/tcp??
6. EXPOSE?80/udp??
03 Dockerfile镜像构建
我们现在通过Dockerfile来构建一个nginx服务器,Dockerfile具体配置如下:
1. #?指定基础镜像??
2. FROM?centos??
3. ??
4. #?设置环境目录??
5. WORKDIR?/??
6. ??
7. #?安装nginx??
8. RUN?yum?install?nginx?-y??
9. ??
10. #?容器对外暴露80端口??
11. EXPOSE?80??
12. ??
13. #?启动nginx??
14. CMD?["/usr/sbin/nginx",?"-g",?"daemon?off;"]??
接着通过该Dockerfile文件进行镜像构建,具体如下
最后我们启动容器,同时查看nginx服务是否能够访问,具体操作如下
至此我们Dockerfile的知识点就全部讲完了,大家有什么问题可以在下方留言讨论,最后如果喜欢不要忘了点赞、关注与转发哦!
--END--
@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。
相关文章推荐: