跳转到内容

Docker容器状态管理

来自代码酷


Docker容器状态管理是Docker容器操作中的核心概念,指通过命令或API对容器的生命周期状态(创建、运行、暂停、停止、删除等)进行控制和监控的过程。理解容器状态及其转换关系对于高效使用Docker至关重要。

容器状态概述[编辑 | 编辑源代码]

Docker容器在其生命周期中会经历以下主要状态:

  • Created:通过docker create创建的容器,但尚未启动
  • Running:正在运行的容器
  • Paused:被暂停的容器(进程挂起)
  • Stopped:已停止的容器(进程终止)
  • Deleted:已被删除的容器

stateDiagram-v2 [*] --> Created Created --> Running: docker start Running --> Paused: docker pause Paused --> Running: docker unpause Running --> Stopped: docker stop Stopped --> Running: docker start Stopped --> Created: docker rm Paused --> Stopped: docker stop Stopped --> [*]: docker rm

基本状态操作命令[编辑 | 编辑源代码]

查看容器状态[编辑 | 编辑源代码]

使用docker ps命令查看运行中的容器,添加-a参数查看所有状态的容器:

# 查看运行中的容器
docker ps

# 查看所有状态的容器
docker ps -a

示例输出:

CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
a1b2c3d4e5f6   nginx:latest   "nginx -g..." 2 minutes ago   Up 2 minutes               80/tcp    webserver
f6e5d4c3b2a1   ubuntu:20.04   "/bin/bash"   5 days ago      Exited (0) 5 days ago                test-container

启动与停止容器[编辑 | 编辑源代码]

# 启动已创建的容器
docker start [容器ID或名称]

# 停止运行中的容器
docker stop [容器ID或名称]

# 强制立即停止容器(发送SIGKILL)
docker kill [容器ID或名称]

暂停与恢复容器[编辑 | 编辑源代码]

暂停会冻结容器进程而不释放资源:

# 暂停运行中的容器
docker pause [容器ID或名称]

# 恢复被暂停的容器
docker unpause [容器ID或名称]

高级状态管理[编辑 | 编辑源代码]

状态转换的底层机制[编辑 | 编辑源代码]

Docker使用Linux内核特性实现状态管理:

  • 停止:发送SIGTERM信号,等待优雅终止(默认10秒后发送SIGKILL)
  • 暂停:使用cgroups freezer子系统挂起所有进程
  • 恢复:通过解析失败 (语法错误): {\displaystyle \text{thaw\_processes()}} 系统调用恢复进程

状态超时控制[编辑 | 编辑源代码]

可以自定义停止超时时间(单位:秒):

docker stop --time=30 [容器ID]

自动重启策略[编辑 | 编辑源代码]

通过--restart指定容器退出时的行为:

# 总是重启(包括手动停止)
docker run --restart=always nginx

# 仅在非0退出码时重启(最多3次)
docker run --restart=on-failure:3 nginx

状态监控与调试[编辑 | 编辑源代码]

查看容器详细状态[编辑 | 编辑源代码]

docker inspect [容器ID] --format='{{json .State}}'

示例输出:

{
  "Status": "running",
  "Running": true,
  "Paused": false,
  "Restarting": false,
  "OOMKilled": false,
  "Dead": false,
  "Pid": 1234,
  "ExitCode": 0,
  "Error": "",
  "StartedAt": "2023-05-20T08:12:33.123456789Z",
  "FinishedAt": "0001-01-01T00:00:00Z"
}

实时资源监控[编辑 | 编辑源代码]

使用docker stats查看运行中容器的实时资源占用:

docker stats [容器ID]

实际应用案例[编辑 | 编辑源代码]

案例1:Web服务的滚动更新[编辑 | 编辑源代码]

1. 启动新版本容器(状态:Running) 2. 暂停旧版本容器(状态:Paused)作为快速回滚准备 3. 验证新版本服务正常后,停止旧容器(状态:Stopped) 4. 最终删除旧容器(状态:Deleted)

案例2:批处理任务管理[编辑 | 编辑源代码]

# 创建任务容器(状态:Created)
docker create --name batch-job python:3.9 python /app/process.py

# 启动任务(状态:Running)
docker start batch-job

# 任务完成后自动停止(状态:Stopped)
# 查看退出状态确认是否成功
docker inspect batch-job --format='{{.State.ExitCode}}'

常见问题解答[编辑 | 编辑源代码]

Q:暂停和停止有什么区别?

  • 暂停(Paused)保持容器进程的内存状态,CPU暂停执行
  • 停止(Stopped)终止所有进程并释放资源

Q:如何优雅地停止容器? 最佳实践是: 1. 发送SIGTERM:docker stop 2. 等待应用处理完当前请求(建议设置适当的超时) 3. 必要时才使用docker kill

Q:容器状态异常如何排查? 检查关键字段:

  • OOMKilled:是否因内存不足被终止
  • ExitCode:非0表示异常退出
  • Error:详细的错误信息

最佳实践[编辑 | 编辑源代码]

  • 生产环境建议总是指定--restart策略
  • 关键容器停止前应保留至少30秒的优雅退出时间
  • 使用docker update可以动态修改运行中容器的资源限制和重启策略
  • 通过docker events可以监听所有状态变更事件