如何使用 docker compose rm 命令移除已停止的容器

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose rm 命令移除已停止的容器。我们将从准备一个简单的 Docker Compose 项目开始,这包括安装 Docker Compose 并创建一个 docker-compose.yml 文件来定义一个基础的 web 服务。

完成项目设置后,你将练习停止服务容器。实验的核心部分将重点介绍如何使用 docker compose rm 移除这些已停止的容器,涵盖不包含卷(volumes)、包含匿名卷(anonymous volumes)的场景,最后演示如何强制移除容器。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) 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/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555090{{"如何使用 docker compose rm 命令移除已停止的容器"}} docker/stop -.-> lab-555090{{"如何使用 docker compose rm 命令移除已停止的容器"}} docker/rm -.-> lab-555090{{"如何使用 docker compose rm 命令移除已停止的容器"}} docker/pull -.-> lab-555090{{"如何使用 docker compose rm 命令移除已停止的容器"}} docker/volume -.-> lab-555090{{"如何使用 docker compose rm 命令移除已停止的容器"}} end

准备一个简单的 Docker Compose 项目

在这一步中,我们将准备一个简单的 Docker Compose 项目。由于 LabEx 环境没有预装 Docker Compose,我们需要先安装它。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,你可以使用 YAML 文件来配置应用服务,然后只需一条命令就能根据配置创建并启动所有服务。

首先,我们来安装 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 已正确安装。

现在,让我们创建一个简单的 Docker Compose 项目。我们将为项目创建一个目录,然后在其中创建 docker-compose.yml 文件。该文件将使用 nginx 镜像定义一个简单的 web 服务。

进入项目目录:

cd ~/project

为我们的项目创建一个新目录,例如 my-web-app

mkdir my-web-app
cd my-web-app

现在,使用 nano 编辑器创建 docker-compose.yml 文件:

nano docker-compose.yml

将以下内容添加到 docker-compose.yml 文件中:

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

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

Ctrl + X,然后按 YEnter 保存文件。

现在,我们可以使用 docker-compose up 命令启动 docker-compose.yml 文件中定义的服务。-d 参数表示以分离模式运行容器,即容器将在后台运行。

docker-compose up -d

该命令将拉取 nginx:latest 镜像(如果尚未存在),并为 web 服务启动一个容器。

你可以使用 docker ps 命令检查运行中的容器状态:

docker ps

你应该能看到一个名为 my-web-app_web_1(或类似名称,取决于目录名)的容器正在运行,并转发 80 端口。

要验证 web 服务器是否正常运行,可以使用 curl 访问它:

curl http://localhost

你应该能在输出中看到默认的 Nginx 欢迎页面 HTML。这确认了我们的简单 Docker Compose 项目已正确设置并运行。

停止服务容器

在上一步中,我们使用 docker-compose up -d 启动了简单的 web 服务。容器目前正在后台运行。本步骤将学习如何使用 Docker Compose 停止正在运行的服务容器。

要停止 docker-compose.yml 文件中定义的运行中容器,我们使用 docker-compose stop 命令。该命令会向容器发送 SIGTERM 信号,使其能够优雅地关闭。

请确保你位于包含 docker-compose.yml 文件的 ~/project/my-web-app 目录中。

cd ~/project/my-web-app

现在执行 docker-compose stop 命令:

docker-compose stop

你将看到容器正在停止的输出信息。

运行 stop 命令后,容器会被停止但不会被移除。你可以使用 docker ps -a 命令列出所有容器(包括已停止的)来验证这一点。

docker ps -a

你应该能看到 my-web-app_web_1 容器显示为 Exited 状态,这确认容器已成功停止。

如果再次尝试使用 curl 访问 web 服务器,应该会失败,因为容器已停止。

curl http://localhost

你将看到连接被拒绝的错误,表明 web 服务已停止运行。

当你需要临时暂停服务而不移除其配置或数据时,停止容器非常有用。在接下来的步骤中,我们将探讨如何移除这些已停止的容器。

移除已停止的服务容器(不包含卷)

在上一步中,我们使用 docker-compose stop 停止了运行中的容器。该容器目前处于 Exited 状态。本步骤将学习如何使用 Docker Compose 移除这些已停止的容器。

要移除 docker-compose.yml 文件中定义的已停止容器,我们使用 docker-compose rm 命令。默认情况下,该命令仅移除已停止的服务容器,不会移除卷(volumes)或网络(networks)。

请确保你位于包含 docker-compose.yml 文件的 ~/project/my-web-app 目录中。

cd ~/project/my-web-app

现在执行 docker-compose rm 命令。系统会提示你确认移除操作,输入 y 并按 Enter 键。

docker-compose rm

你将看到容器正在被移除的输出信息。

运行 rm 命令后,容器应该已被移除。你可以使用 docker ps -a 命令列出所有容器(包括已停止的)来验证这一点。

docker ps -a

你应该不会再在列表中看到 my-web-app_web_1 容器,这确认容器已成功移除。

移除已停止的容器有助于清理系统并释放资源。在接下来的步骤中,我们将探讨移除容器时如何处理卷。

移除已停止的服务容器及其匿名卷

在上一步中,我们移除了已停止的容器。现在,让我们学习如何移除容器及其关联的匿名卷。匿名卷是指在 docker-compose.yml 文件中未显式命名的卷,Docker 会自动为它们分配随机名称。

首先,我们需要修改 docker-compose.yml 文件来包含一个匿名卷。我们将在 web 服务中添加一个卷。

请确保你位于 ~/project/my-web-app 目录中。

cd ~/project/my-web-app

编辑 docker-compose.yml 文件。

nano docker-compose.yml

web 服务定义中添加 volumes 部分。我们将把一个匿名卷挂载到容器内的 /usr/share/nginx/html 目录,这是 Nginx 提供默认内容的位置。

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /usr/share/nginx/html

Ctrl + X,然后输入 Y 并按 Enter 保存文件。

现在,让我们再次启动服务。这将创建一个新容器和一个匿名卷。

docker-compose up -d

你可以使用 docker volume ls 命令列出 Docker 创建的卷。你应该会看到一个带有长随机名称的卷,它与你的项目相关联。

docker volume ls

现在,再次停止服务容器。

docker-compose stop

使用 docker ps -a 验证容器是否已停止。

docker ps -a

你应该会看到 my-web-app_web_1 容器处于 Exited 状态。

要移除已停止的容器及其关联的匿名卷,我们需要使用带 -v 标志的 docker-compose rm 命令。

docker-compose rm -v

系统会提示你确认移除操作,输入 y 并按 Enter 键。

运行命令后,使用 docker ps -a 验证容器是否已被移除。

docker ps -a

my-web-app_web_1 容器应该不再出现在列表中。

现在,再次使用 docker volume ls 检查卷。

docker volume ls

web 服务创建的匿名卷也应该被移除了。这演示了 -v 标志如何同时移除容器及其匿名卷。

强制移除已停止的服务容器

在前面的步骤中,我们停止并移除了容器。有时你可能需要移除仍在运行的容器,这时强制移除选项就派上用场了。

首先,让我们再次启动服务。

请确保你位于 ~/project/my-web-app 目录中。

cd ~/project/my-web-app

以分离模式启动服务。

docker-compose up -d

使用 docker ps 验证容器是否正在运行。

docker ps

你应该会看到 my-web-app_web_1 容器显示为 Up 状态。

现在,让我们尝试在不先停止容器的情况下移除它。如果你尝试对运行中的容器使用 docker-compose rm,操作将会失败。

docker-compose rm

你将看到错误信息,提示容器正在运行无法移除。

要强制移除运行中的容器,我们需要使用带 -f 标志的 docker-compose rm 命令。这个标志会强制移除容器,既不需要确认也不会优雅地停止容器。

docker-compose rm -f

你将看到容器正在被移除的输出信息。注意这次系统没有要求确认。

运行命令后,使用 docker ps -a 验证容器是否已被移除。

docker ps -a

my-web-app_web_1 容器应该不再出现在列表中。这确认了容器即使正在运行也被强制移除了。

使用强制移除选项时需要谨慎,因为如果容器正在向未显式管理的卷写入数据,可能会导致数据丢失。

至此我们完成了 Docker Compose 服务容器移除的探索。你已经学会了如何停止容器、移除不带卷的已停止容器、移除带匿名卷的已停止容器,以及强制移除运行中的容器。

总结

在本实验中,我们学习了如何使用 docker compose rm 命令移除已停止的容器。我们首先准备了一个简单的 Docker Compose 项目,包括安装 Docker Compose 和创建 docker-compose.yml 文件来定义一个使用 Nginx 镜像的基础 web 服务。

随后我们练习了停止服务容器并使用 docker compose rm 移除它们的操作。我们探索了多种场景,包括移除不带卷的已停止容器、移除带匿名卷的已停止容器,以及使用强制选项移除容器。这些实践操作展示了 docker compose rm 命令在管理 Docker Compose 项目中容器生命周期的实际应用。