Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Docker 使用的是哪个内核

✅ 结论

Docker 容器使用的是「宿主机的 Linux 内核」

容器里没有自己的内核,也不存在“其它内核”。

一、先给出明确答案(避免混淆)

选项 是否正确 说明
容器自己的内核 容器里根本没有内核
宿主机的内核 唯一正确答案
其它独立内核 这是虚拟机的做法

👉 Docker 容器 = 宿主机内核上的一个普通进程(被隔离)

二、为什么容器“看起来”像有自己的系统?

这是很多人误解的根源。

在容器中执行:

uname -a

你会看到:

Linux xxx 5.15.0-xxx

你可能会以为:

“这是容器自己的内核?”

❌ 错。

真相是:

  • uname 返回的是 宿主机内核信息
  • 容器只是 被 Namespace 隔离后的进程视角

三、Docker 是如何“共享内核又互不干扰”的?

靠的是 Linux 内核的三大能力:

1️⃣ Namespace(让进程“以为自己独占系统”)

Namespace 让容器中的进程:

  • 看不到宿主机其他进程(PID Namespace)
  • 有自己的网络栈(NET Namespace)
  • 有自己的挂载点(MNT Namespace)
  • 有自己的 hostname(UTS Namespace)

📌 但内核仍然是同一个

2️⃣ cgroups(限制资源,而不是虚拟)

cgroups 控制的是:

  • CPU
  • 内存
  • IO
  • PID 数量

📌 限制的是“能用多少内核资源”,不是“用哪个内核”

3️⃣ Syscall 直接进入宿主机内核

容器内进程调用:

open()
read()
write()
fork()

👉 直接进入宿主机内核执行

没有中间虚拟层。

四、一个关键对比

Docker vs 虚拟机(内核层面对比)

对比项 Docker 容器 虚拟机
内核 宿主机共享 每个 VM 独立
系统调用 直接进入宿主机内核 进入 VM 内核
启动速度 秒级 分钟级
资源消耗 极低

📌 是否有“自己的内核”是 Docker 与 VM 的本质分界线

五、那 Windows / macOS 上的 Docker 呢?(高阶补充)

在 macOS / Windows 上:

容器 -> Linux VM -> Linux 内核 -> 宿主机

  • Docker Desktop 会启动一个 轻量 Linux 虚拟机
  • 所有容器 共享这个 Linux VM 的内核
  • ❌ 仍然不是“容器自己的内核”

📌 所以在 macOS 上运行 Linux 容器,本质是:

容器 -> VM 内核(共享)

六、总结

容器没有内核,所有容器共享宿主机内核,Docker 是进程隔离,不是硬件虚拟化。

Docker 容器没有自己的内核,它们共享宿主机的 Linux 内核。

Docker 通过 Namespace 提供隔离,通过 cgroups 做资源限制,本质上容器只是宿主机上的普通进程。

这也是 Docker 启动快、资源利用率高,但内核级隔离不如虚拟机的根本原因。

七、扩展

Q1:那容器能用不同版本的内核吗?

❌ 不能

✅ 必须和宿主机一致

Q2:为什么 alpine / ubuntu 容器都能跑?

  • 那只是 用户态(glibc / musl / shell)
  • 与内核无关

Q3:容器能跑 Windows 程序吗?

  • Linux 容器 ❌
  • Windows 容器 ✅(但依赖 Windows 内核)