Docker 容器隔离的资源类型
Docker 通过 Linux 内核的多种机制实现了资源的隔离和限制,以下是 Docker 容器封闭的主要资源类型:
1. 进程隔离
- 使用 Linux namespaces 实现进程隔离
- 每个容器有自己的 PID namespace,看不到主机和其他容器的进程
docker top <container>
只能看到容器内的进程
2. 文件系统隔离
- 使用 Mount namespace 提供独立的文件系统视图
- 每个容器有自己独立的根文件系统
- 通过 UnionFS (Overlay2等)实现分层文件系统
3. 网络隔离
- 使用 Network namespace 提供独立网络栈
- 每个容器有自己的网络接口、IP地址、路由表等
- 可通过 bridge、host、none 等网络模式配置
4. 用户隔离
- 使用 User namespace (可选启用)
- 容器内的root用户在主机上映射为非root用户
- 增强安全性,防止容器内特权提升影响主机
5. 进程间通信(IPC)隔离
- 使用 IPC namespace 隔离System V IPC和POSIX消息队列
- 容器间默认不能通过共享内存等方式通信
6. 主机名和域名隔离
- 使用 UTS namespace 提供独立的主机名和域名
- 每个容器可以有自己的hostname
7. 资源限制(cgroups)
- CPU限制:通过cgroups限制CPU份额和核心使用
- 内存限制:设置内存和swap使用上限
- I/O限制:限制磁盘读写带宽
- 设备访问:控制对设备文件的访问权限
8. 其他安全隔离
- Capabilities:限制容器内进程的Linux能力
- Seccomp:限制系统调用
- SELinux/AppArmor:强制访问控制
不完全隔离的资源
- 系统时间:默认与主机共享(可通过--uts=host单独配置)
- 某些/proc和/sys文件:部分系统信息未被完全隔离
- 内核模块:容器共享主机内核
Docker通过这些隔离机制提供了轻量级的虚拟化环境,但需要注意的是,容器并不是完全隔离的虚拟机,某些系统资源仍然是共享的。