1. 概述
Docker 是一种基于操作系统的容器化框架,广泛用于本地服务器和云环境中创建、管理和运行容器。Docker 提供了多种方式来停止正在运行的容器,其中最常用的两个命令是 docker stop
和 docker kill
。
本文将详细讲解这两个命令的使用方式和区别,并通过实际操作演示如何优雅或强制停止容器。
2. 理解 docker stop 与 docker kill 命令
容器的启动与停止与普通进程的启停机制并不相同。Docker 提供了 docker stop
和 docker kill
两个命令用于终止容器,虽然功能相似,但实现机制和行为有显著差异。
✅ 核心区别:
docker stop
发送的是 SIGTERM 信号,允许容器进行优雅关闭。docker kill
发送的是 SIGKILL 信号,直接强制终止容器进程。
📌 SIGTERM 是可被处理、忽略或阻塞的,容器可以借此执行清理操作(如保存状态、释放资源等);而 SIGKILL 是不可被处理或忽略的,会立即终止进程,可能导致资源未释放、数据不一致等问题。
⚠️ 注意: 使用 docker kill
有可能产生僵尸进程,因为子进程无法通知父进程自己已被终止。
3. 实际执行 docker stop 与 docker kill 命令
我们先运行一个 PostgreSQL 容器作为演示环境:
$ docker run -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung \
-p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
查看运行中的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be2848539d76 postgres "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp postgresql-baedlung
3.1. 使用 docker stop 命令
docker stop
是一种优雅停止容器的方式,它会先发送 SIGTERM 信号,如果容器在指定时间内没有响应,则自动发送 SIGKILL。
✅ 支持以下几种方式停止容器:
使用容器名称:
$ docker stop postgresql-baeldung
使用容器 ID:
$ docker stop be2848539d76
使用容器 ID 前缀(需确保唯一):
$ docker stop be
自定义等待时间(单位:秒):
$ docker stop -t 60 be2848539d76
使用
docker container stop
(旧版本命令,现已不推荐):$ docker container stop -t 60 be2848539d76
✅ 推荐使用
docker stop
,除非你确实需要立即终止容器。
3.2. 使用 docker kill 命令
docker kill
是一种更激进的方式,它直接发送 SIGKILL 信号,强制终止容器主进程。
✅ 示例:
使用容器 ID:
$ docker kill be2848539d76
使用
docker container kill
:$ docker container kill be2848539d76
⚠️ 注意: 如果容器正在写入持久化数据(如挂载了 host 的 volume),使用 docker kill
可能会导致数据损坏或文件系统异常。
4. 其他相关命令
除了 docker stop
和 docker kill
,还有其他命令可用于管理容器生命周期:
✅ docker rm - 删除容器
$ docker rm be2848539d76
该命令会立即从本地存储中删除容器。注意:必须先停止容器才能删除,否则会报错。
✅ docker pause / docker unpause - 暂停/恢复容器
$ docker pause be2848539d76
$ docker unpause be2848539d76
- 暂停容器不会释放内存资源,仅暂停 CPU。
- 容器处于暂停状态时,其进程处于挂起状态,不会继续执行。
✅ docker inspect - 查看容器状态
$ docker inspect be2848539d76
通过该命令可以查看容器的退出码(ExitCode):
docker stop
:退出码为 0,表示正常终止。docker kill
:退出码为非 0,表示强制终止。
5. 总结
命令 | 信号类型 | 是否可处理 | 是否释放资源 | 是否推荐使用 |
---|---|---|---|---|
docker stop |
SIGTERM | ✅ | ✅ | ✅ 推荐 |
docker kill |
SIGKILL | ❌ | ❌ | ❌ 仅紧急时使用 |
docker rm |
- | - | ✅ | ✅ 删除容器 |
docker pause |
- | - | ⚠️ 部分释放 | ✅ 暂停运行 |
✅ 建议:
- 正常情况下优先使用
docker stop
,避免数据丢失或资源未释放。 docker kill
仅用于docker stop
失效时,作为最后手段。- 删除容器前务必确认其状态为
Exited
。
📌 一句话总结:
docker stop
是优雅退出,docker kill
是暴力终止,选择哪种方式取决于你对容器状态的了解和对资源安全性的要求。