简介
Docker Compose 的 down
命令是 Docker 容器管理中一个必不可少的工具。本实验将指导你有效地使用 docker-compose down
来正确关闭和清理 Docker 容器、网络、卷和镜像。通过掌握这个命令,你将能够维护一个干净的 Docker 环境,并优化你的开发工作流程。
Docker Compose 的 down
命令是 Docker 容器管理中一个必不可少的工具。本实验将指导你有效地使用 docker-compose down
来正确关闭和清理 Docker 容器、网络、卷和镜像。通过掌握这个命令,你将能够维护一个干净的 Docker 环境,并优化你的开发工作流程。
在使用 docker-compose down
命令之前,我们需要确保 Docker Compose 已正确安装,并创建一个示例 Docker Compose 项目来使用。
首先,让我们检查一下 Docker Compose 在安装过程中是否已成功安装:
docker-compose version
你应该看到类似这样的输出:
Docker Compose version v2.18.1
现在,让我们创建一个简单的 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 文件定义了:
让我们启动在 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 服务正在运行,让我们来学习 docker-compose down
命令以及如何有效地使用它。
docker-compose down
命令用于停止并删除由 docker-compose up
创建的容器、网络、卷和镜像。当你不再需要它们或想要重置你的环境时,这个命令对于清理资源至关重要。
该命令的最简单形式是:
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 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 提供了额外的选项,让你更好地控制要删除的资源。在这一步中,我们将探索这些选项。
正如我们在上一步中观察到的,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
文件中定义的容器。这些被称为“孤立容器”。
为了演示这一点,让我们修改我们的 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 配置进行重大更改时,这特别有用。
你可以通过使用 help 标志来查看 docker-compose down
命令的所有可用选项:
docker-compose down --help
花点时间查看可用的选项及其描述。
现在你很好地理解了如何使用 docker-compose down
以及各种选项来控制在关闭你的 Docker Compose 环境时删除哪些资源。
现在你了解了 docker-compose down
命令及其选项,让我们探讨一些使用此命令的有效最佳实践和实际场景。
为了更好地演示实际用法,让我们创建一个更复杂的 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..."
## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans
## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f
## Remove dangling images
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 down
的基础知识 以及它默认如何删除容器和网络--volumes
、--rmi
和 --remove-orphans
,以精确控制要删除的资源通过掌握 docker-compose down
命令,你现在拥有了维护干净的 Docker 环境、防止资源泄漏和优化你的开发工作流程的知识。
记住这些关键点:
docker-compose down
命令删除容器和网络,但保留卷--volumes
来删除卷--rmi
来删除镜像--remove-orphans
清理不再在你的 Compose 文件中定义的容器有了这些技能,你现在可以更好地在你的项目中有效地管理 Docker Compose 环境。