mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-25 00:50:15 +08:00
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:
commit
f0fdb5c6c9
@ -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 镜像
|
||||||
======
|
======
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
在这份指南中,我们将看到 **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/) 荣誉推出
|
||||||
|
|
Loading…
Reference in New Issue
Block a user