Docker在CentOS上的资源限制设置方法
在CentOS系统中,Docker容器的资源限制主要通过命令行参数、Docker Compose、cgroups配置及Daemon全局配置等方式实现,覆盖CPU、内存、磁盘I/O、网络带宽等核心资源维度,避免容器过度占用宿主机资源导致系统不稳定。
docker run -it --cpus=2 centos:latest /bin/bash(限制容器使用2个CPU核心)。docker run -it --cpuset-cpus="0,2" centos:latest /bin/bash(容器仅能使用CPU 0和2)。docker run -it --cpu-shares=512 centos:latest /bin/bash(权重为默认的一半,资源不足时占用更少CPU时间)。docker run -it --memory=512m centos:latest /bin/bash(限制内存为512MB)。--memory=<物理内存> --memory-swap=<物理内存+交换空间>)。docker run -it --memory=512m --memory-swap=1g centos:latest /bin/bash(物理内存512MB+交换空间512MB,总和1GB)。docker run -it --memory=1g --memory-reservation=512m centos:latest /bin/bash(最大1GB,预留512MB)。docker run -it --memory=512m --oom-kill-disable centos:latest /bin/bash。docker run -it --blkio-weight=500 centos:latest /bin/bash(中等I/O权重)。<设备路径>:<速率>,如/dev/sda)。docker run -it --blkio-throttle-read-bps-device=/dev/sda:1mb --blkio-throttle-write-bps-device=/dev/sda:1mb centos:latest /bin/bash(限制/dev/sda设备的读写带宽为1MB/s)。Docker原生不直接支持网络带宽限制,但可通过**–device-read-bps**/–device-write-bps参数限制容器对特定网络设备的读写速度(需结合网络模式使用)。
示例:docker run -it --device-read-bps=eth0:1mb --device-write-bps=eth0:1mb centos:latest /bin/bash(限制eth0网卡的读写带宽为1MB/s)。
通过docker-compose.yml文件可批量管理容器的资源限制,适用于生产环境的多容器部署。示例如下:
version: '3'
services:
web:
image: nginx:latest
deploy:
resources:
reservations: # 最低资源预留(系统保证)
cpus: '0.5' # 至少0.5个CPU核心
memory: 256M # 至少256MB内存
limits: # 最大资源限制(容器不能超过)
cpus: '1' # 最多1个CPU核心
memory: 512M # 最多512MB内存
使用docker-compose up -d启动服务后,Compose会自动应用上述资源限制。
Docker底层依赖Linux cgroups(控制组)实现资源隔离,可通过直接操作cgroups文件系统进行更精细的调整(需root权限)。
容器启动后,Docker会自动在/sys/fs/cgroup/下创建对应的cgroup目录(如cpu/docker/<容器ID>、memory/docker/<容器ID>)。
示例:ls /sys/fs/cgroup/cpu/docker/(查看所有容器的CPU cgroup路径)。
echo 50000 > /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_period_us
echo 536870912 > /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
修改后立即生效,但容器重启后会恢复默认值,需通过脚本或自动化工具持久化配置。
若需为所有容器设置默认资源限制,可修改Docker守护进程的配置文件/etc/docker/daemon.json(若文件不存在则新建),添加以下内容:
{
"default-ulimits": {
"memlock": { // 限制内存锁定大小(防止容器锁住过多内存)
"Name": "memlock",
"Hard": -1, // 硬限制(-1表示无限制)
"Soft": -1 // 软限制(-1表示无限制)
},
"nproc": { // 限制进程数
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
},
"nofile": { // 限制文件描述符数量
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
},
"exec-opts": ["native.cgroupdriver=systemd"] // 使用systemd作为cgroup驱动(推荐)
}
修改后重启Docker服务使配置生效:
sudo systemctl restart docker
注意:
default-ulimits设置的限制会被docker run命令中的参数覆盖。
--cpus、--memory)需在创建容器时指定,容器运行后无法修改(需删除重建)。docker stats命令实时监控容器资源使用情况(如docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}")。