Docker 资源限制与容器管理
Docker 资源限制与容器管理
一、容器底层技术
Docker 容器依赖于三大核心底层技术:
- Namespace:资源隔离
- Cgroups:资源限制
- Union File System:镜像分层存储与管理
Namespace 详解
Namespace 将全局系统资源封装成独立的视图,实现进程间的资源隔离
Namespace 类型 | 作用 |
---|---|
UTS | 隔离主机名与域名 |
IPC | 隔离进程间通信(信号量、消息队列、共享内存) |
PID | 隔离进程ID |
Mount | 隔离文件系统挂载点 |
User | 隔离用户和用户组ID |
Network | 隔离网络设备、IP、端口等 |
二、Cgroups 资源控制
Cgroups 是 Linux 内核提供的机制,用于限制、记录和隔离进程组对物理资源的使用
[root@docker ~]# docker run --name mycentos1 -itd -m 200M centos:7# 查看 cgroup 目录结构
[root@docker ~]# ls /sys/fs/cgroup/# 查看容器内存限制
[root@docker ~]# cat /sys/fs/cgroup/memory/docker/87b8ed6122a0010ea9528cd63eccd7cefb06872d0cf52b837d1493856a32b68b/memory.limit_in_bytes
三、内存限制
常用参数
参数 | 说明 |
---|---|
-m, --memory | 限制物理内存使用量 |
--memory-swap | 物理内存 + Swap 总限制 |
--memory-reservation | 软性内存限制 |
--kernel-memory | 内核内存限制 |
--oom-kill-disable | 禁用 OOM Killer |
--memory-swappiness | 控制 Swap 使用倾向(0-100) |
--oom-score-adj | OOM 优先级(-1000~1000) |
示例
[root@docker ~]# vim Dockerfile
[root@docker ~]# docker build -t stress .
FROM ubuntu:trusty
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress", "--verbose"]
# 限制内存为50M
[root@docker ~]# docker run -it --name a1 --rm -m 50M stress --vm 1 --vm-bytes 30M# 限制内存 + Swap 总和使用
[root@docker ~]# docker run -it --name a1 --rm -m 50M --memory-swap=100M stress --vm 1 --vm-bytes 70M# 设置内存软限制
[root@docker ~]# docker run -it -m 100M --memory-reservation 50M centos:7# 禁用 OOM Killer
[root@docker ~]# docker run -it -m 100M --oom-kill-disable centos:7
四、CPU 限制
常用参数
参数 | 说明 |
---|---|
-c, --cpu-shares | CPU 份额(相对权重) |
--cpu-period | CFS 调度周期(微秒) |
--cpu-quota | CFS 周期内最多使用时间 |
--cpuset-cpus | 绑定使用的 CPU 核心 |
--cpuset-mems | 绑定使用的内存节点(NUMA) |
示例
分别开三个终端输入代码
创建两个容器a1和a2,a1的cpu权重为512,a2的cpu权重为1024,,同时将Docker host上的cpu全部占满
# 设置 CPU 权重
[root@docker ~]# docker run -it --name a1 --rm -c 512 stress --cpu 4
[root@docker ~]# docker run -it --name a2 --rm -c 1024 stress --cpu 4
分别开两个终端输入代码
参数-cpuset-cpus用于设置容器可以使用的CPU核数,示例如下,将容器中的工作进程运行在cpu1和cpu3上面
[root@docker ~]# docker run -it --name a1 --rm --cpuset-cpus="1,3" stress --vm 2 --vm-bytes 100M
五、Block IO 限制
常用参数
参数 | 说明 |
---|---|
--blkio-weight | 块设备 IO 权重(10-1000) |
--blkio-weight-device | 指定设备的 IO 权重 |
--device-read-bps | 限制设备读取速率 |
--device-write-bps | 限制设备写入速率 |
--device-read-iops | 限制设备读取 IOPS |
--device-write-iops | 限制设备写入 IOPS |
示例
默认情况下,所有的容器都是平级的读写磁盘,可以通过–blkio-weight参数设置容器读写磁盘的优先级
两个结果对比并不明显,因为Docker host不是那么的繁忙
# 设置 IO 权重
[root@docker ~]# docker run --name test1 -it --rm --blkio-weight 100 centos:7
[root@64dd6f1517e8 /]# time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct
# 设置 IO 权重
[root@docker ~]# docker run --name test2 -it --rm --blkio-weight 1000 centos:7
[root@258187a4420f /]# time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct
默认情况下,Docker对容器的写速度是没有限制的,我们可以使用–device-write-bps参数限制容器对硬盘些速度的限制
# 限制写入速率
[root@docker ~]# docker run --name test3 -it --rm --device-write-bps /dev/sda:1mb centos:7
[root@3d2be40427f0 /]# time dd if=/dev/zero of=test.out bs=1M count=20 oflag=direct
六、总结
- Namespace 实现资源隔离,包括 UTS、IPC、PID、Mount、User、Network 六种
- Cgroups 实现资源限制,相关配置位于
/sys/fs/cgroup/
- Docker 容器资源限制仅影响实际资源使用,容器内仍“看到”完整主机资源视图
- 资源限制类型包括:内存、CPU、Block IO,可通过
docker run
参数灵活配置