1. 概述

Docker 是一种基于操作系统的容器化框架,广泛用于本地服务器和云环境中创建、管理和运行容器。Docker 提供了多种方式来停止正在运行的容器,其中最常用的两个命令是 docker stopdocker kill

本文将详细讲解这两个命令的使用方式和区别,并通过实际操作演示如何优雅或强制停止容器。


2. 理解 docker stop 与 docker kill 命令

容器的启动与停止与普通进程的启停机制并不相同。Docker 提供了 docker stopdocker 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 stopdocker 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 是暴力终止,选择哪种方式取决于你对容器状态的了解和对资源安全性的要求。


原始标题:Difference Between docker stop and docker kill Commands