插件窝 干货文章 Docker的进程和Cgroup概念详解

Docker的进程和Cgroup概念详解

Docker 容器 进程 限制 156    来源:    2025-04-01

Docker进程与Cgroup概念详解

一、Docker进程模型

1. Docker进程架构

Docker采用客户端-服务器架构,主要包含以下组件:

  • Docker Daemon (dockerd): 常驻后台进程,管理Docker对象(镜像、容器、网络、卷)
  • Docker Client (docker): 命令行工具,与Docker Daemon通信
  • containerd: 负责容器生命周期管理
  • runc: 实际运行容器的轻量级工具

2. 容器进程特点

  • PID 1进程: 容器内第一个启动的进程PID为1,承担init进程职责
  • 进程隔离: 每个容器拥有独立的进程命名空间
  • 进程树可见性: 默认只能看到容器内的进程

3. 查看Docker进程

# 查看宿主机上的Docker相关进程
ps aux | grep docker

# 查看容器内进程
docker top <container_id>

# 查看容器进程在宿主机上的PID
docker inspect --format '{{.State.Pid}}' <container_id>

二、Cgroups (控制组) 详解

1. Cgroups基本概念

Cgroups是Linux内核功能,用于限制、记录和隔离进程组的资源使用,主要包括:

  • 资源限制: CPU、内存、磁盘I/O等
  • 优先级控制: 分配CPU时间、磁盘I/O带宽
  • 资源统计: 测量资源使用量
  • 进程控制: 挂起、恢复进程组

2. Cgroups子系统

子系统 功能
cpu 限制CPU使用
cpuacct 统计CPU使用情况
cpuset 分配独立CPU和内存节点
memory 限制内存使用
devices 控制设备访问
freezer 挂起/恢复进程
net_cls 标记网络数据包
blkio 限制块设备I/O
perf_event 监控性能事件
net_prio 设置网络流量优先级
hugetlb 限制大页内存使用

3. Docker如何使用Cgroups

Docker为每个容器创建Cgroup,默认位于/sys/fs/cgroup/下各子系统的docker目录中。

# 查看容器的Cgroup路径
cat /proc/<container_pid>/cgroup

# 示例输出:
12:memory:/docker/<container_id>
11:devices:/docker/<container_id>
10:blkio:/docker/<container_id>

4. Docker资源限制实现

CPU限制

# 启动容器时限制CPU
docker run -it --cpus="1.5" ubuntu

# 相当于设置
# cpu.cfs_period_us = 100000
# cpu.cfs_quota_us = 150000

内存限制

# 启动容器时限制内存
docker run -it -m 512m ubuntu

# 相当于设置
# memory.limit_in_bytes = 536870912

其他资源限制

# 限制内存和交换分区
docker run -it -m 512m --memory-swap=1g ubuntu

# 限制块设备I/O
docker run -it --device-read-bps /dev/sda:1mb ubuntu

三、实际应用与问题排查

1. 监控容器资源使用

# 查看容器资源使用统计
docker stats <container_id>

# 查看Cgroup中的内存使用
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.usage_in_bytes

2. 常见问题排查

问题1:容器内存不足

# 检查OOM状态
dmesg | grep -i oom

# 检查Cgroup内存限制
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes

问题2:CPU使用率过高

# 查看容器CPU使用率
docker stats --no-stream <container_id>

# 调整CPU配额
echo 50000 > /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_quota_us

3. 高级配置

# 设置CPU共享权重 (默认1024)
docker run -it --cpu-shares=512 ubuntu

# 绑定到特定CPU核心
docker run -it --cpuset-cpus="0,1" ubuntu

# 限制磁盘I/O权重 (100-1000)
docker run -it --blkio-weight=500 ubuntu

四、总结

  1. Docker利用Linux命名空间实现进程隔离,每个容器有独立的进程视图
  2. Cgroups是Docker资源限制的核心机制,控制CPU、内存、I/O等资源
  3. 合理配置Cgroups参数可以优化容器性能,避免资源争用
  4. 通过监控Cgroup文件或docker stats可以了解容器实际资源使用情况

理解Docker进程模型和Cgroups机制,能够帮助您更有效地管理和优化容器化应用。