在这份指南中,何使我们将看到 Dockerfile 的建自镜像简要介绍以及如何在 Linux 中使用 Dockerfile 来自动的 创建自定义 Docker 镜像 。 Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。它囊括了用户在创建镜像时可以调用的何使所有命令。 我们可以使用 Dockerfile 创建自定义的建自镜像镜像。可以通过 Docker Hub 分享的定义自定义 Docker 镜像。 如果你还不知道,何使Docker Hub 是建自镜像 Docker 提供的托管存储库服务,用于团队查找和共享容器镜像,定义当然世界上任何人也都可以访问。何使 想象一下,建自镜像早期如果我们想用 Nginx,定义我们要通过很多步骤,何使才能安装和配置好 Nginx 。建自镜像得益于 Docker Hub ,定义现在我们可以在几分钟内,下载并运行 Nginx 的预置容器镜像。 Nginx Docker Image In Dockerhub 运行如下命令从 Docker Hub 上拉取 Nginx 镜像: 一旦我们拉取了 Docker 镜像,可以运行如下命令使用它: 就这样,十分简单! Docker Hub 上有超过十万个来自软件供应商、开源项目以及社区的服务器托管容器镜像。 你可以从 Docker Hub 上下载你选择的镜像,并且使用上面的命令开始使用它。 Docker 可以读取 Dockerfile 中的 指令 来自动的创建镜像。 典型的 Dockerfile 包含如下指令: 1、FROM —— 这会设置容器的基础镜像。 例如: 这会将容器的基础镜像设置为 Ubuntu 。如果 ‘22.04’ 这个标志没有特别指明,则会设为最新版本(latest)。 2、LABEL —— 这是用来明确镜像的元数据信息的键值对。 例如: 3、RUN —— 这会在基础镜像中执行指令并创建一个新层。 例如: RUN apt-get update 4、CMD —— 这用来设置容器启动后先执行的命令。 例如: 5、EXPOSE —— 设置用于访问容器的端口。容器将会监听该端口。我们可以用来获得输出。 例如: 6、``MAINTAINER` —— 显示创建镜像作者的网站模板信息。 例如: 7、ENV —— 用来设置环境变量的键值对。这些变量在镜像创建的时候设置,并在容器创建好后可以使用。 例如: ENV DB_NAME=”MySQL” 8、COPY —— 用来拷贝本地文件至容器中。 例如: 9、ADD —— 具有与拷贝相同的功能,不过更进一步还可以提取本地的 tar 文件或者从 URL 拷贝文件。 例如: ADD devops.tar.xz / . 10、ENTRYPOINT —— 用来设置镜像的主要命令。与 CMD 指令功能相同。不同的是 ENTRYPOINT 中的指令不会被重写。 例如: 11、VOLUME —— 该指令用来创建指定位置的挂载点。 例如: 12、USER —— 将设置运行镜像并使用的用户名称以及用户组。 例如: USER dhruv 13、WORKDIR —— 这会设置工作目录。如果目录不存在,则会创建。 例如: 这是服务器租用一个 Dockerfile 的样本,可以参考一下: FROM ubuntu:latest MAINTAINER Senthilkumar Palani "info@ostechnix.com" RUN apt-get install -y software-properties-common python RUN add-apt-repository ppa:chris-lea/node.js RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ jammy universe" >> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nodejs RUN mkdir /var/www ADD app.js /var/www/app.js 我将向你展示创建一个 Dockerfile 、创建并使用镜像的简单例子。 创建一个名为 dockerfile 的文件: 添加下面几行命令。我们将更新并安装 vim 和 curl 包: FROM alpine RUN apk update RUN apk add vim Dockerfile For Alpine Linux 按下 CTRL+O 和 CTRL+X 键保存文件并关闭。 现在 Dockerfile 已经就位。让我们继续,用该 Dockerfile 创建一个镜像。 注意: 如果你在使用 Docker 桌面版,你可以以一个普通用户运行 docker 命令。 只需运行以下命令,便可以使用 Dockerfile 创建 Docker 镜像: 请注意最后有一个 点(.)。 输出示例: [+] Building 51.2s (8/8) FINISHED => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 104B 0.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/alpine:latest 38.8s => [1/4] FROM docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 2.7s => => resolve docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 0.0s => => sha256:d7d3d98c851ff3a95dbcb70ce09d186c9aaf7e25d48 1.47kB / 1.47kB 0.0s => => sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379 2.80MB / 2.80MB 2.4s => => sha256:7580ece7963bfa863801466c0a488f11c86f85d9988 1.64kB / 1.64kB 0.0s => => sha256:9b2a28eb47540823042a2ba401386845089bb7b62a9637d 528B / 528B 0.0s => => extracting sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379cbf2b 0.2s => [2/4] RUN apk update 4.3s => [3/4] RUN apk add vim 3.5s => [4/4] RUN apk add curl 1.3s => exporting to image 0.4s => => exporting layers 0.4s => => writing image sha256:14231deceb6e8e6105d2e551799ff174c184e8d9be8af 0.0s => => naming to docker.io/library/alpine 0.0s 按照上面的命令, Docker 会通过保存在当前工作目录中的 Dockerfile 中的命令开始自动的创建镜像。还记得我们在 Dockerfile 中保存的 apk update、apk add vim 和 apk add curl 命令吗?这些命令也将会自动的执行。 如果 Dockerfile 保存在其他目录,你可以使用 -f 标志来指定路径,例如: 创建好镜像后,我们可以使用如下命令运行它: 该命令会启动这个 Alpine 容器并连接到它。 / # uname -a Linux 8890fec82de8 5.10.104-linuxkit #1 SMP Thu Mar 17 17:08:06 UTC 2022 x86_64 Linux / # cat /etc/alpine-release 3.16.1 如果你使用 Docker 桌面版,你可以通过容器Containers标签页界面来查看运行中的容器。 View Containers In Docker Desktop 这就是使用 Dockerfile 构建自定义容器映像的方式。 我们仅仅讲了基础内容。你可以用 Dockerfile 做到很多东西。建议你参考一下官方 Dockerfile 参考 ,以了解更多内容。