15.1.4 Docker对象模型与生命周期
Docker对象模型与生命周期#
Docker对象模型由镜像(Image)、容器(Container)、数据卷(Volume)、网络(Network)、仓库(Registry)构成,围绕“构建—分发—运行—管理”的闭环。理解对象与生命周期,是定位故障、清理资源、设计部署的基础。
原理草图:对象关系
1. 对象属性与关键命令(含解释)#
镜像 Image
- 分层、只读、不可变;使用 tag 和 digest 管理版本。
# 查看镜像与层信息
docker images
docker history nginx:1.25
# 为镜像打标签(用于版本管理与分发)
docker tag nginx:1.25 registry.example.com/ops/nginx:1.25
容器 Container
- 镜像+读写层+运行时配置;隔离进程、网络、文件系统与资源。
# 创建但不启动(created)
docker create --name web -p 8080:80 nginx:1.25
# 启动容器(running)
docker start web
# 查看容器详细配置(含网络、挂载、资源)
docker inspect web
数据卷 Volume
- 脱离容器生命周期,适合持久化与共享。
# 创建数据卷
docker volume create webdata
# 运行并挂载数据卷
docker run -d --name web2 -v webdata:/usr/share/nginx/html nginx:1.25
网络 Network
- 提供通信边界与容器服务发现。
# 创建自定义网络
docker network create --subnet 172.20.0.0/16 appnet
# 让容器加入网络并验证IP
docker run -d --name app1 --network appnet nginx:1.25
docker inspect app1 | grep -A3 "Networks"
仓库 Registry
- 镜像分发与版本控制。
# 登录仓库
docker login registry.example.com
# 推送镜像
docker push registry.example.com/ops/nginx:1.25
2. 生命周期主线与状态机#
容器状态机
生命周期命令示例(含预期效果)
# 运行一个测试容器(created -> running)
docker run -d --name demo nginx:1.25
# 暂停/恢复(running -> paused -> running)
docker pause demo
docker unpause demo
# 停止(running -> stopped)
docker stop demo
# 删除(stopped -> deleted)
docker rm demo
3. 示例:构建—分发—运行—清理全流程#
示例目标:构建一个简单镜像并运行,验证对象生命周期
# 1) 准备目录
mkdir -p /opt/docker-demo && cd /opt/docker-demo
# 2) 创建Dockerfile
cat > Dockerfile <<'EOF'
FROM alpine:3.19
LABEL maintainer="ops@example.com"
RUN echo "Hello Docker" > /msg.txt
CMD ["cat","/msg.txt"]
EOF
# 3) 构建镜像
docker build -t demo/hello:1.0 .
# 4) 运行容器并查看输出
docker run --rm demo/hello:1.0
# 预期输出:
# Hello Docker
命令解释
- docker build -t:构建镜像并指定标签。
- docker run --rm:运行后自动删除容器,避免残留。
- CMD:容器启动时的默认命令。
4. 排错与诊断(典型问题)#
问题1:容器启动即退出
# 查看容器退出原因
docker ps -a
docker logs <容器名>
# 常见原因:CMD执行后立刻结束
# 解决:使用长期运行的进程或启动脚本
问题2:卷未生效或数据丢失
# 检查挂载点是否正确
docker inspect <容器名> | grep -A5 "Mounts"
# 验证数据卷目录内容
docker volume inspect webdata
问题3:网络不通
# 查看网络与容器网络配置
docker network ls
docker network inspect appnet
# 检查容器DNS与IP
docker exec -it app1 cat /etc/resolv.conf
5. 练习题(含操作指令)#
练习1:镜像与容器生命周期
# 要求:创建镜像并运行后删除容器
docker build -t practice/app:1.0 .
docker run -d --name practice1 practice/app:1.0
docker stop practice1
docker rm practice1
练习2:卷持久化验证
# 要求:写入卷后删除容器,重新挂载检查内容
docker volume create testvol
docker run -d --name vol1 -v testvol:/data alpine:3.19 sh -c "echo ok > /data/flag && sleep 300"
docker rm -f vol1
docker run --rm -v testvol:/data alpine:3.19 cat /data/flag
# 预期输出:ok
6. 运维关注点与建议#
- 镜像不可变,容器可替换,持久化数据必须使用卷或外部存储。
- 容器异常优先重建,避免在容器内“修修补补”。
- 定期清理资源(镜像、容器、卷、网络)避免磁盘膨胀:
docker system df
docker system prune -f