介绍
Docker Compose Down 命令是 Docker 容器管理中的一项核心工具。本实验将指导你如何高效使用 docker-compose down 来正确停止并清理 Docker 容器、网络、数据卷和镜像。掌握该命令后,你将能够维护整洁的 Docker 环境并优化开发工作流。
安装 Docker Compose 并创建示例项目
在此步骤中,我们将确保 Docker Compose 已正确安装,并创建一个示例 Docker Compose 项目以供后续操作。
验证 Docker Compose 安装
首先,让我们检查在环境设置过程中是否已成功安装 Docker Compose:
docker-compose version
你应该会看到类似以下的输出(具体的构建详情可能有所不同):
docker-compose version 1.29.2, build unknown
创建简单的 Docker Compose 文件
现在,让我们创建一个简单的 Docker Compose 文件,在整个实验中我们将使用它。我们将在当前目录下创建一个名为 docker-compose.yml 的文件,其中包含一个基于 Nginx 的基础 Web 服务。
使用 nano 编辑器创建该文件:
cd ~/project/docker-compose-demo
nano docker-compose.yml
将以下内容复制并粘贴到编辑器中:
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
db:
image: redis:latest
volumes:
- db_data:/data
volumes:
web_data:
db_data:
按 Ctrl+O 保存文件,按 Enter 确认,然后按 Ctrl+X 退出。
此 Docker Compose 文件定义了:
- 一个使用 Nginx 镜像的 Web 服务
- 一个使用 Redis 的数据库服务
- 两个用于持久化数据存储的命名数据卷
启动 Docker Compose 服务
让我们启动 Docker Compose 文件中定义的服务:
docker-compose up -d
-d 参数以分离模式(后台运行)启动容器。你应该会看到类似以下的输出:
Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
验证运行中的容器
让我们检查容器是否正在运行:
docker-compose ps
你应该会看到输出显示两个服务均已启动并运行:
Name Command State Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1 docker-entrypoint.sh redis ... Up 6379/tcp
docker-compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8080->80/tcp
你还可以使用 curl 检查 Nginx Web 服务器是否可访问:
curl http://localhost:8080
你应该会看到默认的 Nginx 欢迎页面 HTML 输出。
现在服务已经启动并运行,我们准备在下一步中学习 docker-compose down 命令。
理解并使用 Docker Compose Down
在此步骤中,既然我们的 Docker Compose 服务正在运行,我们将学习 docker-compose down 命令以及如何高效使用它。
什么是 Docker Compose Down?
docker-compose down 命令用于停止并移除由 docker-compose up 创建的容器、网络、数据卷和镜像。当你不再需要这些资源或想要重置环境时,该命令对于清理资源至关重要。
Docker Compose Down 的基本用法
该命令最简单的形式是:
docker-compose down
让我们运行此命令并观察会发生什么:
cd ~/project/docker-compose-demo
docker-compose down
你应该会看到类似以下的输出:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
请注意,该命令执行了以下操作:
- 停止 Docker Compose 文件中定义的所有运行中容器
- 移除所有容器
- 移除由 Docker Compose 创建的网络
但是,默认情况下它不会移除数据卷。理解这一点很重要:数据卷的生命周期独立于容器,以保留你的数据。
验证资源已被移除
让我们确认容器和网络已被移除:
docker-compose ps
你应该会看到一个空列表,表明该 Docker Compose 项目中没有正在运行的容器。
让我们检查数据卷是否仍然存在:
docker volume ls | grep docker-compose-demo
你应该会看到数据卷依然存在:
local docker-compose-demo_db_data
local docker-compose-demo_web_data
这种默认行为非常重要,因为它可以在容器重启后保留你的数据。如果你也想移除这些数据卷,则需要使用额外的选项,我们将在下一步中介绍。
再次启动服务
让我们再次启动服务,因为下一步还需要用到它们:
docker-compose up -d
你应该会看到:
Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
请注意,Docker Compose 不需要重新创建数据卷,因为它们已经存在。
现在你已经了解了 docker-compose down 的基本用法。在下一步中,我们将探索更高级的选项来精确控制要移除的资源。
使用 Docker Compose Down 的高级选项
基本的 docker-compose down 命令很有用,但 Docker Compose 提供了额外的选项,让你能更精细地控制要移除的资源。在此步骤中,我们将探索这些选项。
移除数据卷
正如我们在上一步中观察到的,docker-compose down 默认不会移除数据卷。这是一种安全特性,旨在防止意外的数据丢失。然而,有时你确实需要移除数据卷,例如在进行彻底清理或想要重置应用程序数据时。
要连同容器和网络一起移除数据卷,请使用 --volumes 参数:
docker-compose down --volumes
让我们试一下:
cd ~/project/docker-compose-demo
docker-compose down --volumes
你应该会看到类似以下的输出:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data
请注意,这次数据卷也被移除了。
让我们验证数据卷是否已被移除:
docker volume ls | grep docker-compose-demo
你应该看不到任何输出,这确认了数据卷已被移除。
移除镜像
另一个有用的选项是在关闭 Docker Compose 环境时移除镜像。这可以通过 --rmi 参数实现,它接受不同的值:
--rmi all:移除任何服务使用的所有镜像--rmi local:仅移除没有自定义标签的镜像
让我们再次启动服务,然后使用 --rmi 参数:
docker-compose up -d
等待服务启动,然后使用 --rmi 参数将其关闭:
docker-compose down --rmi local
你应该会看到类似以下的输出:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest
这次,镜像也被移除了。
移除孤立容器
有时,你可能会有一些由 Docker Compose 创建但不再定义在当前 docker-compose.yml 文件中的容器。这些被称为「孤立容器」(orphan containers)。
为了演示这一点,让我们修改 Docker Compose 文件以移除 db 服务:
nano docker-compose.yml
编辑文件以移除 db 服务及其数据卷:
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
volumes:
web_data:
保存并退出编辑器(Ctrl+O, Enter, Ctrl+X)。
现在,让我们使用更新后的文件再次启动服务:
docker-compose up -d
如果我们之前有一个未正确停止的 db 服务容器在运行,它现在就会被视为孤立容器。我们可以使用 --remove-orphans 参数移除此类孤立容器:
docker-compose down --remove-orphans
这确保了任何由旧版本 Docker Compose 文件创建但不再定义的容器也会被移除。
组合使用选项
你还可以组合使用这些选项以进行彻底清理:
docker-compose down --volumes --rmi all --remove-orphans
此命令将:
- 停止并移除所有容器
- 移除所有命名数据卷
- 移除任何服务使用的所有镜像
- 移除所有孤立容器
当你想要彻底重置环境,或者准备对 Docker Compose 配置进行重大更改时,这特别有用。
探索更多选项
你可以通过帮助参数查看 docker-compose down 命令的所有可用选项:
docker-compose down --help
花点时间查看可用的选项及其描述。
现在你已经很好地掌握了如何使用带有各种选项的 docker-compose down 来控制关闭 Docker Compose 环境时要移除的资源。
最佳实践与实际场景
在此步骤中,既然你已经了解了 docker-compose down 命令及其选项,我们将探索高效使用该命令的最佳实践和实际场景。
创建更复杂的 Docker Compose 环境
为了更好地演示实际用法,让我们创建一个更复杂的 Docker Compose 环境。我们将设置一个包含前端、后端和数据库的简单 Web 应用程序。
cd ~/project/docker-compose-demo
nano docker-compose.yml
将内容替换为:
version: "3"
services:
frontend:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- frontend_data:/usr/share/nginx/html
networks:
- app_network
backend:
image: node:14-alpine
command: sh -c "echo 'Backend service running' && sleep infinity"
volumes:
- backend_data:/app
networks:
- app_network
- db_network
database:
image: postgres:13-alpine
environment:
POSTGRES_PASSWORD: example
POSTGRES_USER: user
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
networks:
- db_network
networks:
app_network:
db_network:
volumes:
frontend_data:
backend_data:
db_data:
保存并退出编辑器。
让我们启动这个更复杂的环境:
docker-compose up -d
你应该会看到输出显示所有三个服务的网络、数据卷和容器的创建过程。
最佳实践:使用环境
在实际场景中,你可能拥有开发、测试和生产等不同的环境。Docker Compose 允许你为不同环境使用不同的配置文件。
创建一个开发环境文件:
nano docker-compose.dev.yml
添加以下内容:
version: "3"
services:
frontend:
ports:
- "8081:80"
environment:
NODE_ENV: development
backend:
environment:
NODE_ENV: development
DEBUG: "true"
database:
ports:
- "5432:5432"
保存并退出编辑器。
要将此文件与基础文件结合使用,可以使用 -f 参数:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
这将合并配置,应用开发特定的设置。
要关闭此环境,你可以使用:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml down
最佳实践:使用清理脚本
在持续集成/部署 (CI/CD) 流水线或开发工作流中,拥有一个能移除所有 Docker 资源的清理脚本通常很有用。让我们创建一个简单的清理脚本:
nano cleanup.sh
添加以下内容:
#!/bin/bash
echo "Cleaning up Docker environment..."
## 停止并移除容器、网络、数据卷和镜像
docker-compose down --volumes --rmi all --remove-orphans
## 移除悬空数据卷
echo "Removing dangling volumes..."
docker volume prune -f
## 移除悬空镜像
echo "Removing dangling images..."
docker image prune -f
echo "Cleanup complete!"
保存并退出编辑器。
使脚本可执行:
chmod +x cleanup.sh
现在,每当你需要进行彻底清理时,都可以运行此脚本:
./cleanup.sh
最佳实践:选择性移除资源
有时你可能只想移除特定的资源。例如,你可能想保留数据卷(以保存数据),但移除容器、网络和镜像。
以下是针对不同场景的处理方法:
仅移除容器和网络(保留数据卷和镜像):
docker-compose down
移除容器、网络和镜像(保留数据卷):
docker-compose down --rmi all
移除容器、网络和数据卷(保留镜像):
docker-compose down --volumes
仅移除本地镜像(非从仓库拉取的镜像):
docker-compose down --rmi local
通过选择性地移除资源,你可以根据具体需求优化工作流。
最佳实践:监控资源使用情况
在运行 docker-compose down 前后,监控 Docker 资源使用情况通常很有帮助。这可以帮助你识别未被正确清理的资源。
以下是一些有用的命令:
列出所有容器(包括已停止的):
docker ps -a
列出所有网络:
docker network ls
列出所有数据卷:
docker volume ls
列出所有镜像:
docker image ls
获取系统级信息:
docker system df
让我们尝试最后一个命令来查看当前的资源使用情况:
docker system df
你将看到 Docker 资源使用情况的摘要,包括容器、镜像、数据卷的数量以及使用的总空间。
关闭我们的复杂环境
现在,让我们关闭复杂环境并移除所有相关资源:
docker-compose down --volumes --rmi all --remove-orphans
这将停止并移除与我们的 Docker Compose 项目相关的所有容器、网络、数据卷和镜像。
通过遵循这些最佳实践,你可以高效地管理 Docker 环境并确保资源使用的最优化。
总结
在本实验中,你学习了如何高效使用 docker-compose down 命令来管理 Docker 容器和资源。以下是你所学内容的总结:
- 安装了 Docker Compose 并创建了一个简单的 Docker Compose 环境
- 学习了
docker-compose down的基础知识,以及它如何默认移除容器和网络 - 探索了高级选项,如
--volumes、--rmi和--remove-orphans,以精确控制要移除的资源 - 实施了最佳实践,以便在实际场景中使用 Docker Compose,包括:
- 使用特定于环境的配置文件
- 创建清理脚本
- 选择性地移除资源
- 监控资源使用情况
通过掌握 docker-compose down 命令,你现在具备了维护整洁 Docker 环境、防止资源泄漏以及优化开发工作流的知识。
请记住以下关键点:
- 基本的
docker-compose down命令会移除容器和网络,但会保留数据卷 - 当你想重置数据时,使用
--volumes来移除数据卷 - 当你需要释放磁盘空间时,使用
--rmi来移除镜像 - 使用
--remove-orphans来清理 Compose 文件中不再定义的容器 - 在需要时组合使用这些选项进行彻底清理
掌握了这些技能,你现在能够更高效地管理项目中的 Docker Compose 环境。



