如何使用 docker compose alpha publish 命令发布 Compose 应用

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker compose alpha publish 命令发布一个 Docker Compose 应用。我们将从准备一个简单的多容器应用开始,使用 docker-compose.yaml 文件进行配置。

完成准备工作后,你将探索多种发布应用到仓库的方式,包括使用解析后的镜像摘要(image digests)发布,以及在发布的制品中包含环境变量。通过这个动手实践,你将掌握打包和共享 Compose 应用的完整流程。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/ls -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/ps -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/rm -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/exec -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/inspect -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/pull -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/push -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} docker/build -.-> lab-555070{{"如何使用 docker compose alpha publish 命令发布 Compose 应用"}} end

准备一个简单的 Docker 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 输出。

将 Compose 应用发布到仓库

在本步骤中,我们将学习如何将 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)和处理环境变量。

使用解析后的镜像摘要发布 Compose 应用

在本步骤中,我们将学习如何使用解析后的镜像摘要(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 文件中使用镜像摘要是保证应用可复现性的最佳实践,能有效避免因镜像更新导致的意外变更。

发布包含环境变量的 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=HelloFromComposeANOTHER_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 应用发布到仓库。这将包括探索各种选项,例如使用解析后的镜像摘要进行发布,以及在发布的应用定义中包含环境变量。