docker 原理
一、Docker 是什么?
Docker 是一个 基于容器(Container)技术 的轻量级虚拟化方案。
它可以在同一个操作系统内核上运行多个相互隔离的应用环境。
换句话说:
Docker 让“打包、分发、运行应用”变得像运行一个进程一样简单。
⚙️ 二、Docker 的核心原理
Docker 之所以能快速启动、体积小、隔离性强,主要依赖于 Linux 内核的三大技术:
1️⃣ Namespace(命名空间)——“隔离”
Namespace 用于实现 进程之间的资源隔离。
| Namespace 类型 | 隔离内容 |
|---|---|
pid | 进程号(让容器内看到自己的 PID 从 1 开始) |
net | 网络设备、IP、端口 |
mnt | 挂载点(文件系统) |
ipc | 进程间通信(共享内存、信号量) |
uts | 主机名和域名 |
user | 用户和用户组(容器内 root ≠ 宿主机 root) |
👉 这就是为什么容器之间互不干扰:每个容器都在自己的“命名空间”中。
2️⃣ Cgroups(Control Groups)——“限制资源”
Cgroups 用于 限制和分配系统资源,防止某个容器“吃光”CPU、内存等资源。
例如:
docker run --memory=512m --cpus=1 nginx
👉 这条命令背后其实是 Cgroups 在起作用,控制容器只能使用 512MB 内存和 1 个 CPU 核心。
3️⃣ UnionFS(联合文件系统)——“分层存储”
UnionFS 提供了 镜像分层机制,实现了 Docker 的高效构建与复用。
每个镜像由多层(layer)组成;
每层只读(read-only),新改动通过“写时复制(Copy-on-Write)”保存;
构建新镜像时,只新增变化层。
🔹 举例:
FROM ubuntu:20.04 RUN apt install -y python3 RUN pip install flask
最终镜像会包含:
Layer1: ubuntu:20.04 Layer2: 安装 python3 Layer3: 安装 flask
多个镜像共享相同的基础层,大幅节省磁盘空间。
🐳 三、Docker 的核心组件
| 组件 | 功能 |
|---|---|
| Docker Daemon(dockerd) | 守护进程,负责管理镜像、容器、网络等 |
| Docker CLI(客户端) | 用户操作入口,命令如 docker run、docker ps |
| Docker Image(镜像) | 应用的只读模板 |
| Docker Container(容器) | 镜像运行起来的实例 |
| Docker Registry(仓库) | 存放镜像的地方(如 Docker Hub) |
🚀 四、Docker 容器运行流程
1️⃣ 用户执行命令:
docker run nginx
2️⃣ Docker 客户端发送请求给 Docker Daemon。
3️⃣ Daemon 检查本地是否有 nginx 镜像:
没有则从远程仓库(Docker Hub)拉取;
有则直接使用。
4️⃣ Daemon 基于镜像创建一个 容器层(可写层)。
5️⃣ 为容器分配:
独立的 Namespace(隔离环境)
Cgroups(资源限制)
网络接口(虚拟网卡)
6️⃣ 启动容器内的进程(通常是镜像的 ENTRYPOINT 命令)。
7️⃣ 用户进入容器环境,容器像一个轻量的独立系统一样运行。
🧩 五、Docker vs 虚拟机(VM)
| 对比项 | Docker 容器 | 虚拟机(VM) |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 性能开销 | 接近原生 | 较大(虚拟化硬件) |
| 隔离级别 | 进程级(共享内核) | 系统级(独立内核) |
| 占用空间 | 小(MB级) | 大(GB级) |
| 部署灵活性 | 高,镜像可移植 | 较低 |
| 安全性 | 相对较低 | 较高(完全隔离) |
🔒 六、安全与限制
容器共享宿主机内核 → 内核漏洞可导致逃逸;
不建议容器内运行特权进程;
可结合
seccomp、AppArmor、SELinux提升隔离。
📘 七、总结一句话
Docker 本质上是一个利用 Linux Namespace、Cgroups、UnionFS 等技术实现的进程级虚拟化环境。
它让应用在一个独立的、可复制的、轻量的环境中运行。
