介绍
在本实验中,你将学习如何使用 docker compose rm 命令移除已停止的容器。我们将从准备一个简单的 Docker Compose 项目开始,这包括安装 Docker Compose 并创建一个 docker-compose.yml 文件来定义一个基础的 web 服务。
完成项目设置后,你将练习停止服务容器。实验的核心部分将重点介绍如何使用 docker compose rm 移除这些已停止的容器,涵盖不包含卷(volumes)、包含匿名卷(anonymous volumes)的场景,最后演示如何强制移除容器。
准备一个简单的 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,然后按 Y 和 Enter 保存文件。
现在,我们可以使用 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 项目中容器生命周期的实际应用。



