开发-- docker常识
Docker 容器通过 Linux 的 Namespace 和 Cgroups 技术实现资源隔离与限制,部分资源与宿主机共享,部分则完全独立。以下是具体分类:
一、继承自宿主机的资源
-
内核(Kernel)
- 容器共享宿主机的 Linux 内核,无法独立修改内核版本或模块。若容器内程序依赖特定内核特性,需宿主机内核支持。
-
硬件设备
- 物理设备(如 CPU、GPU、磁盘)由宿主机统一管理。容器可通过
--privileged或--device参数访问特定设备,但本质上仍是共享宿主机硬件。
- 物理设备(如 CPU、GPU、磁盘)由宿主机统一管理。容器可通过
-
系统时间(Time)
- 容器无法独立修改系统时间,
settimeofday等调用会直接影响宿主机及其他容器。
- 容器无法独立修改系统时间,
-
部分内核参数
/proc/sys、/sys中的内核参数(如net.ipv4.ip_forward)通常继承自宿主机,除非显式通过--sysctl修改。
二、独立于宿主机的资源
-
进程树(PID Namespace)
- 容器内进程拥有独立的 PID 空间,
ps命令仅显示容器内进程,且 Init 进程的 PID 为 1。
- 容器内进程拥有独立的 PID 空间,
-
文件系统(Mount Namespace)
- 通过
rootfs和Mount Namespace提供独立的文件视图。容器内挂载操作(如mount /tmpfs)不影响宿主机。
- 通过
-
网络栈(Network Namespace)
- 默认情况下,容器拥有独立的网络设备、IP 地址、端口和路由表。例如
bridge模式下,容器通过veth pair连接虚拟网桥docker0。
- 默认情况下,容器拥有独立的网络设备、IP 地址、端口和路由表。例如
-
用户与权限(User Namespace)
- 可配置独立的用户和组映射,容器内
root用户权限可被限制(需启用User Namespace)。
- 可配置独立的用户和组映射,容器内
-
主机名与域名(UTS Namespace)
- 容器可设置独立的
hostname和domainname,与宿主机隔离。
- 容器可设置独立的
-
进程间通信(IPC Namespace)
- 信号量、消息队列等 IPC 资源仅在容器内可见。
-
资源限制(Cgroups)
- 通过 Cgroups 独立限制 CPU、内存、磁盘 I/O 等资源使用量。例如
--memory=500m限制内存为 500MB。
- 通过 Cgroups 独立限制 CPU、内存、磁盘 I/O 等资源使用量。例如
三、特殊场景的共享与隔离
- 存储卷(Volume)
- 通过
-v挂载的宿主机目录或文件是显式共享的,但容器内其他文件仍独立。
- 通过
- 网络模式
host模式下容器共享宿主机 Network Namespace,直接使用宿主机 IP 和端口。
总结
| 资源类型 | 是否独立 | 依赖技术 |
|---|---|---|
| 内核 | 共享 | 无 |
| 进程树 | 独立 | PID Namespace |
| 文件系统 | 独立 | Mount Namespace + rootfs |
| 网络栈 | 独立 | Network Namespace |
| CPU/内存限制 | 独立 | Cgroups |
| 硬件设备 | 共享/可控 | --device 参数 |
通过合理配置 Namespace 和 Cgroups,Docker 在轻量级虚拟化中平衡了隔离性与性能。如需完全隔离内核,需使用 Kata Containers 等沙箱技术。

浙公网安备 33010602011771号