在运维工作中,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 规则实现端口转发和网络策略。


未完全隔离的资源

容器与宿主机共享以下资源,需特别注意:

  1. 内核空间(所有容器使用同一内核)
  2. 时间/proc/timer_list,可通过 --time=host 隔离)
  3. 某些 /proc 文件(如 /proc/sys/proc/net
  4. 硬件时钟hwclock
  5. 内核模块(需 --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 增强安全

posted @ 2025-07-23 15:33  天道酬勤zjh  阅读(13)  评论(0)    收藏  举报