Docker 使用的是哪个内核
Docker 容器使用的是「宿主机的 Linux 内核」
容器里没有自己的内核,也不存在“其它内核”。
| 选项 | 是否正确 | 说明 |
|---|---|---|
| 容器自己的内核 | ❌ | 容器里根本没有内核 |
| 宿主机的内核 | ✅ | 唯一正确答案 |
| 其它独立内核 | ❌ | 这是虚拟机的做法 |
👉 Docker 容器 = 宿主机内核上的一个普通进程(被隔离)
这是很多人误解的根源。
在容器中执行:
uname -a
你会看到:
Linux xxx 5.15.0-xxx
你可能会以为:
“这是容器自己的内核?”
❌ 错。
真相是:
- uname 返回的是 宿主机内核信息
- 容器只是 被 Namespace 隔离后的进程视角
靠的是 Linux 内核的三大能力:
Namespace 让容器中的进程:
- 看不到宿主机其他进程(PID Namespace)
- 有自己的网络栈(NET Namespace)
- 有自己的挂载点(MNT Namespace)
- 有自己的 hostname(UTS Namespace)
📌 但内核仍然是同一个
cgroups 控制的是:
- CPU
- 内存
- IO
- PID 数量
📌 限制的是“能用多少内核资源”,不是“用哪个内核”
容器内进程调用:
open()
read()
write()
fork()
👉 直接进入宿主机内核执行
没有中间虚拟层。
Docker vs 虚拟机(内核层面对比)
| 对比项 | Docker 容器 | 虚拟机 |
|---|---|---|
| 内核 | 宿主机共享 | 每个 VM 独立 |
| 系统调用 | 直接进入宿主机内核 | 进入 VM 内核 |
| 启动速度 | 秒级 | 分钟级 |
| 资源消耗 | 极低 | 高 |
📌 是否有“自己的内核”是 Docker 与 VM 的本质分界线
在 macOS / Windows 上:
容器 -> Linux VM -> Linux 内核 -> 宿主机
- Docker Desktop 会启动一个 轻量 Linux 虚拟机
- 所有容器 共享这个 Linux VM 的内核
- ❌ 仍然不是“容器自己的内核”
📌 所以在 macOS 上运行 Linux 容器,本质是:
容器 -> VM 内核(共享)
容器没有内核,所有容器共享宿主机内核,Docker 是进程隔离,不是硬件虚拟化。
Docker 容器没有自己的内核,它们共享宿主机的 Linux 内核。
Docker 通过 Namespace 提供隔离,通过 cgroups 做资源限制,本质上容器只是宿主机上的普通进程。
这也是 Docker 启动快、资源利用率高,但内核级隔离不如虚拟机的根本原因。
❌ 不能
✅ 必须和宿主机一致
- 那只是 用户态(glibc / musl / shell)
- 与内核无关
- Linux 容器 ❌
- Windows 容器 ✅(但依赖 Windows 内核)