如何使用 docker compose down 命令停止和移除资源

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何高效使用 docker compose down 命令来停止并移除 Docker Compose 文件中定义的资源。我们将从准备一个包含两个服务和一个网络的简单 Compose 文件开始。

完成环境搭建后,你将通过 docker compose up 命令练习启动这些服务。实验的核心内容将聚焦于使用 docker compose down 停止并移除默认资源,随后探索 -v 选项(用于移除卷)和 --rmi all 选项(用于移除镜像),展示不同级别的资源清理操作。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/ps -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/stop -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/rm -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/pull -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/rmi -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/images -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/volume -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} docker/network -.-> lab-555077{{"如何使用 docker compose down 命令停止和移除资源"}} end

准备包含服务和网络的简单 Compose 文件

在本步骤中,我们将准备一个简单的 Compose 文件来定义两个服务和一个网络。开始之前,我们需要先安装 Docker Compose,因为当前环境中并未预装该工具。

首先下载 Docker Compose 二进制文件。我们将下载兼容当前预装 Docker 版本的 1.29.2 版本:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

该命令从 GitHub 官方发布页下载 Docker Compose 二进制文件,并保存到 /usr/local/bin/docker-compose。其中 $(uname -s)$(uname -m) 会自动检测你的操作系统和架构以下载正确的二进制文件。

接着需要为下载的二进制文件添加可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

现在通过检查版本来验证安装是否成功:

docker-compose --version

你应该能在控制台看到版本信息,确认 Docker Compose 已正确安装。

安装完成后,让我们为项目创建目录并进入。我们将在 ~/project 目录下创建名为 my-compose-app 的文件夹:

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

在该目录中,我们将创建名为 docker-compose.yml 的文件,用于定义服务和网络。使用 nano 编辑器创建并编辑该文件:

nano docker-compose.yml

将以下内容粘贴到 docker-compose.yml 文件中。该文件定义了两个服务:webredis,以及一个名为 app-network 的网络:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app-network
  redis:
    image: redis:latest
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

让我们解析这个 docker-compose.yml 文件:

  • version: '3.8' 指定 Docker Compose 文件格式版本
  • services: 定义组成应用的各个服务
    • web: 定义名为 web 的服务
      • image: nginx:latest 指定该服务使用最新的 nginx 镜像(稍后我们将拉取该镜像)
      • ports: - "80:80" 将主机的 80 端口映射到 web 容器的 80 端口
      • networks: - app-networkweb 服务连接到 app-network
    • redis: 定义名为 redis 的服务
      • image: redis:latest 指定该服务使用最新的 redis 镜像(稍后我们将拉取该镜像)
      • networks: - app-networkredis 服务连接到 app-network
  • networks: 定义服务使用的网络
    • app-network: 定义名为 app-network 的网络
      • driver: bridge 指定该网络使用默认的 bridge 驱动

Ctrl + X,然后按 Y,最后按 Enter 保存文件。

在启动服务前,我们需要拉取必要的 Docker 镜像:

docker pull nginx:latest
docker pull redis:latest

这些命令会从 Docker Hub 下载指定镜像到你的本地机器。

使用 docker compose up 启动服务

在本步骤中,我们将使用 docker compose up 命令启动 docker-compose.yml 文件中定义的服务。该命令会构建、(重新)创建、启动并关联服务对应的容器。

请确保你位于创建 docker-compose.yml 文件的 ~/project/my-compose-app 目录下:

cd ~/project/my-compose-app

现在运行以下命令启动服务。我们将使用 -d 标志让容器在后台运行(detached 模式),这样不会阻塞你的终端:

docker-compose up -d

首次运行该命令时,Docker Compose 会执行以下操作:

  1. 按照 docker-compose.yml 定义创建 app-network 网络
  2. 使用 nginx:latest 镜像为 web 服务创建容器
  3. 使用 redis:latest 镜像为 redis 服务创建容器
  4. 将两个容器连接到 app-network 网络
  5. 启动这两个容器

你将看到网络和容器被创建并启动的输出信息。

要验证容器是否正在运行,可以使用 docker ps 命令:

docker ps

该命令会列出所有运行中的容器。你应该能看到两个容器:一个基于 nginx 镜像的 web 服务容器,和一个基于 redis 镜像的 redis 服务容器。容器名称通常以目录名(本例为 my-compose-app)和服务名作为前缀(例如 my-compose-app_web_1my-compose-app_redis_1)。

你也可以使用 docker network ls 命令查看 Docker Compose 创建的网络:

docker network ls

应该能看到名为 my-compose-app_app-network 的网络,这是根据 docker-compose.yml 中定义的 app-network 创建的。

最后,由于我们将 web 服务的 80 端口映射到了主机的 80 端口,你可以通过浏览器访问 LabEx 虚拟机的 IP 地址来查看默认的 Nginx 欢迎页面。或者直接在终端使用 curl 命令:

curl localhost

你将在输出中看到 Nginx 默认欢迎页面的 HTML 内容,这确认了 web 服务正在运行且可访问。

使用 docker compose down 停止并移除默认资源

在本步骤中,我们将使用 docker compose down 命令停止并移除由 docker compose up 创建的容器和网络。默认情况下,docker compose down 会移除 up 命令创建的容器和默认网络。

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

cd ~/project/my-compose-app

现在运行以下命令来停止并移除服务:

docker-compose down

运行该命令时,Docker Compose 会执行以下操作:

  1. 停止正在运行的容器(webredis
  2. 移除已停止的容器
  3. 移除由 docker compose up 创建的网络(my-compose-app_app-network

你将看到容器和网络被停止并移除的输出信息。

要验证容器是否已被移除,可以使用 docker ps -a 命令。-a 标志会显示所有容器(包括已停止的):

docker ps -a

输出中应该不再显示 my-compose-app_web_1my-compose-app_redis_1 容器。

你也可以使用 docker network ls 命令验证网络是否已被移除:

docker network ls

输出中应该不再列出 my-compose-app_app-network 网络。

请注意,docker compose down 默认不会移除卷(volumes)和镜像(images)。我们将在后续步骤中探讨如何移除这些资源。

使用 docker compose down -v 停止并移除卷

在上一步中,我们发现 docker compose down 会移除容器和网络但不会移除卷。本步骤将学习如何通过 docker compose down -v 命令同时移除卷和其他资源。

首先让我们重新启动服务以便有资源可供移除。请确保位于 ~/project/my-compose-app 目录下:

cd ~/project/my-compose-app

运行 docker compose up -d 命令以在后台启动服务:

docker-compose up -d

这将重新创建容器和网络。

现在检查是否有卷被创建。在我们的 docker-compose.yml 中,我们没有显式定义任何卷。但某些镜像(如 redis)可能会默认创建匿名卷来持久化数据。可以使用 docker volume ls 命令检查卷:

docker volume ls

你可能会看到一个名为 my-compose-app_redisdata 的卷(具体名称可能因 Docker Compose 版本和配置略有不同,但通常会以项目名和服务名作为前缀)。这是由 redis 容器创建的匿名卷。

现在使用 docker compose down -v 停止并移除服务、网络以及卷:

docker-compose down -v

-v 标志告诉 Docker Compose 移除 docker-compose.yml 文件中 volumes 部分声明的所有卷,以及附加到容器的任何匿名卷。

你将看到容器、网络和卷被停止并移除的输出信息。

使用 docker ps -a 验证容器是否已被移除:

docker ps -a

webredis 容器不应再列出。

使用 docker network ls 验证网络是否已被移除:

docker network ls

my-compose-app_app-network 不应再列出。

最后使用 docker volume ls 验证卷是否已被移除:

docker volume ls

之前列出的卷(如 my-compose-app_redisdata)应该不再出现在输出中。

使用 docker compose down --rmi all 停止并移除镜像

在前面的步骤中,我们学习了如何使用 docker compose down 停止并移除容器、网络和卷。默认情况下,docker compose down 不会移除用于创建容器的 Docker 镜像。本步骤将学习如何通过 docker compose down --rmi all 命令移除镜像。

首先让我们重新启动服务。请确保位于 ~/project/my-compose-app 目录下:

cd ~/project/my-compose-app

运行 docker compose up -d 命令以在后台启动服务:

docker-compose up -d

这将重新创建容器和网络。

现在使用 docker images 命令检查系统中的 Docker 镜像:

docker images

你应该能看到 nginxredis 镜像,以及系统中可能存在的其他镜像。

现在使用 docker compose down --rmi all 停止并移除服务、网络、卷以及镜像:

docker-compose down --rmi all -v

我们再次包含 -v 标志以确保同时移除卷。--rmi all 标志告诉 Docker Compose 移除 docker-compose.yml 文件中所有服务使用的镜像,即使这些镜像未被标记。

你将看到容器、网络、卷和镜像被停止并移除的输出信息。

使用 docker ps -a 验证容器是否已被移除:

docker ps -a

webredis 容器不应再列出。

使用 docker network ls 验证网络是否已被移除:

docker network ls

my-compose-app_app-network 不应再列出。

使用 docker volume ls 验证卷是否已被移除:

docker volume ls

与本项目相关的所有卷都不应再列出。

最后使用 docker images 验证镜像是否已被移除:

docker images

服务使用的 nginxredis 镜像应该不再出现在输出中,除非它们正被其他容器使用或具有其他标签。docker compose down --rmi all 会移除未被任何其他容器使用的镜像。

总结

在本实验中,我们学习了如何使用 docker compose down 命令来停止和移除 Docker Compose 文件中定义的资源。我们首先准备了一个包含两个服务和一个网络的简单 Compose 文件,这包括安装 Docker Compose 和创建 docker-compose.yml 文件。

在使用 docker compose up 启动服务后,我们探索了 docker compose down 的不同用法。我们首先使用基础命令来停止和移除默认资源(容器和网络)。随后,我们学习了如何使用 -v 标志移除卷,以及如何使用 --rmi all 标志移除镜像,这些操作展示了 docker compose down 命令在管理 Docker Compose 应用生命周期方面的灵活性。