在运维工作中,docker封闭了哪些资源?
在 Docker 容器化技术中,资源隔离(Isolation) 是通过 Linux 内核特性实现的,主要依赖 Namespace(命名空间) 和 Cgroups(控制组) 两大机制。以下是 Docker 封闭的核心资源及技术原理:
一、Namespace(进程级隔离)
每个容器拥有独立的命名空间,实现环境隔离:
| Namespace 类型 | 隔离资源 | Docker 参数 |
|---|---|---|
| PID Namespace | 进程树(容器内 PID=1 进程) | --pid=host 可禁用 |
| NET Namespace | 网络栈(IP、端口、路由、网卡) | --network=host 可共享主机网络 |
| MNT Namespace | 文件系统挂载点(如 /proc) |
--volume 可共享目录 |
| UTS Namespace | 主机名和域名(hostname) |
--hostname 设置容器主机名 |
| IPC Namespace | 进程间通信(信号量、共享内存) | --ipc=host 可共享主机 IPC |
| User Namespace | 用户和用户组映射(容器内 root 非真 root) | --userns=host 可禁用 |
✅ 示例:容器内执行
ps aux仅看到自身进程,无法查看宿主机进程。
二、Cgroups(资源限制)
控制组限制容器对物理资源的使用:
| Cgroup 子系统 | 限制能力 | Docker 参数示例 |
|---|---|---|
| CPU | CPU 使用率、核绑定、调度优先级 | --cpus=1.5 --cpu-shares=512 |
| Memory | 内存+Swap 使用上限、OOM 优先级 | --memory=500m --memory-swap=1g |
| Block I/O | 磁盘读写带宽、IOPS 限制 | --device-write-bps=/dev/sda:10mb |
| Device | 设备访问权限(白名单机制) | --device=/dev/ttyUSB0:/dev/tty0 |
| PIDs | 容器内最大进程数 | --pids-limit=100 |
| cgroupv2+ | 统一层级限制(如 CPU/内存混合压力) | 需内核 ≥4.15 |
✅ 示例:
docker run --memory=1g的容器无法超额使用内存,OOM 时被内核杀死。
三、文件系统隔离
通过联合文件系统(UnionFS)实现独立环境:
# 查看容器文件系统层
docker inspect <容器ID> --format='{{.GraphDriver.Data}}'
- 镜像层:只读层(基础镜像)
- 容器层:读写层(运行时修改)
- Volume:持久化数据卷(绕过 UnionFS)
四、安全隔离
| 机制 | 作用 |
|---|---|
| Capabilities | 裁剪 Linux 能力(如禁止 CAP_SYS_ADMIN) |
| Seccomp | 限制系统调用(默认配置文件屏蔽 44+ 高危调用) |
| AppArmor/SELinux | 强制访问控制(MAC) |
| rootless 模式 | 非 root 用户运行 Docker 守护进程 |
🔒 安全提示:默认配置下容器不具备以下能力:
- 修改宿主机内核参数
- 装载文件系统
- 直接访问硬件设备
五、网络隔离
| 网络模式 | 隔离程度 |
|---|---|
bridge (默认) |
独立网卡、IP、端口空间(通过 NAT 通信) |
none |
无网络接口 |
container:<name> |
共享其他容器的网络栈 |
host |
无隔离(直接使用宿主机网络) |
🌐 关键点:容器通过
iptables规则实现端口转发和网络策略。
未完全隔离的资源
容器与宿主机共享以下资源,需特别注意:
- 内核空间(所有容器使用同一内核)
- 时间(
/proc/timer_list,可通过--time=host隔离) - 某些 /proc 文件(如
/proc/sys、/proc/net) - 硬件时钟(
hwclock) - 内核模块(需
--privileged加载模块)
排查资源隔离问题
# 1. 查看容器的 Namespace ID
ls -l /proc/$(docker inspect -f '{{.State.Pid}}' <容器ID>)/ns
# 2. 检查 Cgroups 限制
cat /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
# 3. 验证 Capabilities
docker exec <容器ID> capsh --print
# 4. 查看 Seccomp 规则
docker inspect --format='{{.HostConfig.SecurityOpt}}' <容器ID>
全景图:Docker 资源隔离架构
graph LR
A[容器] --> B[Namespace]
A --> C[Cgroups]
A --> D[UnionFS]
B --> E[进程/网络/文件系统隔离]
C --> F[CPU/内存/磁盘限制]
D --> G[镜像分层+写时复制]
H[Linux 内核] --> B & C & D
掌握这些隔离机制,才能有效设计安全的容器架构、定位资源冲突问题。生产环境中,务必通过 Cgroups 限制资源并启用 Seccomp 增强安全。
浙公网安备 33010602011771号