源本科技 | 码上会

Docker 架构详解

2025/12/24
73
0

学习目标

通过本课件,你将掌握:

  1. Docker 的核心架构模型:理解客户端 - 服务器(Client-Server)模式如何驱动容器生命周期。

  2. 四大核心组件的作用与交互:Docker Client、Docker Host、Docker Daemon 与 Registry。

  3. Docker 对象的本质:深入理解镜像(Image)、容器(Container)、存储(Volume)与网络(Network)。

  4. 容器启动全过程:从 docker run 命令到 Linux 内核命名空间(namespace)与控制组(cgroup)的完整链路。

  5. 数据持久化与网络隔离策略:掌握 Volumes、Bind Mounts 及多种网络驱动的适用场景。


核心架构模型

Docker 采用经典的 客户端 - 服务器(Client-Server)架构。用户通过 Docker Client 发出指令,由后台的 Docker Daemon(守护进程)执行实际操作,如构建、运行和管理容器。两者之间通过 REST API 通信:

  • 在 Linux 系统上,默认使用 UNIX 套接字(如 /var/run/docker.sock);

  • 若需远程管理,则可通过 网络接口(如 TCP)进行通信。

整个系统由以下三大核心部分构成:

组件

角色

说明

Docker Client

用户命令入口

执行 docker rundocker build 等 CLI 命令

Docker Host

容器运行环境

物理或虚拟机,运行 Docker Daemon 和容器

Docker Registry

镜像仓库

存储和分发 Docker 镜像(如 Docker Hub、Harbor)

工作流简述

用户 → Client → 向 Daemon 发送指令 → Host → Daemon 检查本地是否有镜像 → 若无 → 从 Registry 拉取 → 启动容器


核心组件详解

Docker Daemon

  • 角色:Docker 系统的“大脑”,常驻后台进程。

  • 功能

    • 监听来自 Client 的 REST API 请求;

    • 管理所有 Docker 对象:镜像、容器、网络、卷

    • 支持多主机协作(如 Docker Swarm 集群中与其他 Daemon 通信)。

  • 运行位置:Docker Host 上。

Docker Client

  • 角色:用户与 Docker 交互的主要界面(通常为 CLI)。

  • 工作方式

    • docker ps 等命令转换为 REST API 请求;

    • 发送给 Docker Daemon 处理;

    • 支持连接多个 Daemon(通过 -H 参数指定不同主机)。

  • 常用命令

    docker build    # 从 Dockerfile 构建镜像
    docker pull     # 从 Registry 拉取镜像
    docker run      # 基于镜像创建并启动容器

Docker Host

即运行容器的宿主机,包含:

  • 操作系统(含 Linux 内核);

  • Docker Daemon(dockerd);

  • 已拉取或构建的镜像;

  • 正在运行的容器;

  • 网络与存储资源(如 bridge 网络、volumes)。

关键点:容器并非直接运行在“裸机”上,而是依赖 Host 的内核能力(如 namespace、cgroup)。

Docker Registry

  • 定义:用于存储和分发 Docker 镜像的无状态、可扩展服务。

  • 类型

    • 公共 Registry:如 Docker Hub,提供大量官方与社区镜像;

    • 私有 Registry:企业常用 Harbor、AWS ECR、Google Artifact Registry 等,保障安全与合规。

  • 核心命令

    docker pull nginx        # 从默认 Registry 拉取 nginx 镜像
    docker push my-app:v1    # 将本地镜像推送到 Registry

对象详解

使用 Docker 时,我们实际是在操作一系列“对象”:

镜像(Image)

  • 本质只读模板,用于创建容器,类似于面向对象编程中的“类”。

  • 构建方式:通过 Dockerfile 定义构建步骤。

  • 分层结构

    • 每条 Dockerfile 指令生成一个只读层

    • 层级复用机制极大提升构建与传输效率(如多个镜像共享基础层)。

示例:FROM ubuntu:22.04RUN apt-get updateCOPY app.py /app → 形成三层镜像。

容器(Container)

  • 本质:镜像的可运行实例,如同“对象”之于“类”。

  • 特性

    • 可通过 CLI/API 创建、启动、停止、删除;

    • 强隔离性:拥有独立的文件系统、网络栈、进程空间;

    • 同一镜像可启动多个容器(如 10 个 Nginx 实例)。

存储(Storage)

容器的可写层是临时的(ephemeral),容器删除后数据即丢失。为此,Docker 提供三种持久化方案:

类型

说明

适用场景

Volumes

Docker 管理,存于 /var/lib/docker/volumes/

生产首选,跨容器共享、备份、迁移

Bind Mounts

直接挂载主机目录 / 文件到容器

开发调试(如挂载源码目录)

tmpfs Mounts

数据仅存于内存,不写入磁盘

敏感数据(如密钥)、高性能临时缓存

最佳实践:数据库等有状态服务务必使用 Volumes

网络(Networking)

Docker 默认提供网络隔离,同时支持灵活组网:

网络驱动

说明

使用场景

bridge(默认)

容器间通过虚拟网桥通信

单机多容器互联

host

容器共享主机网络命名空间

高性能需求,无需隔离

overlay

跨主机通信

Docker Swarm 集群

none

禁用网络

完全隔离的沙箱环境

macvlan

为容器分配独立 MAC 地址

容器模拟物理设备接入局域网


实战解析

让我们追踪一条常见命令的完整执行链路:

docker run -d -p 80:80 nginx

执行流程分解

  1. Client → 将命令转换为 REST API 请求,发送给 Docker Daemon。

  2. Daemon → 接收请求,检查本地是否存在 nginx 镜像。

  3. Registry(若镜像不存在)→ 自动从 Docker Hub 拉取 nginx:latest 镜像。

  4. Runtime 层(containerd + runc)

    • Daemon 将镜像与配置交给 containerd(高级容器运行时);

    • containerd 调用 runc(底层运行时);

    • runc 通过 Linux 内核创建:

      • Namespaces:实现 PID、网络、文件系统等隔离;

      • Cgroups:限制 CPU、内存等资源使用。

  5. 容器启动

    • Nginx 进程作为 PID 1 在容器内运行;

    • 主机的 80 端口 映射到容器的 80 端口-p 80:80);

    • 用户访问 http://localhost 即可看到 Nginx 欢迎页。

技术栈层级:CLI → Docker Daemon → containerd → runc → Linux Kernel (namespaces + cgroups)


重点总结

概念

关键点

架构模式

Client-Server,基于 REST API 通信

Daemon

核心管理者,处理所有对象生命周期

镜像 vs 容器

镜像是只读模板,容器是运行实例

数据持久化

优先使用 Volumes,避免数据丢失

网络隔离

默认 bridge 网络,支持 host/overlay/macvlan 等高级模式

运行时栈

dockerdcontainerdrunc → Linux 内核


思考题

  1. 为什么 Docker 镜像采用分层设计?这种设计对 CI/CD 流水线有何优势?

  2. 在生产环境中,为何推荐使用 Volumes 而非 Bind Mounts 来持久化数据库数据?

  3. 如果 docker run 时未指定网络驱动,容器会使用哪种网络?如何验证其 IP 地址和网关?


📘 延伸阅读