介绍
在本实验中,你将学习如何使用 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-compose。chmod +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-run 的 docker-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 计划执行以下操作:
- 创建名为
my-compose-app_default的默认网络 - 创建名为
web的服务 - 拉取
nginx:latest镜像(如果本地尚不存在) - 为
web服务创建名为my-compose-app-web-1的容器
请注意这些操作实际上都不会执行。不会创建网络、不会拉取镜像、也不会启动容器。dry-run 标志阻止了对 Docker 环境的任何实际修改。
这个功能在以下场景特别有用:
- 预览变更:在部署复杂应用前,可以用
dry-run准确查看 Docker Compose 将要执行的操作 - 故障排查:当
docker-compose up命令失败时,dry-run能帮助你理解初始步骤并识别配置中的潜在问题 - 学习实践:允许你尝试不同的
docker-compose.yaml配置并观察其影响,而不会对系统造成实际改变
你也可以在其他 Docker Compose 命令(如 down、start、stop 和 rm)中使用 dry-run 标志,来查看哪些资源会受到影响。
总结
在本实验中,我们学习了如何准备一个简单的 docker-compose.yaml 文件,首先安装 Docker Compose,然后创建目录并编写包含基础 Nginx 服务定义的 YAML 文件。接着我们探索了如何在 Docker Compose 命令中使用 dry-run 标志。
我们观察到 dry-run 标志能让我们预览命令将要执行的操作,而不会对系统做出任何实际修改。这是一个非常有价值的工具,可以帮助我们在执行前测试对 docker-compose.yaml 文件的修改,并理解命令可能产生的影响。



