容器与宿主机内核关系
容器并非完全隔离内核,下面深入分析容器与宿主机内核的关系。
共享内核
Bash
宿主机
├── Linux Kernel (共享)
│ ├── Namespace (隔离)
│ └── Cgroups (限制)
└── 容器1 / 容器2 / 容器3
容器共享宿主机内核,仅隔离用户空间,这是与虚拟机的本质区别。
内核版本约束
容器内核版本
Bash
# 容器内核版本 = 宿主机内核版本
docker run --rm ubuntu:22.04 uname -r
# 输出
5.15.0-91-generic # 宿主机内核版本
容器 OS 版本
Bash
# 容器用户空间 OS 可不同于宿主
docker run --rm ubuntu:22.04 cat /etc/os-release
docker run --rm alpine:3.18 cat /etc/os-release
容器用户空间(发行版、库版本)可独立,但内核版本必须与宿主一致。
内核模块
Bash
# 容器无法加载内核模块
docker run --rm --privileged my-app modprobe xyz
# 错误: modprobe: FATAL: Module xyz not found
# 内核模块必须在宿主加载
内核参数
Bash
# 容器可读取内核参数
docker run --rm my-app cat /proc/sys/net/ipv4/ip_forward
# 修改需要 --privileged
docker run --rm --privileged my-app sysctl -w net.ipv4.ip_forward=1
内核兼容性
系统调用
Bash
# 容器使用宿主系统调用
# 如果容器需要新系统调用,宿主内核必须支持
# 查看容器可用系统调用
docker run --rm my-app strace ls
版本要求
| 容器特性 | 最低内核版本 |
|---|---|
| Namespace | 2.6.24 |
| Cgroups | 2.6.24 |
| overlay2 | 4.0 |
| USER Namespace | 3.8 |
| Cgroups v2 | 4.5 |
安全风险
内核漏洞
Bash
容器共享宿主内核 → 内核漏洞影响所有容器
示例:
CVE-2021-4034 (PwnKit)
- 影响所有容器
- 需升级宿主内核
容器逃逸
text
# 特权容器可访问宿主内核
docker run --rm --privileged my-app cat /proc/version
# 建议:避免 --privileged,使用最小权限
升级策略
text
# 升级宿主内核
sudo apt-get update
sudo apt-get install linux-generic
# 重启宿主机
sudo reboot
# 所有容器自动使用新内核
要点总结
- 容器共享宿主内核,仅隔离用户空间
- 容器用户空间 OS 可独立,内核版本必须一致
- 容器无法加载内核模块,需在宿主加载
- 内核漏洞影响所有容器,需及时升级宿主内核
- 避免 --privileged 特权容器,降低内核攻击面
📝 发现内容有误?点击此处直接编辑