简介
在本实验中,你将学习如何使用 docker compose alpha publish
命令发布一个 Docker Compose 应用。我们将从准备一个简单的多容器应用开始,使用 docker-compose.yaml
文件进行配置。
完成准备工作后,你将探索多种发布应用到仓库的方式,包括使用解析后的镜像摘要(image digests)发布,以及在发布的制品中包含环境变量。通过这个动手实践,你将掌握打包和共享 Compose 应用的完整流程。
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在本实验中,你将学习如何使用 docker compose alpha publish
命令发布一个 Docker Compose 应用。我们将从准备一个简单的多容器应用开始,使用 docker-compose.yaml
文件进行配置。
完成准备工作后,你将探索多种发布应用到仓库的方式,包括使用解析后的镜像摘要(image digests)发布,以及在发布的制品中包含环境变量。通过这个动手实践,你将掌握打包和共享 Compose 应用的完整流程。
在本步骤中,我们将准备一个简单的 Docker Compose 应用。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,你可以使用 YAML 文件来配置应用服务,然后只需一条命令就能根据配置创建并启动所有服务。
首先,我们需要安装 Docker Compose。由于 LabEx 环境中没有预装该工具,我们将下载二进制文件并赋予可执行权限。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
下载并设置可执行权限后,通过检查版本号来验证安装是否成功。
docker-compose --version
你应该能看到类似 Docker Compose version v2.20.2
的输出。
现在,让我们创建一个简单的 Docker Compose 应用。我们将在 ~/project
目录下创建 docker-compose.yaml
文件,该文件将定义一个运行 Nginx 网页服务器的服务。
使用 nano
编辑器创建并编辑文件:
nano ~/project/docker-compose.yaml
在 docker-compose.yaml
文件中添加以下内容:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
在这个 docker-compose.yaml
文件中:
version: '3.8'
指定了 Compose 文件格式版本services:
定义了应用的各个服务web:
是我们的服务名称image: nginx:latest
指定了该服务使用的 Docker 镜像(我们使用官方 Nginx 镜像的最新版本)ports:
将主机端口映射到容器端口,"80:80"
表示将主机的 80 端口映射到容器的 80 端口按 Ctrl + S
保存文件,按 Ctrl + X
退出编辑器。
在运行应用前,我们需要先拉取 nginx:latest
镜像:
docker pull nginx:latest
现在,我们可以使用 docker-compose up
命令启动应用。-d
参数表示以守护进程模式(后台运行)启动容器:
docker-compose up -d
你将看到服务创建和启动的输出信息。
使用 docker ps
命令验证容器是否正在运行:
docker ps
你应该能看到一个 web
服务的条目,显示使用的是 nginx
镜像,状态为 Up
。
最后,你可以测试 Nginx 服务器是否正常工作。由于容器的 80 端口已映射到主机的 80 端口,你可以使用 curl
访问 localhost
:
curl localhost
你应该能看到 Nginx 默认欢迎页面的 HTML 输出。
在本步骤中,我们将学习如何将 Docker Compose 应用发布到仓库。发布 Compose 应用通常需要共享 docker-compose.yaml
文件,并确保所需的 Docker 镜像可以从容器注册表访问。
首先,让我们停止上一步中运行的 Docker Compose 应用。如果当前不在 ~/project
目录,请先导航至该目录:
cd ~/project
使用 docker-compose down
命令停止正在运行的服务。该命令会停止并移除由 up
创建的容器、网络和卷:
docker-compose down
你将看到服务停止和移除的输出信息。
要发布 Compose 应用,我们需要共享 docker-compose.yaml
文件。在实际场景中,你通常会将该文件存储在 Git 等版本控制系统中,并推送到代码仓库(如 GitHub、GitLab、Bitbucket)。
在本实验中,我们将通过创建一个包含 docker-compose.yaml
文件内容的简单文本文件来模拟发布过程,以此演示共享配置的核心概念。
让我们在 ~/project
目录下创建名为 compose_app.txt
的文件,并将 docker-compose.yaml
的内容复制到其中:
cat ~/project/docker-compose.yaml > ~/project/compose_app.txt
现在可以查看新文件内容,确认其与 docker-compose.yaml
一致:
cat ~/project/compose_app.txt
你应该能看到 Compose 文件的 YAML 内容。
在实际发布场景中,你还需要确保 docker-compose.yaml
中引用的 Docker 镜像可在公共容器注册表中访问。在我们的案例中,nginx:latest
镜像已在 Docker Hub 公开可用,因此无需额外操作。如果使用自定义镜像,则需要构建并推送到注册表。
例如,若有一个名为 my-custom-app
的自定义镜像,你需要先用 docker build
构建,然后使用 docker push your-dockerhub-username/my-custom-app
推送到 Docker Hub 等注册表。
为了模拟共享 Compose 文件的过程,假设你将 compose_app.txt
文件分享给他人。对方下载该文件后,只要安装了 Docker 和 Docker Compose 并能访问所需镜像,就可以在自己的机器上运行该应用。
为演示这一过程,我们先删除原始 docker-compose.yaml
文件,然后从 compose_app.txt
重新创建:
rm ~/project/docker-compose.yaml
cat ~/project/compose_app.txt > ~/project/docker-compose.yaml
现在可以验证 docker-compose.yaml
文件是否已重建:
cat ~/project/docker-compose.yaml
你应该能看到与之前相同的 YAML 内容。
本步骤重点介绍了共享 Compose 文件的概念。在后续步骤中,我们将探索更高级的发布功能,例如使用镜像摘要(image digests)和处理环境变量。
在本步骤中,我们将学习如何使用解析后的镜像摘要(image digests)发布 Compose 应用。相比标签(如 latest
),使用镜像摘要能更可靠地确保你始终使用完全相同的镜像版本。标签可能会更新指向新镜像,而摘要则能唯一标识特定的镜像层。
首先,让我们获取前几步中使用的 nginx:latest
镜像摘要。我们可以使用 docker inspect
命令获取该镜像的详细信息:
docker inspect nginx:latest --format='{{.RepoDigests}}'
该命令将输出 nginx:latest
镜像的仓库摘要,格式类似于 [nginx@sha256:...]
。@
符号后的部分即为镜像摘要,请复制这个摘要。
现在我们将修改 docker-compose.yaml
文件,改用镜像摘要而非标签。使用 nano
打开 ~/project
目录下的文件:
nano ~/project/docker-compose.yaml
将 image
行从 image: nginx:latest
修改为 image: nginx@<你的镜像摘要>
,用你复制的摘要替换 <你的镜像摘要>
。例如,若你的摘要是 sha256:abcdef123456...
,则该行应为 image: nginx@sha256:abcdef123456...
。
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here
ports:
- "80:80"
按 Ctrl + S
保存文件,按 Ctrl + X
退出编辑器。
现在当你共享这个 docker-compose.yaml
文件时,任何使用者都将拉取摘要标识的精确镜像,无论 latest
标签当前指向哪个版本。
为验证 Compose 确实使用了摘要,让我们用修改后的配置文件重新启动应用:
docker-compose up -d
Compose 将使用摘要指定的镜像。如果系统中不存在该镜像,则会自动拉取。
你可以通过检查运行中的容器来验证其是否使用了摘要指定的镜像。首先用 docker ps
获取容器 ID:
docker ps
找到运行 nginx
镜像的容器并记录其 Container ID,然后使用 docker inspect
并格式化输出以显示镜像摘要:
docker inspect < container_id > --format='{{.Image}}'
将 <container_id>
替换为你运行的 Nginx 容器实际 ID。输出结果应与 docker-compose.yaml
中指定的镜像摘要一致。
在 Compose 文件中使用镜像摘要是保证应用可复现性的最佳实践,能有效避免因镜像更新导致的意外变更。
在本步骤中,我们将学习如何在 Docker Compose 应用中包含环境变量,以及这对发布流程的影响。环境变量是配置应用的常用方式,Docker Compose 提供了多种管理环境变量的方法。
首先停止前一步骤中运行的 Nginx 容器。如果当前不在 ~/project
目录,请先导航至该目录:
cd ~/project
使用以下命令停止运行中的服务:
docker-compose down
现在我们将修改 docker-compose.yaml
文件来使用环境变量。我们将为 web
服务添加一个简单的环境变量。使用 nano
打开文件:
nano ~/project/docker-compose.yaml
在 web
服务定义中添加 environment
段落,创建一个名为 MY_VARIABLE
的变量并赋值:
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here ## 替换为你的实际摘要
ports:
- "80:80"
environment:
- MY_VARIABLE=HelloFromCompose
请确保将 your_image_digest_here
替换为前一步骤获取的真实镜像摘要。
按 Ctrl + S
保存文件,按 Ctrl + X
退出编辑器。
现在当你使用 docker-compose up
启动应用时,MY_VARIABLE
环境变量将在 Nginx 容器内生效:
docker-compose up -d
要验证容器内环境变量是否设置成功,可以使用 docker exec
在运行中的容器内执行命令。首先通过 docker ps
获取容器 ID:
docker ps
记下运行中的 Nginx 容器 ID,然后使用 docker exec
执行 printenv
命令并过滤 MY_VARIABLE
的输出:
docker exec < container_id > printenv | grep MY_VARIABLE
将 <container_id>
替换为你的 Nginx 容器实际 ID。你应该会看到类似 MY_VARIABLE=HelloFromCompose
的输出。
当发布包含环境变量的 Compose 应用时,需要考虑这些变量在目标环境中的提供方式。
常见做法是使用 .env
文件。Docker Compose 会自动在 docker-compose.yaml
文件所在目录查找名为 .env
的文件。你可以在此文件中定义环境变量,Compose 会自动加载它们。
让我们在 ~/project
目录创建 .env
文件:
nano ~/project/.env
添加以下内容到 .env
文件:
ANOTHER_VARIABLE=ThisIsFromDotEnv
保存文件并退出 nano
。
现在修改 docker-compose.yaml
文件来使用这个新环境变量。重新打开文件:
nano ~/project/docker-compose.yaml
在 environment
段落添加 ANOTHER_VARIABLE
:
version: "3.8"
services:
web:
image: nginx@sha256:your_image_digest_here ## 替换为你的实际摘要
ports:
- "80:80"
environment:
- MY_VARIABLE=HelloFromCompose
- ANOTHER_VARIABLE
注意对于 ANOTHER_VARIABLE
,我们只列出了变量名。Compose 会在运行 docker-compose up
的环境中查找该变量,包括从 .env
文件加载的变量。
保存文件并退出 nano
。
现在停止并重启 Compose 应用以应用变更:
docker-compose down
docker-compose up -d
使用 docker ps
获取新的容器 ID:
docker ps
通过 docker exec
检查容器内的两个环境变量:
docker exec < container_id > printenv | grep MY_VARIABLE
docker exec < container_id > printenv | grep ANOTHER_VARIABLE
将 <container_id>
替换为新的容器 ID。你应该会在输出中看到 MY_VARIABLE=HelloFromCompose
和 ANOTHER_VARIABLE=ThisIsFromDotEnv
。
发布时,通常需要共享 docker-compose.yaml
文件,并提供设置必要环境变量的说明(通过 .env
文件或直接在运行 Compose 的环境中设置)。敏感信息不应硬编码在 docker-compose.yaml
或 .env
文件中,而应使用密钥管理方案处理。
在本实验中,我们学习了如何准备一个简单的 Docker Compose 应用。这包括安装 Docker Compose、验证其安装情况,以及创建 docker-compose.yaml
文件来定义一个基础的 Nginx 网页服务。我们还拉取了必要的 Docker 镜像(nginx:latest
)为运行应用做准备。
后续步骤(在提供内容中未完全详述)可能会涉及使用 docker compose alpha publish
命令将此 Compose 应用发布到仓库。这将包括探索各种选项,例如使用解析后的镜像摘要进行发布,以及在发布的应用定义中包含环境变量。