Debian系统中Docker资源限制的常用方法
在Debian系统上,可以通过多种方式为Docker容器设置资源限制(包括CPU、内存、磁盘I/O等),以下是具体实现方式及示例:
docker run命令参数(临时生效)这是最直接的资源限制方式,适用于单次启动容器的场景。
--cpus=<value>:限制容器最多使用的CPU核心数(支持小数,如1.5表示1.5核)。docker run --cpus=2 debian:latest /bin/bash(限制为2核)。--cpu-shares=<value>:设置CPU使用权重(默认1024),仅在资源竞争时生效(数值越大,优先级越高)。docker run --cpu-shares=512 nginx(权重为512)。--cpuset-cpus="<cpu-list>":将容器绑定到指定CPU核心(如0,2或0-2)。docker run --cpuset-cpus="0,2" nginx(仅使用CPU 0和2)。-m/--memory=<size>:设置容器最大内存使用量(如512m表示512MB,2g表示2GB)。docker run -m 512m debian:latest /bin/bash(限制为512MB)。--memory-swap=<size>:设置内存+swap的总限制(--memory-swap=0表示无限制,默认等于--memory的两倍)。docker run -m 512m --memory-swap=1g debian:latest(内存512MB+swap 512MB,总计1GB)。--device-read-bps=<device>:<rate>:限制设备读取速率(如/dev/sda:1mb表示每秒1MB)。--device-write-bps=<device>:<rate>:限制设备写入速率。--blkio-weight=<value>:设置块设备I/O权重(默认100,范围1-10000)。docker run --blkio-weight=500 nginx(权重为500)。通过docker-compose.yml文件定义资源限制,便于团队协作和环境一致性。
version: '3'
services:
web:
image: nginx:latest
deploy:
resources:
limits: # 硬限制(容器不能超过的阈值)
cpus: '1' # 最多使用1核CPU
memory: 512M # 最多使用512MB内存
reservations: # 软限制(容器启动时的最低保障)
cpus: '0.5' # 至少保证0.5核CPU
memory: 256M # 至少保证256MB内存
启动服务:docker-compose up -d。
若需要为所有容器设置默认资源限制,可修改Docker Daemon的配置文件/etc/docker/daemon.json。
{
"exec-opts": ["native.cgroupdriver=systemd"], // 使用systemd作为cgroup驱动(推荐)
"default-ulimits": {
"nofile": { // 限制文件描述符数量
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
},
"memlock": { // 限制内存锁定大小
"Name": "memlock",
"Hard": -1, // -1表示无限制
"Soft": -1
}
},
"log-driver": "json-file",
"log-opts": {
"max-size": "100m", // 单个日志文件最大100MB
"max-file": "3" // 最多保留3个日志文件
}
}
修改后重启Docker生效:sudo systemctl restart docker。
通过Linux cgroups直接操作,适合需要更精细调整的场景(如调整CPU调度周期)。
sudo cgcreate -g cpu:/my_container
cpu.cfs_period_us=100000ms,cpu.cfs_quota_us=50000ms,表示容器最多使用50%的CPU时间):echo 100000 > /sys/fs/cgroup/cpu/my_container/cpu.cfs_period_us
echo 50000 > /sys/fs/cgroup/cpu/my_container/cpu.cfs_quota_us
<container_id>为实际容器ID):sudo cgclassify -g cpu:/my_container $(docker inspect --format '{{.Pid}}' <container_id>)
sudo cgcreate -g memory:/my_container
echo 2147483648 > /sys/fs/cgroup/memory/my_container/memory.limit_in_bytes # 2GB
sudo cgclassify -g memory:/my_container $(docker inspect --format '{{.Pid}}' <container_id>)
若通过systemd管理Docker服务,可在服务文件中设置资源限制(适用于长期运行的Docker服务)。
/etc/systemd/system/docker.service.d/override.conf(若目录不存在则创建):[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd --default-ulimits nofile=65536:65536
sudo systemctl daemon-reload
sudo systemctl restart docker
--memory-swap),需升级Docker至最新版本。