Docker容器生命周期管理图解:从创建到销毁的全流程掌控
一、容器生命周期核心状态机
1.1 六大关键状态
Created → Running ↔ Paused
↘ Stopped → Restarted
↖______↗
(通过重启策略)
二、各状态详解与操作命令
2.1 Created(已创建)
触发条件:
docker create --name my-nginx nginx:alpine
特点:
- 文件系统已初始化
- 网络命名空间未激活
- 内存未分配
查看方式:
docker ps -a --filter status=created
2.2 Running(运行中)
状态转换:
docker start my-nginx # 常规启动
docker run -d nginx:alpine # 创建并直接运行
运行时特征:
- PID 1进程保持活跃
- 绑定端口开始监听
- 可写层接受数据修改
实时监控:
docker stats my-nginx # 资源消耗
docker logs -f my-nginx # 日志追踪
2.3 Paused(暂停)
冻结操作:
docker pause my-nginx # 暂停
docker unpause my-nginx # 恢复
技术原理:
- 使用cgroup freezer子系统
- 保留内存状态
- 暂停所有进程的CPU调度
适用场景:
- 临时释放CPU资源
- 调试容器内部状态
- 热备份准备
2.4 Stopped(停止)
停止方式对比:
命令 | 信号值 | 等待时间 | 强制程度 |
---|---|---|---|
docker stop | SIGTERM | 10秒 | 优雅终止 |
docker kill | SIGKILL | 立即 | 强制杀死 |
数据持久化:
# 停止前提交修改
docker commit my-nginx my-nginx:v2
2.5 Restarted(重启)
重启策略配置:
docker run --restart=always nginx # 无条件重启
docker run --restart=on-failure:5 nginx # 最多重试5次
策略类型:
- no:不自动重启(默认)
- always:无论退出码如何
- on-failure:非0退出时重启
- unless-stopped:除非显式停止
三、生命周期管理高级技巧
3.1 容器健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康状态流转:
starting → healthy ↔ unhealthy
3.2 资源限额管理
docker run -it --memory=512m --cpus=1.5 \
--blkio-weight=500 alpine
限额类型:
- 内存硬限制(OOM Killer触发)
- CPU份额(相对权重)
- 块设备IO权重
3.3 自动清理机制
docker run --rm -it ubuntu # 退出后自动删除
docker system prune -a # 清理所有停止容器
四、状态转换实战案例
4.1 热更新流程
# 1. 启动新版本容器
docker run -d --name nginx-v2 -p 80:80 nginx:1.25
# 2. 切换流量(保留旧容器回滚能力)
iptables -t nat -R DOCKER 1 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.3:80
# 3. 停止旧容器
docker stop nginx-v1
4.2 调试冻结容器
# 1. 暂停问题容器
docker pause app-bug
# 2. 导出内存快照
docker checkpoint create app-bug bug-snapshot
# 3. 分析核心转储
gdb -c /var/lib/docker/containers/<ID>/checkpoints/bug-snapshot/dump.core
五、生命周期监控体系
5.1 事件流监听
docker events --filter 'event=die' --format '{{.ID}} {{.Status}}'
常见事件类型:
- create, start, stop, kill
- pause, unpause, restart
- die, destroy
5.2 Prometheus监控指标
# docker-compose.yml配置
services:
node-exporter:
image: prom/node-exporter
volumes:
- /sys:/host/sys:ro
- /var/run/docker.sock:/var/run/docker.sock
六、常见问题排查指南
6.1 僵尸进程处理
症状:
docker exec -it app top # 显示<defunct>进程
解决方案:
# Dockerfile添加init进程
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/app/start.sh"]
6.2 容器无法停止
强制终止组合拳:
docker kill -s SIGKILL my-container # 发送SIGKILL
docker rm -f my-container # 强制删除
附:生命周期管理速查表
操作目标 | 命令示例 | 副作用说明 |
---|---|---|
创建但不启动 | docker create nginx | 仅写入元数据 |
优雅停止 | docker stop -t 30 myapp | 预留30秒清理时间 |
强制终止 | docker kill myapp | 可能丢失数据 |
批量管理 | docker container prune | 删除所有停止的容器 |
查看历史状态 | docker inspect --format='{{.State}}' myapp | 显示完整状态机信息 |
最佳实践总结:理解容器生命周期如同掌握容器世界的生老病死规律,合理运用暂停、检查点、健康检查等机制,可大幅提升系统可靠性和运维效率。记住:每个容器都应是可牺牲的,状态管理应外置!