Docker Compose:限制资源
accttodo 12/31/2025 运维容器Docker
目录
# Docker Compose:限制资源
Docker Compose 通过配置文件和底层容器技术实现了对容器资源的精细化限制,资源分类如下:
# 一、资源限制分类
CPU 资源限制
cpus
:直接指定容器可使用的 CPU 核心数上限,如cpus: "1.5"
表示最多使用 1.5 个 CPU 核心。cpu_shares
:通过相对权重分配 CPU 时间片(默认 1024),值越高优先级越高,如cpu_shares: 512
表示权重为默认值的一半。cpu_quota
与cpu_period
:组合使用定义 CPU 时间分配周期。例如cpu_period: 100000
(100ms 周期)和cpu_quota: 50000
(每个周期最多使用 50ms CPU 时间)等效于限制为 0.5 核。
内存资源限制
memory
:设置硬性内存上限(如memory: 512M
),超出限制会触发 OOM Killer 终止容器。memory_reservation
:定义内存软限制,系统优先保证此值但允许短暂超出。
# 二、文件版本字段结构差异
根据Docker Compose文件格式版本的演进历史,不同版本中资源限制的字段结构存在差异。以下是具体分析:
# 1. 不含resources
字段的版本
Docker Compose文件格式版本1(v1) 中,资源限制不使用resources
字段,而是通过直接指定参数(如cpu_shares
、mem_limit
)实现。例如:
web:
image: nginx
cpu_shares: 512 # CPU权重(默认1024代表1核)
mem_limit: 512m # 内存硬限制
1
2
3
4
2
3
4
# 2. 使用顶层resources
字段的版本
Docker Compose文件格式版本2.x(v2) 开始,资源限制被统一到resources
字段下,支持limits
(硬限制)和reservations
(软预留)。例如:
services:
app:
image: nginx
resources:
limits:
cpus: "0.5"
memory: 256M
reservations:
memory: 128M
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3. 使用deploy.resources
字段的版本
Docker Compose文件格式版本3.x及以上(v3+) 引入了deploy
字段以支持Swarm集群部署,资源限制需在deploy.resources
中定义。例如:
services:
app:
image: nginx
deploy:
resources:
limits:
cpus: "1.0"
memory: 1G
reservations:
cpus: "0.2"
memory: 512M
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 三、版本选择与环境适配建议
# 1. 单机开发环境
推荐v2/v3的resources
字段
- v3文件引入的顶层字段
deploy
原本设计用于Swarm集群环境,但在单机模式下部分功能仍可用,需结合实际环境测试。 - v2文件引入的顶层字段
resources
,v3文件在单机模式下也可以部分兼容顶层。
# 2. Swarm集群环境
强制使用v3+的deploy.resources
:Swarm模式下需通过deploy
字段定义资源限制,以实现服务调度和动态扩展。
# 3. 环境适配注意事项
- 版本兼容性:在单机模式下,不同文件版本中
resources
和deploy.resources
使用,需结合实际环境测试。 - 字段优先级:若同时存在
resources
和deploy.resources
,Swarm模式下优先使用deploy.resources
。 - 旧版迁移:从v1升级到v2/v3时需替换旧参数(如
mem_limit
→resources.limits.memory
)。
通过合理选择文件格式版本和字段结构,可灵活适配单机与集群场景下的资源管理需求。
# 四、底层实现机制
Docker Compose 的资源限制依赖 Linux cgroups 实现:
- CPU 控制通过
cpu
和cpuacct
子系统,将配置转换为 cgroup 参数(如cpu.cfs_quota_us
和cpu.cfs_period_us
)。 - 内存限制通过
memory
子系统设置memory.limit_in_bytes
,并触发内核 OOM Killer 在超限时终止进程。
# 五、验证与调试
- 运行
docker stats
实时监控资源使用情况。 - 检查容器的 cgroup 文件:
cat /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_quota_us cat /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
1
2