Ubuntu下Docker资源限制设置方法
在Ubuntu系统中,可以通过多种方式为Docker容器设置资源限制(包括CPU、内存、磁盘I/O等),确保容器不会过度消耗宿主机资源,保障系统稳定性。以下是具体设置方式:
docker run命令直接设置(临时生效)这是最常用的临时限制方式,适用于单次启动容器的场景。
--cpus=<value>:限制容器可使用的CPU核心数(如--cpus=2表示最多使用2个核心);--cpu-shares=<value>:设置CPU相对权重(默认1024,值越大优先级越高,如--cpu-shares=512表示权重为默认的一半);--cpuset-cpus="<cores>":绑定容器到指定CPU核心(如--cpuset-cpus="0,2"表示仅使用第0和第2核心)。-m/--memory=<size>:限制容器最大物理内存使用量(如-m 512m表示最多使用512MB内存);--memory-swap=<size>:限制内存+交换空间(Swap)的总和(如-m 512m --memory-swap=1g表示内存512MB+Swap 512MB;若设为-1则Swap无限制)。--device-read-bps=<device>:<rate>:限制设备读取速率(如--device-read-bps=/dev/sda:1mb表示/dev/sda读取速率不超过1MB/s);--device-write-bps=<device>:<rate>:限制设备写入速率(如--device-write-bps=/dev/sda:1mb表示/dev/sda写入速率不超过1MB/s);--blkio-weight=<value>:设置块设备I/O权重(默认100,范围10-1000,值越大优先级越高)。--network=<mode>:指定网络模式(如--network=bridge为默认桥接模式,--network=host共享宿主机网络以减少开销);tc(Traffic Control)工具可实现更细粒度的网络带宽限制(需手动配置)。示例命令:
docker run -it --cpus=2 -m 512m --memory-swap=1g --device-read-bps=/dev/sda:1mb ubuntu:latest /bin/bash
通过docker-compose.yml文件定义资源限制,便于批量管理和版本控制。
在services模块下添加deploy.resources字段,支持reservations(最低保障)和limits(最高限制):
version: '3'
services:
web:
image: nginx
deploy:
resources:
reservations:
cpus: '0.5' # 最低保障0.5个CPU核心
memory: 256M # 最低保障256MB内存
limits:
cpus: '1' # 最高使用1个CPU核心
memory: 512M # 最高使用512MB内存
启动服务时使用docker-compose up -d命令,资源限制将自动生效。
若需要为所有容器设置默认资源限制,可修改Docker守护进程的配置文件/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,
"Soft": -1
}
},
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
修改后重启Docker服务使配置生效:
sudo systemctl restart docker
Docker底层依赖Linux cgroups实现资源限制,可通过直接操作cgroups文件系统实现更细粒度的调整(如修改已运行容器的限制)。
docker inspect --format='{{.HostConfig.CgroupParent}}' <container_id>
/sys/fs/cgroup/memory/docker/<container_id>),修改memory.limit_in_bytes文件:echo 536870912 > /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes # 限制为512MB(512*1024*1024)
/sys/fs/cgroup/cpu/docker/<container_id>),修改cpu.cfs_quota_us和cpu.cfs_period_us文件(quota/quota_period即为CPU配额比例,如200000/100000表示50%的CPU时间):echo 200000 > /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_period_us
docker stats命令实时查看容器资源占用情况,根据实际需求调整限制参数;