Docker
Docker 隔离技术
cgroups(控制组)
cgroups 是 Linux 内核提供的一种机制,用于限制、记录和隔离进程组的资源(CPU、内存、磁盘 I/O 等)。通过 cgroups,Docker 可以控制容器使用的 CPU 资源。具体来说,Docker 使用以下两种 CPU 子系统来实现 CPU 隔离:
- cpu.shares:相对权重控制,表示相对 CPU 使用权重。默认值是 1024,值越大,分配的 CPU 时间就越多。它用于不同容器之间的 CPU 时间片的相对分配。
- cpu.cfs_quota_us 和 cpu.cfs_period_us:绝对限制控制。CFS(完全公平调度器)周期和配额设置。通过这两个参数,可以设置容器在一个周期内可以使用的 CPU 时间。比如,设置 cpu.cfs_period_us 为 100000 (100 ms),cpu.cfs_quota_us 为 20000 (20 ms),表示这个容器在每 100 ms 内最多只能使用 20 ms 的 CPU 时间。
配置方法:
# 表示容器最多可以使用 50% 的 CPU 资源
docker run -it --cpus=".5" ubuntu /bin/bash
查看限制配置:
cat /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_quota_us
其他CPU隔离方式:
- CPU共享(CPU Shares): 通过--cpu-shares参数设置容器的CPU权重。
- CPU亲和性(CPU Affinity): 使用--cpuset-cpus参数将容器绑定到特定CPU核心。
命名空间(namespaces)
命名空间提供了进程间的隔离。Docker 使用以下几种命名空间:
- PID 命名空间:隔离进程 ID。
- NET 命名空间:隔离网络接口、IP 地址、防火墙规则等。
- IPC 命名空间:隔离进程间通信机制。
- MNT 命名空间:隔离挂载点。
- UTS 命名空间:隔离主机名和域名。
- User 命名空间:隔离用户和用户组。