基于本文回答

播面 播面

文解图解播客视频,多维讲透八股文
0
评论

Docker 容器的生命周期包含哪些状态?

Docker 容器的生命周期是指容器从创建、运行、暂停、停止到最终被销毁的整个过程。

在 Docker 的底层技术(如 containerd 和 runc)中,容器的生命周期状态主要可以划分为以下 7 种状态。你可以通过 docker ps -a 命令查看容器当前处于哪种状态。

以下是这 7 种状态的详细解析:


1. Created(已创建)

  • 状态说明:容器的对象已被创建,磁盘上的容器镜像已解压并准备好读写层,但容器内的主进程(PID 1)尚未启动
  • 触发命令docker create <image>
  • 后续操作:可以使用 docker start 启动它。

2. Running(运行中)

  • 状态说明:容器的主进程正在运行,容器正在消耗 CPU、内存等系统资源,并执行其预设的任务。
  • 触发命令
    • docker run(创建并直接运行)
    • docker start(启动一个已存在的容器)
    • docker restart(重启容器)

3. Paused(已暂停)

  • 状态说明:容器中的所有进程都被挂起(暂停)。此时,容器不占用 CPU 资源,但其内存状态会被保留。这利用了 Linux 的 cgroups freezer 机制。
  • 触发命令docker pause
  • 恢复命令docker unpause(恢复到 Running 状态)

4. Exited(已停止 / 退出)

  • 状态说明:容器的主进程已经停止运行。此时容器不再占用 CPU 和内存,但容器的镜像层、读写层数据以及容器的配置信息依然保存在宿主机磁盘上。
  • 触发原因
    • 手动停止:执行 docker stop(发送 SIGTERM 信号,超时后发送 SIGKILL)或 docker kill(直接发送 SIGKILL)。
    • 自然退出:容器内部的主任务执行完毕(例如一个跑完测试的脚本)。
    • 崩溃退出:容器内程序发生错误(通常伴随非 0 的退出码,如 Exited (1))。

5. Restarting(重启中)

  • 状态说明:这是一个短暂的过渡状态。当容器因为配置了重启策略(如 --restart=always--restart=on-failure)而在崩溃后尝试自动重启时,会显示此状态。
  • 触发原因:容器异常退出,Docker 守护进程正在尝试重新拉起它。

6. Removing(删除中)

  • 状态说明:这是一个非常短暂的中间状态。Docker 正在清理容器的读写层、网络配置和元数据。
  • 触发命令docker rmdocker rm -f
  • 注意:如果容器很大或系统 I/O 极慢,可能会短暂看到这个状态。

7. Dead(已损坏 / 无法删除)

  • 状态说明:这是一种异常状态。通常发生在尝试删除(docker rm)一个正在运行的容器,或者在删除过程中由于系统 I/O 错误、文件锁占用等原因导致删除失败。
  • 处理方法:通常需要强行删除(docker rm -f)或重启 Docker 服务来清理。

状态转换图(生命周期流程)

你可以用以下简化的流向来理解它们之间的转换:

plaintext
       [ 镜像 (Image) ]
              │
              │ docker create
              ▼
         ┌──────────┐
         │ Created  │◄────────────────┐
         └────┬─────┘                 │
              │ docker start          │
              ▼                       │
         ┌──────────┐  docker stop    │
  ┌─────►│ Running  ├────────────────►┤
  │      └────┬───▲─┘                 │
  │           │   │                   │
  │     docker│   │docker             │
  │     pause │   │unpause            │
  │           ▼   │                   │
  │      ┌──────────┐                 │
  │      │  Paused  │                 │
  │      └──────────┘                 │
  │                                   │
  │ docker restart                    │ docker rm
  └───────────────────────────────────┼──────────► [ 销毁 (Destroyed) ]
                                      │
                               ┌──────┴───┐
                               │  Exited  │
                               └──────────┘

实用命令小贴士:

  • 查看所有状态的容器:docker ps -a
  • 查看正在运行的容器:docker ps
  • 过滤特定状态的容器:docker ps -f status=paused (可选状态有:created, restarting, running, removing, paused, exited, dead)