Merge pull request #26686 from wxy/20220728-How-To-Build-Custom-Docker-Image-Using-Dockerfile

RP:published/20220728 How To Build Custom Docker Image Using Dockerfile.md
This commit is contained in:
Xingyu.Wang 2022-08-04 17:34:03 +08:00 committed by GitHub
commit f0fdb5c6c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,37 +2,31 @@
[#]: via: "https://ostechnix.com/a-brief-introduction-to-dockerfile/" [#]: via: "https://ostechnix.com/a-brief-introduction-to-dockerfile/"
[#]: author: "sk https://ostechnix.com/author/sk/" [#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed" [#]: collector: "lkxed"
[#]: translator: "Donkey" [#]: translator: "Donkey-Hao"
[#]: reviewer: " " [#]: reviewer: "wxy"
[#]: publisher: " " [#]: publisher: "wxy"
[#]: url: " " [#]: url: "https://linux.cn/article-14896-1.html"
如何使用 Dockerfile 创建自定义 Docker 镜像 如何使用 Dockerfile 创建自定义 Docker 镜像
====== ======
![](https://img.linux.net.cn/data/attachment/album/202208/04/172001acb136363vi6vcgk.jpg)
在这份指南中,我们将看到 **Dockerfile** 的简要介绍以及如何在 Linux 中使用 Dockerfile 来自动的 **创建自定义 Docker 镜像** 在这份指南中,我们将看到 **Dockerfile** 的简要介绍以及如何在 Linux 中使用 Dockerfile 来自动的 **创建自定义 Docker 镜像**
#### 目录
1. 什么是 Dockerfile
2. 理解 Dockerfile 格式
3. 创建一个 Dockerfile
4. 使用 Dockerfile 创建 Docker 镜像
### 什么是 Dockerfile ### 什么是 Dockerfile
Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。它囊括了用户在创建镜像时可以调用的所有命令。 Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。它囊括了用户在创建镜像时可以调用的所有命令。
我们可以使用 Dockerfile 创建我们自定义的镜像。可以通过 Docker Hub 分享的自定义 Docker 镜像。 我们可以使用 Dockerfile 创建自定义的镜像。可以通过 Docker Hub 分享的自定义 Docker 镜像。
对于好奇的人来说Docker Hub 是 Docker 提供的托管存储库服务,用于团队查找和共享容器镜像,当然世界上任何人也都可以访问。 如果你还不知道Docker Hub 是 Docker 提供的托管存储库服务,用于团队查找和共享容器镜像,当然世界上任何人也都可以访问。
想象一下,早期如果我们想用 **Nginx**,我们要通过很多步骤,才能安装和配置好 Nginx 。得益于 DockerHub ,现在我们可以在几分钟内,下载并运行 Nginx 的预置容器镜像。 想象一下,早期如果我们想用 **Nginx**,我们要通过很多步骤,才能安装和配置好 Nginx 。得益于 Docker Hub ,现在我们可以在几分钟内,下载并运行 Nginx 的预置容器镜像。
![Nginx Docker Image In Dockerhub][1] ![Nginx Docker Image In Dockerhub][1]
运行如下命令从 DockerHub 上拉取 Nginx 镜像: 运行如下命令从 Docker Hub 上拉取 Nginx 镜像:
``` ```
# docker pull nginx # docker pull nginx
@ -50,9 +44,9 @@ Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。
* [开始使用 Docker][2] * [开始使用 Docker][2]
Dockerhub 上有超过十万个来自软件供应商、开源项目以及社区的容器镜像。 Docker Hub 上有超过十万个来自软件供应商、开源项目以及社区的容器镜像。
你可以从 Dockerhub 上下载你选择的镜像,并且使用上面的命令开始使用它。 你可以从 Docker Hub 上下载你选择的镜像,并且使用上面的命令开始使用它。
### 理解 Dockerfile 格式 ### 理解 Dockerfile 格式
@ -60,111 +54,111 @@ Docker 可以读取 Dockerfile 中的 **指令** 来自动的创建镜像。
典型的 Dockerfile 包含如下指令: 典型的 Dockerfile 包含如下指令:
**1.** **FROM** —— 这会设置容器的基础镜像。 1、`FROM` —— 这会设置容器的基础镜像。
**例如:** 例如:
``` ```
FROM ubuntu:22.04 FROM ubuntu:22.04
``` ```
这会将容器的基础镜像设置为 Ubuntu 。如果 22.04 这个标志没有特指,则会设为 “最新版本” 这会将容器的基础镜像设置为 Ubuntu 。如果 22.04 这个标志没有特别指明,则会设为最新版本(`latest`
**2.** **LABEL** —— 这是用来明确镜像的元数据信息的键值对。 2、`LABEL` —— 这是用来明确镜像的元数据信息的键值对。
**例如:** 例如:
``` ```
LABEL ENV=“DEVELOPMENT” LABEL ENV=“DEVELOPMENT”
``` ```
**3.** **RUN** —— 这会在基础镜像中执行指令并创建一个新层。 3、`RUN` —— 这会在基础镜像中执行指令并创建一个新层。
**例如:** 例如:
``` ```
RUN apt-get update RUN apt-get update
RUN apt-get install tomcat RUN apt-get install tomcat
``` ```
**4.** **CMD** —— 这用来设置容器启动后先执行的命令。 4、`CMD` —— 这用来设置容器启动后先执行的命令。
**例如:** 例如:
``` ```
CMD [“java”, “-jar”, “app.jar”] CMD ["java", "-jar", "app.jar"]
``` ```
**5.** **EXPOSE** —— 设置用于访问容器的端口。容器将会监听该端口。我们可以用来获得输出。 5、`EXPOSE` —— 设置用于访问容器的端口。容器将会监听该端口。我们可以用来获得输出。
**例如:** 例如:
``` ```
EXPOSE 8080 EXPOSE 8080
``` ```
**6.** **MAINTAINER** —— 显示创建镜像作者的信息。 6、``MAINTAINER` —— 显示创建镜像作者的信息。
**例如:** 例如:
``` ```
MAINTAINER info@ostechnix.com MAINTAINER info@ostechnix.com
``` ```
**7.** **ENV** —— 用来设置环境变量的键值对。改变量在镜像创建的时候设置,并在容器创建好后可以使用。 7、`ENV` —— 用来设置环境变量的键值对。这些变量在镜像创建的时候设置,并在容器创建好后可以使用。
**例如:** 例如:
``` ```
ENV DB_NAME=”MySQL” ENV DB_NAME=”MySQL”
ENV DB_VERSION=”8.0” ENV DB_VERSION=”8.0”
``` ```
**8.** **COPY** —— 用来拷贝本地文件至容器中。 8、`COPY` —— 用来拷贝本地文件至容器中。
**例如:** 例如:
``` ```
COPY /target/devops.jar devops.jar COPY /target/devops.jar devops.jar
``` ```
**9.** **ADD** —— 具有与拷贝相同的功能,不过更进一步还可以提取本地的 tar 文件或者从 URL 拷贝文件。 9、`ADD` —— 具有与拷贝相同的功能,不过更进一步还可以提取本地的 tar 文件或者从 URL 拷贝文件。
**例如:** 例如:
``` ```
ADD devops.tar.xz / . ADD devops.tar.xz / .
ADD http://example.com/abc.git /usr/local/devops/ ADD http://example.com/abc.git /usr/local/devops/
``` ```
**10.** **ENTRYPOINT** —— 用来设置镜像的主要命令。与 CMD 指令功能相同。不同的是 ENTRYPOINT 中的指令不会被重写。 10、`ENTRYPOINT` —— 用来设置镜像的主要命令。与 CMD 指令功能相同。不同的是 `ENTRYPOINT` 中的指令不会被重写。
**例如:** 例如:
``` ```
ENTRYPOINT [“java”, “-jar”, “app.jar”] ENTRYPOINT ["java", "-jar", "app.jar"]
``` ```
**11.** **VOLUME** —— 该指令用来创建指定位置的挂载点。 11、`VOLUME` —— 该指令用来创建指定位置的挂载点。
**例如:** 例如:
``` ```
VOLUME /app/devops VOLUME /app/devops
``` ```
**12.** **USER** —— 将设置运行镜像并使用的用户名称以及用户组 12、`USER` —— 将设置运行镜像并使用的用户名称以及用户组
**例如:** 例如:
``` ```
USER dhruv USER dhruv
USER admin USER admin
``` ```
**13.** **WORKDIR** —— 这会设置工作目录。如果目录不存在,则会创建。 13、`WORKDIR` —— 这会设置工作目录。如果目录不存在,则会创建。
**例如:** 例如:
``` ```
WORKDIR /var/lib/ WORKDIR /var/lib/
@ -190,13 +184,13 @@ CMD ["/usr/bin/node", "/var/www/app.js"]
### 创建一个 Dockerfile ### 创建一个 Dockerfile
创建一个名为 **dockerfile** 的文件: 创建一个名为 `dockerfile` 的文件:
``` ```
# nano dockerfile # nano dockerfile
``` ```
添加下面几行命令。我们将更新并安装 **vim****curl** 包: 添加下面几行命令。我们将更新并安装 `vim``curl` 包:
``` ```
FROM alpine FROM alpine
@ -208,11 +202,11 @@ RUN apk add curl
![Dockerfile For Alpine Linux][3] ![Dockerfile For Alpine Linux][3]
按下 **CTRL+O****CTRL+X** 键保存文件并关闭。 按下 `CTRL+O``CTRL+X` 键保存文件并关闭。
现在 Dockerfile 已经就位。让我们继续,用该 Dockerfile 创建一个镜像。 现在 Dockerfile 已经就位。让我们继续,用该 Dockerfile 创建一个镜像。
**注意:** 如果你在使用 **[桌面版 Docker][4]**,你可以像一个普通用户一样运行 docker 命令。 > **注意:** 如果你在使用 [Docker 桌面版][4],你可以以一个普通用户运行 `docker` 命令。
### 使用 Dockerfile 创建 Docker 镜像 ### 使用 Dockerfile 创建 Docker 镜像
@ -222,9 +216,9 @@ RUN apk add curl
# docker build -t alpine . # docker build -t alpine .
``` ```
请注意最后有一个 **点** (**.**) 请注意最后有一个 **点**`.`)。
**输出示例:** 输出示例:
``` ```
[+] Building 51.2s (8/8) FINISHED [+] Building 51.2s (8/8) FINISHED
@ -251,9 +245,9 @@ RUN apk add curl
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
``` ```
按照上面的命令, Docker 会通过保存在当前工作目录中的 **Dockerfile** 中的命令开始自动的创建镜像。还记得我们在 Dockerfile 中保存的 `apk update` `apk add vim``apk add curl` 命令吗?这些命令也将会自动的执行。 按照上面的命令, Docker 会通过保存在当前工作目录中的 Dockerfile 中的命令开始自动的创建镜像。还记得我们在 Dockerfile 中保存的 `apk update`、`apk add vim``apk add curl` 命令吗?这些命令也将会自动的执行。
如果 Dockerfile 保存在其他目录,你可以使用 **-f** 标志来指定路径,例如: 如果 Dockerfile 保存在其他目录,你可以使用 `-f` 标志来指定路径,例如:
``` ```
# docker build -f /path/to/a/Dockerfile . # docker build -f /path/to/a/Dockerfile .
@ -275,7 +269,7 @@ Linux 8890fec82de8 5.10.104-linuxkit #1 SMP Thu Mar 17 17:08:06 UTC 2022 x86_64
/ # / #
``` ```
如果你使用桌面版 Docker 你可以通过容器选项Containers tab界面来查看运行中的容器。 如果你使用 Docker 桌面版,你可以通过<ruby>容器<rt>Containers</rt></ruby>标签页界面来查看运行中的容器。
![View Containers In Docker Desktop][5] ![View Containers In Docker Desktop][5]
@ -290,7 +284,7 @@ via: https://ostechnix.com/a-brief-introduction-to-dockerfile/
作者:[sk][a] 作者:[sk][a]
选题:[lkxed][b] 选题:[lkxed][b]
译者:[Donkey](https://github.com/Donkey-Hao) 译者:[Donkey](https://github.com/Donkey-Hao)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出