1. Docker 基础回顾:架构、镜像与容器生命周期
1.1 Docker 整体架构
Docker 采用典型的 C/S(客户端-服务器) 架构。理解各组件之间的协作关系,是排查容器通信与运行时故障的前提。
核心组件: Docker Client、Docker Daemon、containerd、runc、镜像仓库(Registry)。
1.2 镜像与容器的核心概念
| 概念 | 定义 | 关键特征 |
|---|---|---|
| 镜像(Image) | 一个只读的、分层结构的模板,包含运行应用所需的文件系统、依赖和配置。 | 分层复用(UnionFS)、不可变、通过 Dockerfile 构建 |
| 容器(Container) | 镜像的运行实例,在镜像层之上添加一个可写层(Container Layer)。 | 可读写、有生命周期、隔离性(Namespace + Cgroups) |
| 仓库(Repository) | 集中存储和分发镜像的服务,如 Docker Hub、Harbor。 | 标签管理(tag)、支持推送/拉取 |
故障排查要点: 镜像层是只读的,容器层写入的数据在容器删除后会丢失。若需要持久化数据,必须使用 Volume 或 Bind Mount。
1.3 容器生命周期管理
容器的状态转换是故障排查的核心线索。以下列出容器从创建到销毁的完整状态机:
- Created:镜像已加载,容器配置已就绪,但尚未启动。
- Running:容器进程正在运行,网络和存储已挂载。
- Paused:通过
docker pause冻结所有进程(使用 cgroups freezer)。 - Exited:主进程退出,容器停止运行。退出码(Exit Code)是诊断故障的关键指标。
- Removed:容器被删除,所有可写层数据丢失(除非使用 Volume)。
1.4 常用命令速查表
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 拉取镜像 | docker pull nginx:latest |
从 Registry 下载镜像到本地 |
| 查看镜像 | docker images |
列出本地所有镜像 |
| 创建并启动容器 | docker run -d --name web nginx |
-d 后台运行,--name 指定名称 |
| 查看运行中容器 | docker ps |
加 -a 显示所有状态容器 |
| 查看容器日志 | docker logs web |
排查启动失败或运行时错误的首选命令 |
| 进入容器 | docker exec -it web bash |
调试网络、进程或文件系统 |
| 停止容器 | docker stop web |
发送 SIGTERM,超时后 SIGKILL |
| 删除容器 | docker rm web |
加 -f 强制删除运行中容器 |
常见陷阱: 使用
docker run 时若未指定 --rm,容器退出后不会自动删除,长期积累会占用磁盘空间。建议在测试场景中始终添加 --rm 参数。
1.5 镜像分层与 UnionFS 原理
Docker 镜像采用 分层存储 技术(OverlayFS / AUFS)。每一层代表 Dockerfile 中的一条指令,层与层之间共享且只读。当容器运行时,在最上层叠加一个可写层。
- 基础层(Base Layer):通常为操作系统基础镜像,如
ubuntu:22.04。 - 中间层(Intermediate Layer):每次
RUN、COPY、ADD指令都会生成一个新层。 - 容器层(Container Layer):容器启动时创建,所有写入操作发生在此层,容器删除后该层随之消失。
故障排查价值: 理解分层机制有助于诊断“镜像构建缓存失效”、“容器磁盘空间不足”以及“镜像体积过大”等问题。例如,
docker history <image> 可以查看每一层的大小和创建指令。