Docker通过一系列核心技术,实现了Docker容器化,下面我就全面来详解Docker核心技术@mikechen
Docker 引擎架构组件
Docker 是一个 C/S 架构的容器平台,其核心由以下组件组成:
主要组件说明:
组件 | 说明 |
---|---|
Docker CLI | 命令行工具,与 Docker Daemon 通信 |
Docker Daemon | 守护进程,负责构建镜像、管理容器和镜像 |
containerd | 容器生命周期管理器(启动、停止、删除容器) |
runc | 负责真正启动容器进程,符合 OCI 规范 |
存储驱动 | 管理镜像与容器文件系统(如 overlay2、aufs、btrfs) |
网络驱动 | 提供容器之间与外部通信能力(如 bridge、host、overlay 等) |
Docker 客户端 (Docker Client)
这是用户与 Docker 交互的主要方式,通常通过 docker
命令行工具实现。
例如: docker run
, docker build
, docker pull。。。
,发送给 Docker 守护进程。
Docker 守护进程 (Docker Daemon)
这是 Docker 引擎的核心后台服务,它负责接收来自 Docker 客户端的请求,并执行相应的操作。
例如:管理镜像、容器、网络和存储…等,守护进程运行在宿主机上。
Containerd
这是一个容器运行时守护进程,负责管理容器的生命周期。
Runc
这是一个轻量级的、符合 OCI (Open Container Initiative) 规范的容器运行时。
containerd
实际上是使用 runc
来创建和运行容器的。
Namespace(隔离机制)
Namespace 是 Linux 提供的核心特性之一,为 Docker 容器实现 资源级别的隔离。
Docker 广泛利用了各种类型的 Namespace,使得每个容器都像运行在一个独立的操作系统环境中。
常见的Namespace,如下所示:
Namespace 类型 | 说明 | Docker 使用场景 |
---|---|---|
pid |
隔离进程编号空间 | 每个容器拥有独立的进程号 |
net |
隔离网络接口与路由表 | 每个容器可配置独立虚拟网卡 |
mnt |
隔离挂载点与文件系统视图 | 容器有自己的根文件系统 |
uts |
隔离主机名与域名 | 容器可自定义 hostname |
ipc |
隔离进程间通信资源 | 容器中的进程通信相互隔离 |
user |
隔离用户与用户组 ID 空间 | 支持容器内外不同权限映射 |
✅ 每个容器,就是通过这些 Namespace, 创建出一个逻辑独立的操作系统环境。
总结来说,Namespace 提供了一种轻量级的虚拟化形式,它在操作系统层面实现了资源和环境的隔离,是 Docker 实现容器化的关键基石。
Cgroups(资源控制)
Cgroups(Control Groups)是 Linux 提供的资源管理机制,用于限制、和隔离容器的资源使用。
主要子系统:
cpu:限制容器使用的 CPU 时间或核心数。
例如,–cpus=0.5 限制容器使用半个 CPU 核心。
memory:限制容器内存使用量(如 –memory=512m 限制为 512MB)。
blkio:限制块设备(如磁盘)的 I/O 吞吐量。
net_cls / net_prio:限制网络流量优先级或带宽。
devices:控制容器对设备(如 GPU)的访问权限。
支持控制的资源类型:
资源类型 | 示例配置 | 含义 |
---|---|---|
CPU | --cpus=2 |
限制容器最多使用两个核心 |
内存 | -m 512m |
限制内存最多使用 512MB |
磁盘 IO | --device-read-bps |
限制磁盘读写速率 |
网络带宽 | iptables/tc 结合实现 | 限制容器网络带宽(非 Cgroups 原生) |
工作机制:
- Docker 会为每个容器,创建一组 Cgroup 子系统控制路径;
- 这些路径对应 Linux 内核的
/sys/fs/cgroup/
目录; - 系统在运行时会不断更新资源使用信息,触发阈值限制。
UnionFS(镜像分层)
UnionFS(联合文件系统)支持将多个只读文件系统叠加在一起形成一个一致的视图,是 Docker 镜像构建和运行的核心技术。
镜像由多个只读层叠加而成,每一层都是一个文件系统的快照。
当需要修改镜像中的文件时,UnionFS采用Copy-on-Write机制,只复制需要修改的文件到可写层,而不会修改原始的只读层
分层结构:
镜像层: – 基础层(如 ubuntu) – 依赖层(安装软件) – 应用层(拷贝代码、配置等) 容器层: – 最顶层为可写层(容器运行时动态创建)。
优势:
- 构建镜像过程,可以使用缓存加速;
- 层之间共享,极大节省存储空间;
- 容器运行时修改不影响原始镜像。
Containerd(容器运行时)
containerd
是 Docker 抽出的核心组件,用于容器生命周期管理,现在也是 CNCF 的核心项目。
containerd ,是 Docker 和 K8s 底层运行时的重要桥梁。
containerd 的职责:
- 管理镜像:拉取、导入、导出;
- 容器生命周期:创建、启动、暂停、销毁;
- 挂载文件系统与网络设置;
- 与 runc 协作:containerd 调用 runc 启动容器进程;
- 支持 gRPC 接口,K8s 也可直接调用。