docker stop 通过发送 SIGTERM 信号实现优雅停止,默认等待10秒让应用清理资源;可自定义超时时间(如--time=30),支持批量操作,并需容器内应用正确处理信号及配置优化。
用 docker stop 优雅停止容器,核心是让应用有时间做清理——比如关闭数据库连接、刷写缓存、保存临时状态。它不是“杀掉”进程,而是先发 sigterm 信号通知主进程准备退出,等它自己收尾完毕再结束。
默认方式:直接 stop,10 秒宽限期
执行命令即可:
docker stop my-app
Docker 会向容器内 PID 1 进程发送 SIGTERM,默认等待 10 秒。如果应用在这期间正常退出,就完成优雅关闭;超时未退出,Docker 自动补发 SIGKILL 强制终止。
自定义等待时间:适配不同应用关机耗时
有些服务(如 PostgreSQL、Elasticsearch)关机需要更长时间刷盘或同步数据,可延长宽限期:
-
docker stop --time=30 my-db(等待最多 30 秒) -
docker stop -t 60 app-server(等 60 秒,-t是--time的简写)
建议根据实际测试结果设定,避免过短导致强杀,也别过长拖慢部署节奏。
批量停止多个容器:一次处理一组
适用于 CI/CD 清理、环境重置等场景:
docker stop web-api cache-redis job-queue- 也可结合
docker ps -q获取运行中容器 ID 后批量操作:docker stop $(docker ps -q)(停所有运行中容器)
注意:批量操作前建议先用 docker ps 确认目标,防止误停关键服务。
配合容器配置提升优雅性
单靠命令还不够,容器本身要能响应 SIGTERM:
- 应用代码需注册信号处理器(如 Go 中监听
syscall.SIGTERM,Java 中加Runtime.addShutdownHook) - Dockerfile 中避免用
sh -c "xxx"启动,否则信号可能无法透传到主进程;推荐用 exec 格式:ENTRYPOINT ["./start.sh"] - 在
docker-compose.yml中显式设置宽限期:stop_grace_period: 45s
不复杂但容易忽略


















