Docker架构

Docker 采用了客户端-服务器 (Client-Server) 架构模型,主要由 Docker 客户端、Docker 守护进程、Docker 镜像、Docker 容器、Docker 注册中心等核心组件构成。

flowchart TD subgraph A [用户操作侧] direction LR Client[Docker 客户端<br>CLI] end subgraph B [Docker 引擎侧] Dockerd[Docker 守护进程<br>Dockerd] subgraph C [容器化运行环境] Containerd[containerd] ContainerdShim[Container Shim] RunC[runc] end end subgraph D [资源存储侧] DockerImages[镜像仓库<br>Registry] LocalImages[本地镜像存储] end A -- "1. 发送命令<br>(docker run, build等)" --> B Dockerd -- "2. 处理请求, 管理资源" --> C Dockerd -- "3. 拉取镜像" --> DockerImages Dockerd -- "缓存镜像" --> LocalImages

1、Docker 守护进程 (Docker Daemon - dockerd)

  • 角色: Docker 架构的“大脑”和“心脏”,是运行在主机操作系统上的一个常驻后台服务。
  • 功能
    • 监听 Docker API 请求(默认通过 UNIX socket /var/run/docker.sock,也可配置为网络端口)。
    • 管理 Docker 的核心对象:镜像、容器、网络、数据卷
    • 负责与容器运行时(如 containerd)交互来创建和运行容器。
  • 要点: 用户不直接与守护进程交互,而是通过客户端。

2、Docker 客户端 (Docker Client - docker)

  • 角色: 用户与 Docker 交互的主要入口,即我们使用的 docker 命令行工具。
  • 功能
    • 接收用户输入的命令(如 docker run, docker pull)。
    • 将这些命令转换为 Docker API 请求,发送给 Docker 守护进程。
    • 接收守护进程返回的结果并将其输出给用户。
  • 要点: 客户端和守护进程可以运行在同一台机器上,也可以让客户端远程连接另一台机器的守护进程。

3、Docker 镜像 (Docker Images)

  • 角色只读的模板,用于创建容器。类似于面向对象编程中的“类”。
  • 特性
    • 分层存储 (Layered Storage): 镜像由一系列只读层叠加而成。每一层代表 Dockerfile 中的一条指令。这种设计使得镜像非常轻量、易于分享和存储。
    • 内容寻址存储 (Content-Addressable Storage): 每一层都由其内容的哈希值唯一标识,这提高了镜像的安全性和复用性。
    • 通过 Dockerfile 构建: Dockerfile 是一个文本文件,包含了一系列构建镜像的指令(FROM, RUN, COPY, CMD 等)。执行 docker build 时会根据 Dockerfile 生成镜像。

4、Docker 容器 (Docker Containers)

  • 角色镜像的一个运行实例。类似于面向对象编程中“类”的“实例化对象”。
  • 特性
    • 容器 = 镜像 + 一个可写的容器层(Container Layer)。
    • 当容器启动时,Docker 会在镜像只读层之上添加一个薄薄的可写层(通常称为“容器层”)。所有对容器的修改(如创建新文件、修改现有文件)都发生在这个可写层中。
    • 容器进程运行在自己独立的、隔离的命名空间中(PID, Network, IPC 等)。
    • 容器可以被创建、启动、停止、删除、暂停和移动。

5、Docker 注册中心 (Docker Registry)

  • 角色集中存储和分发 Docker 镜像的服务
  • 公共注册中心: 最著名的是 Docker Hub,提供了大量官方和社区维护的镜像(如 nginx, ubuntu, redis)。
  • 私有注册中心: 用户可以在内网搭建自己的私有注册中心(如 Docker Registry, Harbor),用于存放公司内部的镜像,保障代码安全和交付效率。
  • 操作docker pull 从注册中心拉取镜像,docker push 将本地镜像推送到注册中心。

6、Docker 架构工作流(以 docker run 为例)

  1. 用户在终端输入 docker run -d nginx:latest。
  2. Docker 客户端 将此命令转换为 API 请求,发送给 Docker 守护进程。
  3. Docker 守护进程 收到请求,发现本地没有 nginx:latest 镜像。
  4. 守护进程从 Docker Hub(注册中心)拉取 nginx 镜像。
  5. 镜像下载完成后,守护进程将运行任务交给 containerd。
  6. containerd 准备容器的规格说明(spec),并调用 runc。
  7. runc 读取容器规格,利用 Linux 命名空间 和 cgroups 创建一个隔离的环境,在其中启动容器进程(例如 nginx 主进程)。
  8. runc 进程退出,容器进程由 containerd-shim(一个垫片)接管,它负责保持 STDIO 流开启、报告退出状态等,使得守护进程可以升级或重启而不影响容器运行。
  9. 容器正式运行。用户可以通过 docker ps 看到它。
posted @ 2025-09-09 16:51  xclic  阅读(43)  评论(0)    收藏  举报