1. Docker 基础回顾:架构、镜像与容器生命周期

1.1 Docker 整体架构

Docker 采用典型的 C/S(客户端-服务器) 架构。理解各组件之间的协作关系,是排查容器通信与运行时故障的前提。

核心组件: Docker Client、Docker Daemon、containerd、runc、镜像仓库(Registry)。
Docker 整体架构图 Docker 整体架构图 Docker Client docker build / run / ps Docker Daemon API / 镜像管理 / 容器编排 containerd 容器生命周期管理 runc OCI 运行时 / Namespace + Cgroups Registry Docker Hub / 私有仓库 说明:Docker Client 通过 REST API 与 Daemon 通信;Daemon 调用 containerd 管理容器;runc 负责实际创建和运行容器进程。

1.2 镜像与容器的核心概念

概念 定义 关键特征
镜像(Image) 一个只读的、分层结构的模板,包含运行应用所需的文件系统、依赖和配置。 分层复用(UnionFS)、不可变、通过 Dockerfile 构建
容器(Container) 镜像的运行实例,在镜像层之上添加一个可写层(Container Layer)。 可读写、有生命周期、隔离性(Namespace + Cgroups)
仓库(Repository) 集中存储和分发镜像的服务,如 Docker Hub、Harbor。 标签管理(tag)、支持推送/拉取
故障排查要点: 镜像层是只读的,容器层写入的数据在容器删除后会丢失。若需要持久化数据,必须使用 Volume 或 Bind Mount。

1.3 容器生命周期管理

容器的状态转换是故障排查的核心线索。以下列出容器从创建到销毁的完整状态机:

  1. Created:镜像已加载,容器配置已就绪,但尚未启动。
  2. Running:容器进程正在运行,网络和存储已挂载。
  3. Paused:通过 docker pause 冻结所有进程(使用 cgroups freezer)。
  4. Exited:主进程退出,容器停止运行。退出码(Exit Code)是诊断故障的关键指标。
  5. Removed:容器被删除,所有可写层数据丢失(除非使用 Volume)。
容器生命周期状态图 容器生命周期状态图 Created Running Paused Exited Removed 说明:Exited 状态需关注退出码(0 正常退出,非 0 表示异常);Paused 状态不会释放网络和存储资源。

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> 可以查看每一层的大小和创建指令。