什么是 Dockerfile?如何使用它来管理图像?
什么是 Dockerfile?
Dockerfile 是用于创建镜像的文本文件。文本内容包含构建镜像所需的说明和说明。
使用Dockerfile管理镜像
这里我们只讲解如何打开Dockerfile文件来管理镜像。关于 Dockerfile 的详细说明将在下一节中介绍。这里你只需要了解一下构建过程即可。
1。接下来,配置nginx镜像(构建的镜像中会有/usr/share/nginx/html/index.html文件)
在空目录中,创建一个名为Dockerfile的新文件。并在文件中添加以下内容:
FROM nginx RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
2。 FROM和RUN指令的作用
FROM:定制的镜像都是基于FROM镜像的,这里的nginx是定制所需的基础镜像。后续操作都是基于nginx。
RUN:用于运行以下命令行命令。有以下两种格式:
Shell 格式:
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。
Exec 格式:
RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意 :Dockerfile 指令每次执行时都会在 docker 中创建一个新层。因此,太多不必要的层会导致图像变得过于拥挤。例如:
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz 以上执行会创建 3 层镜像。可简化为以下格式: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
同上,用&&符号连接命令。执行后,只会创建图像的第1层。
开始构建镜像
在存储 Dockerfile 的目录中执行构建操作。
下面的示例通过目录中的 Dockerfile 创建 nginx:v3(镜像名称:镜像标签)。
注意:最后一个。代表本次执行的上下文路径,下一节会介绍。
$ docker build -t nginx:v3 .
如上显示则说明创建成功。
上下文路径
上一节提到了最后一个。指令中是上下文路径。那么什么是上下文路径呢?
$ docker build -t nginx:v3 .
上下文路径显示 docker 创建镜像时有时想要使用本地文件(如复制)。 docker build命令学习到这个路径后,就会打包该路径下的所有内容。
分析:因为运行的docker模式是C/S。我们的本机机器是C,docker机器是S。实际的构建过程是在docker机器上完成的,所以此时无法使用本地文件。这需要将文件打包到我们本地机器的特定目录中并将它们提供给docker机器。
如果不指定最后一个参数,则默认上下文路径是Dockerfile所在的位置。
注意:不要将无用的文件放在上下文路径中,因为它们会同时打包发送到docker机器上。如果文件太多,进程会很慢。命令详细解释
COPY
copy 命令将文件或目录从上下文目录复制到容器中指定的路径。
格式:
COPY [--chown=:] <源路径1>... <目标路径> COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
[--chown=:]:可选参数,用户可以更改复制到容器的文件的所有者和组。
:源文件或源目录。这可以是通配符表达式,并且通配符规则必须满足 filepath.Match Go 规则。例如:
COPY hom* /mydir/ COPY hom?.txt /mydir/
:容器中指定的路径。该路径不需要提前构建。如果该路径不存在,则会自动创建。
ADD
ADD 指令与 COPY 的使用格式相同(根据相同要求,官方推荐使用 COPY)。功能是一样的,区别如下:
- 增加优点:如果是tar压缩文件,且压缩格式为gzip、bzip2、xz,则会自动复制解压到 路径。
- ADD 缺点:tar压缩文件不解压无法复制。这将使图像构建缓存失效,从而使图像变慢。具体是否使用可以根据是否需要自动解压来决定。
CMD
与RUN指令类似,用于运行程序,但两者运行的时间点不同:
- CMD在docker运行时运行。
- RUN 位于 docker 构建中。
功能:指定启动的容器默认运行的程序。当程序运行结束时,容器也会终止。 CMD指令指定的程序可以替换为docker run命令行参数指定的程序来运行。
注意:如果 Dockerfile 中有多个 CMD 指令,则仅应用最后一条。
格式:
CMD CMD ["<可执行文件或命令>","","",...] CMD ["","",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数</shell 命令>
建议使用第二种格式,因为执行过程更清晰。第一种格式在运行时会自动转换为第二种格式,默认的可执行文件为sh。
ENTRYPOINT
与CMD指令类似,但它不会被docker run命令行参数指定的指令覆盖,并且这些命令行参数将作为ENTRYPOINT指定的程序的参数。指示。
但是,如果在运行 docker run 时使用 --entrypoint 选项,则 CMD 指令指定的程序将被覆盖。
优点:运行docker run时,可以指定ENTRYPOINT操作所需的参数。
注意:如果 Dockerfile 中有多个 ENTRYPOINT 指令,则仅应用最后一个。
格式:
ENTRYPOINT ["","","",...]
可与CMD命令配合使用:CMD一般用于更改参数。这里的CMD相当于参数传递ENTRYPOINT,下面的例子会提到。
示例:
假设 nginx:test 镜像已通过 Dockerfile 创建:
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
1。不传参数运行
$ docker run nginx:test
容器上默认会执行以下命令来启动主进程。
nginx -c /etc/nginx/nginx.conf
2。传递参数并运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器中默认会执行以下命令来启动主进程(/etc/nginx/new.conf:假设该文件已经在容器中)
nginx -c /etc/nginx/new.conf
ENV
设置环境变量,定义一个环境变量,那么这个环境变量就可以在后续的指令中使用。
格式:
ENV ENV = =...
下例设置NODE_VERSION = 7.2.0,后续指令中可通过$NODE_VERSION引用:
ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
ARG,与E.NV参数相同。但范围不同。 ARG 设置的环境变量仅在 Dockerfile 中有效,这意味着它们仅在 docker 构建过程中有效。该环境变量不存在于构建的映像中。
docker build 构建命令可以替换为 --build-arg =。
格式:
ARG <参数名>[=<默认值>]
VOLUME
指定匿名数据的容量。如果启动容器时忘记挂载数据卷,它将自动挂载到匿名卷。
功能:
- 防止重要数据再次因为容器而丢失,这是非常致命的。
- 防止容器太大。
格式:
VOLUME ["<路径1>", "<路径2>"...] VOLUME <路径>
启动docker run容器时,我们可以通过-v参数更改挂载点。
EXPOSE
只需声明端口即可。
功能:
- 帮助镜像用户了解该镜像服务的保护端口,方便配置映射。
- 如果运行时使用随机端口映射,即使用 docker run -P 时,会自动随机映射 EXPOSE 端口。
格式:
EXPOSE <端口1> [<端口2>...]
WORKDIR
指定工作目录。使用 WORKDIR 指定的工作目录将位于构建的每个图像层中。 (必须首先创建WORKDIR指定的工作目录)。
docker build 在镜像构建过程中,每个新层运行命令。仅保留通过 WORKDIR 创建的目录。
格式:
WORKDIR <工作目录路径>
USER
用于指定执行下一条命令的用户和用户组。这只是为了下次命令执行时切换用户(用户和用户组必须已经存在)。
格式:
USER <用户名>[:<用户组>]
HEALTHCHECK
用于指定监控docker容器服务运行状态的程序或指令。
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
ONBUILD
用于延迟执行构建命令。简单地说,在该镜像的构建过程中(假设该镜像是测试构建),Dockerfile 中使用 ONBUILD 指定的命令将不会被执行。当新的 Dockerfile 使用之前从 test-build 构建的镜像时,当执行 Dockerfile 构建新镜像时,将执行 test-build 中 Dockerfile 中 ONBUILD 指定的命令。
格式:
ONBUILD <其它指令>
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。