dockerfile详解 | dockerfile构建镜像 12
dockerfile详解
Dockerfile 用于构建 Docker 镜像。它是一个简单的文本文件,由一组指令或命令组成,由自动构建过程从上到下逐步执行。它用于创建我们自己的 Docker 镜像,大多数情况下我们使用父 Docker 镜像来构建我们自己的 Docker 镜像,但是,我们也可以创建一个基础镜像。Dockerfile 的名称必须是“Dockerfile”,否则 Docker 守护进程会抛出错误并且区分大小写。我们使用“docker build”命令从 Dockerfile 创建一个 Docker 镜像。
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 镜像的当前工作目录中。
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 .
解释:
- 在上面的快照中,可以看出 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 守护程序作为后台作业。
Dockerfile 的优点
以下是优点:
- 它通过使用在构建期间执行的指令集自动化所有步骤来节省我们的时间,因此我们不必手动对容器进行更改并提交。
- 我们可以将 Dockerfiles 保存在任何源代码控制管理工具上,如 git、svn 等,并利用这些工具提供的优势,如版本控制、分支等。
- 即使我们没有镜像的中央仓库,我们也可以轻松地与其他团队成员或组共享 Dockerfile。
- Dockerfile 中的每条指令都会在 Docker 镜像中创建一个层,它有助于通过检查镜像的历史记录来了解镜像在幕后做了什么。它还有助于通过使用缓存更快地构建镜像。
结论
我们也可以在对容器进行必要的更改后使用“docker commit”来创建 Docker 镜像,但不建议这样做,因为我们错过了上面提到的关于 Dockerfile 的优势。在 Dockerfile 中还有更多指令可供使用。
推荐文章
这是 Dockerfile 的指南。在这里,我们将讨论 dockerfile 的介绍以及逐步工作、优点和相应示例。
本文是docker快速入门教程系列的一部分您也可以查看以了解更多信息 –
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!