跳至主要内容

停止所有 Docker 容器:分步指南

了解如何通过简单命令停止所有正在运行的 Docker 容器。这将帮助您管理系统资源并优化 Docker 环境。
· 5分钟 阅读

使用 AI 探索

逐个停止容器会拖慢您的开发流程,在同时处理微服务或多容器应用时还容易出错。

在本指南中,我将介绍多种方法,帮助您一次性终止所有正在运行的容器。

完成本教程后,您将能够:

  • 了解 Docker 如何处理信号与宽限期
  • 使用简单的 CLI 技巧和过滤器停止所有容器
  • 借助 Docker Compose 和自定义别名,优化工作流

理解 Docker 容器的终止机制

在批量停止容器之前,了解d Docker Docker 在底层如何编排关停会很有帮助。

基于信号的进程管理

Docker 使用 Unix 信号先请求优雅关停,再在必要时强制终止。docker stop 命令的默认行为是:

  1. 向容器的主进程发送 SIGTERM。
  2. 等待最多 10 秒(可通过 -t/--time 配置)。
  3. 若进程仍未退出,则发送 SIGKILL。
  • SIGTERM:礼貌地请求进程清理并退出。
  • 宽限期:为应用留出时间刷写日志、关闭连接或保存状态。
  • SIGKILL:对无响应的进程进行立即强制终止。

时间线展示 Docker stop 的信号序列:SIGTERM,等待,然后 SIGKILL。

命令行界面(CLI)机制

默认情况下,docker stop 一次处理一个容器。您可以利用 shell 特性扩展为一次停止多个容器。

# Stop a single container named my_container
docker stop my_container

这会向 my_container 发送 SIGTERM,并在默认的 10 秒后(如有需要)发出 SIGKILL。

# Stop all running containers at once
docker stop $(docker ps -q)

此处,docker ps -q 列出所有正在运行容器的 ID;这些 ID 会被传递给 docker stop,随后顺序关停各容器。

终端会话中将 docker ps -q 的输出传入 docker stop 以关闭所有容器。

终端截图展示将 docker ps -q 的输出传入 docker stop

若想更深入理解这些概念,可查看容器化与虚拟化概念。

对比 docker stop 与 docker kill

在优雅终止与强制终止之间做出选择,有助于避免意外后果。

优雅终止 vs. 立即终止

命令

信号

行为

适用场景

docker stop

SIGTERM → 超时后 SIGKILL

带清理时间的优雅关停

日常维护或更新

docker kill

SIGKILL

立即终止

应对卡死容器的紧急处置

自定义信号

这两个命令都支持使用 --signal 标志覆盖默认值:

# Send SIGINT instead of SIGTERM
docker stop --signal=SIGINT my_container

上述方式允许进程捕获 SIGINT 以执行自定义清理。

# Kill all containers with SIGUSR1
docker kill --signal=SIGUSR1 $(docker ps -q)

如上所示,当您的应用实现了特定的关停钩子时,可以使用自定义信号。

高级容器停止策略

通过过滤与自动化停止容器,可以更精准地执行 DevOps 工作流,尤其适用于大规模环境。

在掌握基础之后,您可以微调要停止的容器范围,以及如何实现自动化。

按条件过滤终止容器

通过过滤器,您可以按镜像名、状态或标签等属性定位容器:

# Stop containers running the my_image:latest image
docker stop $(docker ps --filter "ancestor=my_image:latest" -q)

上述命令仅停止基于 my_image:latest 的容器,在多服务项目中提供更有针对性的控制。

适用场景:

  • 按镜像标签停止测试容器(--filter "ancestor=test:latest")
  • 按标签停止容器(--filter "label=env=dev")

在停止容器之前按上游镜像名过滤 docker ps 输出。

docker ps --filter 用法的终端截图

使用 Docker Compose 的自动化清理

如果您的服务定义在 docker-compose.yml 文件中,一个命令即可停止所有相关容器:

docker-compose stop

这将遵循服务依赖关系与已配置的超时时间,实现干净的关停。

若需更进阶的技巧,您可以考虑 Intermediate Docker 课程。

基于别名的工作流优化

对于重复性任务,使用 shell 别名可减少输入并降低上下文切换成本:

# Add this to ~/.bashrc or ~/.zshrc
alias ds='docker stop $(docker ps -q)'

重新加载 shell 后,运行 ds 即可一键停止所有容器——非常适合快速清理。

终端展示在 Ubuntu WSL 中使用自定义 'ds' 别名成功停止所有正在运行的 Docker 容器。

在 Ubuntu WSL 中使用 'ds' 别名停止所有正在运行的容器

运维最佳实践

实施安全的关停流程与定期清理,能让您的环境保持稳定与高性能。

  • 在应用代码中实现信号处理器,以关闭连接并刷写日志。
  • 将 docker kill 保留用于紧急干预;以避免数据不一致。
  • 根据应用的清理需求调整宽限期(-t/--time)。
  • 使用 Docker Prune:完整指南与上手示例 中介绍的 docker system prune 等命令,自动化关停后的清理。
  • 记录关停事件(时间戳与退出码),以便诊断终止问题。

常见问题排查

即使是看似简单的命令也可能出现问题——以下是应对方法。

僵尸进程与孤立卷

强制终止可能遗留陈旧进程或孤立卷,占用宿主机资源与磁盘空间。要进行清理:

# Remove dangling volumes
docker volume prune

这会删除未被任何容器引用的全部卷。

检查是否存在残留的 Docker 守护进程:

ps aux | grep dockerd

如仍有残留的 dockerd 子进程,请手动终止。

真实案例:在一个项目中,我在一次迁移卡住时对数据库容器使用了 docker kill。由于突然终止,数据库未能刷写事务日志,导致 InnoDB 表损坏。我们不得不从备份恢复并回放 binlog,造成超过 30 分钟的停机。为避免此类情况,请优先使用带延长超时的 docker stop,或在应用中添加适当的 SIGTERM 处理器。

权限被拒绝错误

在没有适当权限的情况下运行 Docker 命令通常会报错:

  • 在命令前添加 sudo,或使用属于 docker 组的用户运行。
  • 将您的用户加入 docker 组并重新登录:
sudo usermod -aG docker $USER

退出并重新登录后,您即可在无需 sudo 的情况下运行 Docker 命令。在 CI 环境中,请确保运行器用户加入了 Docker 组,以避免流水线失败。

Windows 专项注意事项

在 Windows PowerShell 中,请用圆括号包裹子命令,并以管理员身份运行:

docker stop (docker ps -q)

以提升权限启动 PowerShell 可避免防火墙或访问控制问题。若遇到 TLS 握手错误,请验证 Docker Desktop 的守护进程配置与 PowerShell 环境是否匹配。

结语

高效停止所有 Docker 容器可以节省时间、节约资源,并减少开发流程中的人为错误。通过理解 Docker 的信号处理、利用 CLI 过滤器、使用 Docker Compose,以及编写简洁的别名,您可以保持一个干净、可预测的环境。

想要深入学习容器化,可探索 使用 Docker 与 Kubernetes 的容器化与虚拟化学习路径,或 Intermediate Docker 课程。

祝您容器化顺利——让 Docker 工作流更干净、更高效!

FAQs

docker stop 返回什么退出码?

成功时,docker stop 返回 0。非零退出码表示一个或多个容器未能停止。

在运行命令之前,我能预览将被停止的容器吗?

可以——在执行 docker stop 之前,运行 docker ps 或 docker ps -q 列出正在运行的容器并确认 ID 或名称。

重启策略对已停止的容器有何影响?

具有 always 等重启策略的容器在停止后会自动重启。若希望它们保持停止状态,请使用 docker update --restart=no <container> 移除或修改策略。

有没有办法按网络或卷来停止容器?

虽然 Docker 不能直接在 docker stop 上按网络或卷进行过滤,但您可以结合 docker ps --filter "network=<name>" 或 docker ps --filter "volume=<name>" 与命令替换来实现。

如何将 docker stop 集成到 CI/CD 流水线中?

将 stop 命令纳入构建脚本或 CI 作业——使用 --signal 与过滤器进行定向关停,随后在同一流水线中执行清理命令(docker system prune)。

之后我能重启所有已停止的容器吗?

可以,使用 docker start $(docker ps -a -q) 可重启所有容器,包括之前已停止的。

停止所有容器会将其移除吗?

不会,停止容器不会删除它们。它们会保留在系统中,直到您使用 docker rm 将其移除。

如何实现每日自动停止容器?

使用 cron 任务配合命令 docker stop $(docker ps -q),即可按日程自动停止。

docker stop 会影响卷或网络吗?

不会,停止容器不会影响已挂载的卷或网络——它们会保持不变。

我可以排除某些容器不被停止吗?

您可以通过带过滤器的 docker ps,或在命令中排除特定容器 ID,来选择性地停止容器。

除了 CLI 命令,还有哪些工具可以帮助管理容器?

Portainer 或 Docker Desktop 等工具提供基于图形界面的管理功能,对初学者更友好。

Khalid Abdelaty

作者

Khalid Abdelaty

我是一名数据工程师兼社区建设者,专注于数据管道、云端与 AI 工具链,同时为 DataCamp 和新兴开发者撰写实用且高影响力的教程。

主题