如何使用 docker compose pull 命令更新服务镜像

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose pull 命令来更新 compose.yaml 文件中定义的服务镜像。我们将从准备一个包含 Docker 镜像服务的 compose.yaml 文件开始。

完成环境搭建后,你将探索 docker compose pull 命令的多种使用方式,包括拉取特定服务镜像、拉取所有服务镜像、忽略可构建服务拉取镜像,以及静默拉取镜像(不显示进度信息)。通过动手实践,你将掌握高效管理和更新 Docker Compose 服务镜像的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/pull -.-> lab-555087{{"如何使用 docker compose pull 命令更新服务镜像"}} docker/rmi -.-> lab-555087{{"如何使用 docker compose pull 命令更新服务镜像"}} docker/images -.-> lab-555087{{"如何使用 docker compose pull 命令更新服务镜像"}} end

准备使用镜像服务的 compose.yaml 文件

在本步骤中,我们将准备一个使用 Docker 镜像定义服务的 compose.yaml 文件。Docker Compose 是一个允许你定义和管理多容器 Docker 应用程序的工具。虽然 LabEx VM 已经安装了 Docker,但尚未安装 Docker Compose。我们将首先安装 Docker Compose。

首先,让我们安装 Docker Compose。我们将下载 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 --version

你应该会看到类似 Docker Compose version v2.20.2 的输出。

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

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

现在,我们将在此目录中创建 compose.yaml 文件。该文件将定义两个服务:使用 nginx 镜像的 web 服务和使用 redis 镜像的数据库服务。

nano compose.yaml

将以下内容粘贴到 compose.yaml 文件中:

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: redis:latest

保存文件并退出 nano 编辑器(按 Ctrl + X,然后按 Y,最后按 Enter)。

这个 compose.yaml 文件定义了两个服务:

  • web:使用 nginx:latest Docker 镜像,并将主机的 80 端口映射到容器内的 80 端口
  • db:使用 redis:latest Docker 镜像

在后续步骤中,我们将使用这个 compose.yaml 文件来拉取定义的服务镜像。

使用 docker compose pull 拉取特定服务镜像

在本步骤中,我们将学习如何使用 docker compose pull 命令拉取 compose.yaml 文件中定义的特定服务镜像。当你只需要更新或下载单个服务的镜像而不影响其他服务时,这个功能非常有用。

首先,请确保你位于 ~/project/my-compose-app 目录下,这是上一步创建 compose.yaml 文件的目录。

cd ~/project/my-compose-app

现在,让我们拉取 web 服务的镜像。执行命令格式为 docker compose pull <service_name>,在我们的案例中服务名是 web

docker compose pull web

你将看到输出信息显示 Docker Compose 正在拉取 nginx:latest 镜像。这个过程会从 Docker 仓库下载镜像的各层数据。

命令执行完成后,你可以通过列出可用的 Docker 镜像来验证 nginx 镜像是否已成功拉取。

docker images

在输出结果中,你应该能看到 nginx 镜像及其标签(latest)、镜像 ID、创建日期和大小等信息。

这演示了如何选择性地拉取 compose.yaml 文件中定义的特定服务镜像。在下一步中,我们将学习如何拉取所有服务的镜像。

拉取 compose.yaml 文件中定义的所有服务镜像

在本步骤中,我们将学习如何使用 docker compose pull 命令拉取 compose.yaml 文件中定义的所有服务镜像,而无需指定具体服务名称。这是 docker compose pull 命令在不提供服务名称时的默认行为。

首先,请确保你位于 ~/project/my-compose-app 目录下。

cd ~/project/my-compose-app

现在,执行不带任何参数的 docker compose pull 命令。

docker compose pull

该命令会读取 compose.yaml 文件并拉取其中定义的所有服务镜像。由于我们已在上一步拉取了 nginx 镜像,Docker Compose 将检查该镜像是否为最新版本。然后它会继续拉取尚未下载的 redis:latest 镜像。

你将看到输出信息显示 redis 镜像的拉取过程。

命令执行完成后,你可以通过列出可用的 Docker 镜像来验证 nginxredis 镜像是否都已成功拉取。

docker images

现在你应该能在输出结果中同时看到 nginxredis 镜像。

这演示了如何通过单个命令轻松拉取多容器应用所需的所有镜像。

使用 --ignore-buildable 标志拉取服务镜像

在本步骤中,我们将探索如何结合使用 --ignore-buildable 标志与 docker compose pull 命令。当你的 compose.yaml 文件同时包含基于 Dockerfile 构建的服务(可构建服务)和使用预构建镜像的服务时,这个标志特别有用。--ignore-buildable 标志会指示 Docker Compose 仅拉取指定了 image 键的服务镜像,而跳过指定了 build 键的服务。

首先,让我们修改 compose.yaml 文件来添加一个可构建服务。我们将添加一个构建基础镜像的简单服务。

确保你位于 ~/project/my-compose-app 目录下。

cd ~/project/my-compose-app

现在,为我们的可构建服务创建一个简单的 Dockerfile。

nano Dockerfile

将以下内容粘贴到 Dockerfile 中:

FROM alpine:latest
CMD ["echo", "Hello from buildable service!"]

保存文件并退出 nano 编辑器。

接下来,修改 compose.yaml 文件以包含使用这个 Dockerfile 的新服务。

nano compose.yaml

db 服务下方添加以下服务定义:

builder:
  build: .

现在你的完整 compose.yaml 文件应该如下所示:

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: redis:latest
  builder:
    build: .

保存文件并退出 nano 编辑器。

现在,让我们尝试使用 docker compose pull --ignore-buildable 来拉取镜像。

docker compose pull --ignore-buildable

你会观察到 Docker Compose 检查了 webdb 服务并拉取了它们的镜像(这些镜像应该已在前面的步骤中拉取过)。然而,它会忽略 builder 服务,因为该服务使用了 build 键而非 image 键。你不会看到任何与构建或拉取 builder 服务镜像相关的输出。

要确认没有为 builder 服务构建或拉取镜像,你可以列出 Docker 镜像。

docker images

你应该仍然只看到 nginxredis 镜像的列表。这个命令不会从 Dockerfile 创建新的镜像。

这演示了 --ignore-buildable 标志如何让你有选择地仅拉取预构建镜像,这在各种开发和部署场景中非常有用。

静默拉取服务镜像(不显示进度信息)

在本步骤中,我们将学习如何通过 docker compose pull 命令结合 --quiet-q 标志来静默拉取服务镜像,不显示详细的进度信息。这在需要减少终端输出量的场景(如脚本或自动化工作流)中特别有用。

首先,请确保你位于 ~/project/my-compose-app 目录下。

cd ~/project/my-compose-app

现在,我们使用 docker compose pull --quiet 命令来拉取镜像。由于 webdb 服务的镜像可能已在前面的步骤中拉取过,Docker Compose 将检查它们是否为最新版本。如果镜像已是最新,命令会快速完成且输出极少。即使需要拉取镜像,你也不会看到常规的进度条和分层信息。

docker compose pull --quiet

你会注意到输出信息比不带 --quiet 标志的 docker compose pull 命令简洁得多。可能只会看到镜像已是最新的提示,而不会显示每层的详细下载进度。

为了更清晰地演示效果,我们先删除其中一个镜像,然后静默拉取。我们将移除 redis 镜像。

docker rmi redis:latest

现在,再次使用 --quiet 标志拉取镜像。

docker compose pull --quiet

这次虽然会拉取 redis 镜像,但不会显示详细进度。输出将极为简洁,仅确认拉取操作正在进行,而不会提供常规的视觉反馈。

你可以通过列出 Docker 镜像来验证 redis 镜像是否已重新拉取。

docker images

你应该能看到 nginxredis 镜像都列在其中。

--quiet 标志是控制 docker compose pull 命令输出详细程度的简单有效方式,特别适用于不需要详细输出的环境。

总结

在本实验中,我们学习了如何使用 docker compose pull 命令来更新服务镜像。我们首先准备了定义特定 Docker 镜像服务的 compose.yaml 文件,包括安装 Docker Compose 本身。

随后,我们探索了为单个服务拉取镜像、拉取文件中定义的所有服务,以及使用选项来忽略可构建服务和抑制进度输出以实现更安静的拉取过程。