Docker 在管理容器资源时,利用了 Linux 内核的 Control Groups(简称 cgroups)机制。cgroups 是 Linux 系统内核提供的一种资源限制、优先级分配和会计功能的技术,它允许系统管理员对一组进程进行资源限制和账户统计。
在 Docker 实战中,cgroups 的主要作用包括:
-
资源限制:
- Docker 可以通过 cgroups 设置每个容器可以使用的 CPU 时间份额、内存总量、磁盘 I/O 速率等,确保一个容器不会消耗掉全部可用资源,从而避免资源争抢和单个容器导致宿主机性能下降的问题。
-
优先级控制:
- cgroups 还可以用来设置不同容器的 CPU 和 IO 优先级,以便在高负载情况下为关键服务或任务提供更高的响应速度。
-
资源统计:
- Docker 使用 cgroups 收集各个容器对 CPU、内存、磁盘和网络资源的实际使用情况,这些信息对于监控和优化容器工作负载非常重要。
-
OOM Killer 管理:
- 当系统内存不足时,Linux OOM Killer(Out Of Memory Killer)会选择性地终止占用内存最多的进程以防止系统崩溃。Docker 利用 cgroups 来确定哪些容器内的进程是潜在的目标,并根据容器配置来调整其被 OOM Killer 选中的可能性。
例如,在创建和运行 Docker 容器时,可以通过 -m
参数限制容器的最大内存使用量,如下所示:
docker run -it --name my_container -m 512M ubuntu:latest
在这个命令中,-m 512M
指定了容器最多只能使用 512 MB 的内存。此外,还可以通过其他类似的选项来限制 CPU 使用率和其他资源。
总之,cgroups 是 Docker 实现资源隔离和管理的基础,使得每个容器能够拥有独立且可控的资源环境,这对于构建稳定、安全且高效的容器化应用至关重要。