15.4.1 容器生命周期管理
容器生命周期管理覆盖创建、启动、运行、停止与删除,是自动化与稳定运维的基础。本节通过流程图、命令示例、排错与练习,明确每一步的作用与预期结果。
原理草图:生命周期与状态流转
环境准备与安装检查(示例)
# 1) 检查 Docker 服务状态
systemctl status docker
# 2) 未安装时(以 CentOS/RHEL 为例)
yum install -y docker
systemctl enable --now docker
# 3) 验证版本
docker version
预期效果:docker version 输出客户端/服务端版本信息,systemctl status docker 为 active。
生命周期关键命令与完整示例
# 1) 拉取镜像
docker pull nginx:1.25
# 2) 创建容器(不启动)
docker create --name web01 -p 8080:80 nginx:1.25
# 解释:create 只生成容器实例,方便预配置或批量部署
# 3) 启动容器
docker start web01
# 预期:docker ps 显示 web01 运行中
# 4) 运行中进入容器执行命令
docker exec -it web01 /bin/sh -c "nginx -v"
# 解释:exec 在运行中的容器内执行命令
# 5) 暂停与恢复
docker pause web01
docker unpause web01
# 6) 优雅停止与强制终止
docker stop web01
docker kill web01
# 7) 删除容器
docker rm web01
常用命令说明速查
- docker create:仅创建容器,不启动。
- docker run:创建并启动容器(= create + start)。
- docker stop:发送 SIGTERM,等待优雅退出。
- docker kill:发送 SIGKILL,立即终止。
- docker rm:删除已停止的容器,-f 可强制删除运行中容器。
状态查看与退出码定位(示例)
# 查看容器状态与历史
docker ps -a
# 获取退出码与停止原因
docker inspect -f 'State={{.State.Status}} ExitCode={{.State.ExitCode}} OOM={{.State.OOMKilled}}' web01
预期:ExitCode=0 表示正常退出,非 0 需排查启动脚本或依赖服务。
重启策略与健康检查示例
# 创建容器时设置重启策略
docker run -d --name api01 --restart=always -p 18080:80 nginx:1.25
# Dockerfile 中定义健康检查(示例)
cat > Dockerfile <<'EOF'
FROM nginx:1.25
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD curl -fs http://localhost/ || exit 1
EOF
docker build -t nginx-health:1.0 .
docker run -d --name web02 --restart=unless-stopped -p 8081:80 nginx-health:1.0
解释:重启策略确保异常退出自动恢复;健康检查用于自动判断容器健康状态。
数据与状态管理要点(示例)
# 使用数据卷确保数据持久化
docker run -d --name db01 --restart=always \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
# 删除容器不影响宿主机目录 /data/mysql
docker stop db01 && docker rm db01
典型故障与排错步骤
# 1) 容器反复退出
docker ps -a
docker logs --tail=50 web01
docker inspect -f 'ExitCode={{.State.ExitCode}}' web01
# 2) 端口被占用导致启动失败
# 报错:bind: address already in use
ss -lntp | grep 8080
# 解决:更换端口或停止占用进程
练习
1. 创建一个 nginx:1.25 容器,映射到本地 9090 端口,设置 --restart=always,验证重启策略是否生效。
2. 故意将容器启动命令改为不存在的命令,观察 ExitCode 并通过 docker logs 找到错误原因。
3. 使用 docker pause/unpause 暂停与恢复容器,观察 docker ps 中状态变化。