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)交互来创建和运行容器。
- 监听 Docker API 请求(默认通过 UNIX socket
- 要点: 用户不直接与守护进程交互,而是通过客户端。
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 为例)
- 用户在终端输入 docker run -d nginx:latest。
- Docker 客户端 将此命令转换为 API 请求,发送给 Docker 守护进程。
- Docker 守护进程 收到请求,发现本地没有 nginx:latest 镜像。
- 守护进程从 Docker Hub(注册中心)拉取 nginx 镜像。
- 镜像下载完成后,守护进程将运行任务交给 containerd。
- containerd 准备容器的规格说明(spec),并调用 runc。
- runc 读取容器规格,利用 Linux 命名空间 和 cgroups 创建一个隔离的环境,在其中启动容器进程(例如 nginx 主进程)。
- runc 进程退出,容器进程由 containerd-shim(一个垫片)接管,它负责保持 STDIO 流开启、报告退出状态等,使得守护进程可以升级或重启而不影响容器运行。
- 容器正式运行。用户可以通过 docker ps 看到它。
浙公网安备 33010602011771号