dockerfile详解 | dockerfile构建镜像 12

作者 : 慕源网 本文共2932个字,预计阅读时间需要8分钟 发布时间: 2021-12-12 共147人阅读

dockerfile详解

Dockerfile 用于构建 Docker 镜像。它是一个简单的文本文件,由一组指令或命令组成,由自动构建过程从上到下逐步执行。它用于创建我们自己的 Docker 镜像,大多数情况下我们使用父 Docker 镜像来构建我们自己的 Docker 镜像,但是,我们也可以创建一个基础镜像。Dockerfile 的名称必须是“Dockerfile”,否则 Docker 守护进程会抛出错误并且区分大小写。我们使用“docker build”命令从 Dockerfile 创建一个 Docker 镜像。

dockerfile详解 | dockerfile构建镜像 12

dockerfile构建镜像的原理

下面给出的示例显示了 Dockerfile 如何在 Docker 中工作。

代码:

FROM ubuntu
ENV APP nginx
RUN apt-get update && apt-get install -y APP
WORKDIR /var/www/html/
ADD index.html ./
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

让我们看看上面示例 Dockerfile 中提到的 Dockerfile 的每条指令:

1.FROM

大多数情况下,我们使用官方镜像来构建我们的 Docker 镜像,以便它成为我们 Docker 镜像的基础。如果我们想创建一个基础镜像,我们在 Dockerfile 中使用“FROM scratch”。在上面的 Dockerfile 中,’ubuntu’ 用作基础镜像,称为父镜像。Dockerfile 中提到的其他指令将修改此 Docker 映像。

2.ENV

它用于在创建 Docker 镜像时设置环境变量。它有键值对,我们可以使用“<key>=<value>”设置多个变量。如果我们不使用等号 (=),那么它允许使用单个变量,如上面的 Dockerfile 所示。

代码:

ENV key1=”value1” key2=”value2” \
key3=”value3”
ENV key1 value1
ENV key2 value2
ENV key3 value3

3.RUN

RUN 指令用于在新层执行 shell 命令并将结果提交到新的 Docker 镜像中。我们可以使用反斜杠在多行中运行单独的长或复杂的 RUN 指令,如下所示:

代码:

RUN apt-get update && apt-get install –y \
package1 \
package2 \
package3

4.WORKDIR

它会更改 Docker 映像中的当前工作目录,并且可以通过进一步的指令使用。在上面的例子中,工作目录已更改为“/var/www/html”,然后在下一条指令中我们使用’.’ 指定将文件“index.html”添加到“/var/www/html”的工作目录中。

5.ADD

它用于将文件从本地主机添加到 Docker 镜像。COPY 指令具有类似的功能,但是 ADD 具有一些其他功能以及 tar 提取和远程 URL 支持。在上面的 Dockerfile 中,来自 localhost 的 index.html 文件已添加到 Docker 镜像的当前工作目录中。

注意: index.html 文件必须存在于我们本地的当前工作目录中,否则构建将失败。

6.EXPOSE

EXPOSE 指令告诉容器侦听连接的端口。它在构建映像时不会公开端口。如果我们使用此映像运行容器,它会提供有关端口的一般信息。在上面的例子中,如果容器是使用由上面的 Dockerfile 构建的镜像创建的,并且在创建容器以从外部访问它时必须公开该镜像,则该容器将侦听端口 80。

7.CMD

它定义了使用 Docker 映像创建容器时将执行的内容,或者只是为正在执行的容器提供默认值。我们应该在一个 Dockerfile 中只定义一个 CMD,但是如果我们在一个 Dockerfile 中定义多个 CMD 指令,那么只会执行最后一个 CMD。此外,如果我们在运行容器时指定任何命令,则指定的命令将优先并且不会执行 CMD 指令。

我们可以使用允许创建可执行容器的 ENTRYPOINT 指令。它有两种形式,一种是“exec”形式,另一种是“shell”形式。如果我们在使用 ‘docker run <image>’ 命令运行容器时传递命令行参数,则指定的命令将附加在 exec 形式的 ENTRYPOINT 中的所有元素之后。在使用“docker run <image>”命令运行容器时,我们使用标志“–entrypoint”来覆盖 ENTRYPOINT 指令。

让我们使用以下命令使用上面的示例 Dockerfile 构建 Docker 映像:

语法:

$docker build -t <image_name>:<image_tag><path_of_Dockerfile>

例子:

代码:

$docker build -t my_nginx .
注意:如果我们不提供任何标签,docker daemon 会在镜像中添加“latest”标签并使用“.”,如果 Dockerfile 位于工作目录中,则提供 Dockerfile 的完整路径。

dockerfile详解 | dockerfile构建镜像 12

dockerfile详解 | dockerfile构建镜像 12

解释:

  • 在上面的快照中,可以看出 build 总共有 7 个步骤,它等于 Dockerfile 中指定的指令数,这意味着每条指令都被一条一条地执行。

步骤1: Docker daemon 搜索FROM 指令中提到的镜像,即ubuntu,如果镜像在本地不可用,则从hub 下载,在上述情况下本地已经存在ubuntu。

第二步:将环境变量APP设置为nginx。

第 3 步:更新操作系统并安装 nginx。

第 4 步:将工作目录更改为“/var/www/html”。

第 5 步:将本地“index.html”文件复制到 Docker 镜像到“/var/www/html”。

第 6 步:它显示需要公开 PORT 80 才能从外部访问它。

第 7 步:这是设置默认命令的最后一步,当使用此 Docker 映像创建任何容器时,该命令将运行 nginx 守护程序作为后台作业。

注意:在每一步中,都有一个中间容器,并且正在创建一个镜像。它还使用缓存来加快构建速度,如第 2 步所示。如果我们在对任何指令进行更改或向 Dockerfile 添加新指令后再次运行构建,那么 docker 守护进程只会为该指令创建一个新容器和映像被更改或用于新添加的指令。

Dockerfile 的优点

以下是优点:

  • 它通过使用在构建期间执行的指令集自动化所有步骤来节省我们的时间,因此我们不必手动对容器进行更改并提交。
  • 我们可以将 Dockerfiles 保存在任何源代码控制管理工具上,如 git、svn 等,并利用这些工具提供的优势,如版本控制、分支等。
  • 即使我们没有镜像的中央仓库,我们也可以轻松地与其他团队成员或组共享 Dockerfile。
  • Dockerfile 中的每条指令都会在 Docker 镜像中创建一个层,它有助于通过检查镜像的历史记录来了解镜像在幕后做了什么。它还有助于通过使用缓存更快地构建镜像。

结论

我们也可以在对容器进行必要的更改后使用“docker commit”来创建 Docker 镜像,但不建议这样做,因为我们错过了上面提到的关于 Dockerfile 的优势。在 Dockerfile 中还有更多指令可供使用。

推荐文章

这是 Dockerfile 的指南。在这里,我们将讨论 dockerfile 的介绍以及逐步工作、优点和相应示例。

本文是docker快速入门教程系列的一部分您也可以查看以了解更多信息 –


慕源网 » dockerfile详解 | dockerfile构建镜像 12

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录