如何使用 docker compose alpha dry-run 命令测试变更

DockerBeginner
立即练习

介绍

在本实验中,你将学习如何使用 docker compose alpha dry-run 命令来测试 Docker Compose 配置的变更,而无需实际执行这些变更。这是一个非常有用的工具,可以帮助你在应用命令前验证 docker-compose.yaml 文件并理解命令可能产生的影响。

你将从一个简单的 docker-compose.yaml 文件开始准备。接着,你会使用 dry-run 标志结合基本的 Docker Compose 命令,观察模拟输出并理解命令的实际行为。最后,你会将 dry-run 应用到一个通常会执行变更的命令上,从而在不改变系统状态的情况下查看预期的操作。

准备一个简单的 docker-compose.yaml 文件

在这一步骤中,我们将准备一个简单的 docker-compose.yaml 文件。该文件将定义一个基础服务,用于演示 Docker Compose 的 dry-run 功能。

首先,我们需要安装 Docker Compose。由于当前环境中未预装该工具,我们将下载二进制文件并赋予可执行权限。

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 二进制文件,并保存至 /usr/local/bin/docker-composechmod +x 命令用于赋予文件可执行权限。

现在,让我们通过检查版本来验证 Docker Compose 是否安装成功。

docker-compose version

你应该能看到显示已安装 Docker Compose 版本的输出信息。

接下来,我们将为项目创建目录并进入该目录。

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

现在我们位于 ~/project/my-compose-app 目录,将在此创建 docker-compose.yaml 文件。

现在使用 nano 编辑器创建 docker-compose.yaml 文件。

nano docker-compose.yaml

nano 编辑器中粘贴以下内容:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

docker-compose.yaml 文件定义了一个名为 web 的服务。该服务使用 nginx:latest Docker 镜像,并将主机的 80 端口映射到容器的 80 端口。

Ctrl + O 保存文件,按 Enter 确认,然后按 Ctrl + X 退出编辑器。

至此,我们已成功创建了一个简单的 docker-compose.yaml 文件。

使用 dry-run 执行基础 compose 命令

在本步骤中,我们将通过基础 Docker Compose 命令结合 dry-run 标志来了解其工作原理。dry-run 标志能让你查看 Docker Compose 将要执行的操作,而无需实际运行这些操作。这对于在执行命令前理解其潜在影响非常有用。

我们将使用带有 dry-run 标志的 docker-compose config 命令。config 命令用于验证并显示 Compose 文件配置。虽然在此命令中添加 dry-run 不会显著改变其行为(因为 config 本身已是非破坏性命令),但这是理解该标志语法的一个良好起点。

首先,请确保你位于包含 docker-compose.yaml 文件的目录中。

cd ~/project/my-compose-app

现在执行 docker-compose config --dry-run 命令。

docker-compose config --dry-run

你将在控制台看到解析后的 docker-compose.yaml 文件配置输出。由于 config 本质上就是模拟运行操作,此时该输出与不带 dry-run 标志的运行结果相同。

该输出确认 Docker Compose 已成功解析你的 docker-compose.yaml 文件,并正确识别了其中定义的服务和配置。

查看 dry-run 命令输出结果

在本步骤中,我们将仔细分析上一步执行的 docker-compose config --dry-run 命令输出结果。理解这些输出对于掌握 Docker Compose 如何解析你的 docker-compose.yaml 文件至关重要。

你看到的输出是经过验证的 YAML 格式配置,它展示了 Docker Compose 对你文件中定义的服务、网络和卷的理解。

基于我们简单的 docker-compose.yaml 文件,以下是输出的关键部分:

services:
  web:
    build:
      context: /home/labex/project/my-compose-app
    container_name: my-compose-app-web-1
    image: nginx:latest
    ports:
      - published: 80
        target: 80
    restart: "no"

你会看到 services 部分及其中的 web 服务:

  • image: nginx:latest:确认 Docker Compose 正确识别了 web 服务要使用的镜像
  • ports::端口映射部分,published: 80 表示主机端口,target: 80 表示容器端口,这与我们在 docker-compose.yaml 中的定义一致
  • container_name: my-compose-app-web-1:Docker Compose 基于项目目录名和服务名自动生成的默认容器名称
  • build::即使我们指定了 image,Docker Compose 仍会包含一个 build 部分并将上下文设为当前目录,这是内部表示的一部分,并不意味着仅指定 image 时会构建镜像
  • restart: 'no':如果未指定重启策略,Docker Compose 会默认设为 no

此输出展示了当你运行类似 docker-compose up 命令时,Docker Compose 将使用的最终配置表示。当 dry-run 标志与可能产生变更的命令(我们将在下一步看到)一起使用时,它会显示将要执行的操作,而不仅仅是配置。

对于 config 命令,dry-run 标志主要用于验证 docker-compose.yaml 文件的语法和结构。如果存在任何语法错误,config 命令(无论是否带 dry-run 标志)都会报告这些错误。

对可能产生变更的命令使用 dry-run 模式

在本步骤中,我们将把 dry-run 标志与 docker-compose up 这类通常会修改系统的 Docker Compose 命令结合使用。这将展示 dry-run 如何在不实际创建容器或网络的情况下,显示预期的操作行为。

不带 dry-rundocker-compose up 命令会拉取指定镜像(如果本地不存在)、创建网络并根据你的 docker-compose.yaml 文件启动容器。通过添加 dry-run 标志,我们可以查看它将要执行的步骤而无需实际运行。

首先,请确保位于正确的目录:

cd ~/project/my-compose-app

现在执行 docker-compose up --dry-run 命令:

docker-compose up --dry-run

你将看到显示 Docker Compose 将要执行操作的输出。对于我们简单的 docker-compose.yaml,输出可能类似这样:

Would create network "my-compose-app_default"
Would create service "web"
  Would pull image "nginx:latest"
  Would create container "my-compose-app-web-1"

这个输出清晰地表明 Docker Compose 计划执行以下操作:

  1. 创建名为 my-compose-app_default 的默认网络
  2. 创建名为 web 的服务
  3. 拉取 nginx:latest 镜像(如果本地尚不存在)
  4. web 服务创建名为 my-compose-app-web-1 的容器

请注意这些操作实际上都不会执行。不会创建网络、不会拉取镜像、也不会启动容器。dry-run 标志阻止了对 Docker 环境的任何实际修改。

这个功能在以下场景特别有用:

  • 预览变更:在部署复杂应用前,可以用 dry-run 准确查看 Docker Compose 将要执行的操作
  • 故障排查:当 docker-compose up 命令失败时,dry-run 能帮助你理解初始步骤并识别配置中的潜在问题
  • 学习实践:允许你尝试不同的 docker-compose.yaml 配置并观察其影响,而不会对系统造成实际改变

你也可以在其他 Docker Compose 命令(如 downstartstoprm)中使用 dry-run 标志,来查看哪些资源会受到影响。

总结

在本实验中,我们学习了如何准备一个简单的 docker-compose.yaml 文件,首先安装 Docker Compose,然后创建目录并编写包含基础 Nginx 服务定义的 YAML 文件。接着我们探索了如何在 Docker Compose 命令中使用 dry-run 标志。

我们观察到 dry-run 标志能让我们预览命令将要执行的操作,而不会对系统做出任何实际修改。这是一个非常有价值的工具,可以帮助我们在执行前测试对 docker-compose.yaml 文件的修改,并理解命令可能产生的影响。