在Ubuntu系统中,可以通过命令行参数、Docker Compose、Daemon配置文件等方式设置Docker容器的资源限制(包括CPU、内存、磁盘I/O等),以下是具体操作:
CPU限制用于控制容器对宿主机CPU资源的占用,常用参数如下:
--cpus=<value>:限制容器可使用的CPU核心数(支持小数,如0.5表示半核)。例如,限制容器最多使用2个CPU核心:docker run --cpus=2 ubuntu:latest /bin/bash
--cpu-shares=<value>:设置CPU份额权重(默认1024),用于多容器竞争CPU时的优先级分配。例如,设置容器CPU权重为512(仅为默认的一半):docker run --cpu-shares=512 ubuntu:latest /bin/bash
--cpuset-cpus="<cores>":指定容器可运行的CPU核心(如0,1表示仅使用第0、1核心,0-3表示使用0至3核心):docker run --cpuset-cpus="0,1" ubuntu:latest /bin/bash
--cpu-period=<value> + --cpu-quota=<value>:精细控制CPU时间配额(--cpu-period为调度周期,默认100ms=100000μs;--cpu-quota为周期内允许使用的CPU时间)。例如,限制容器CPU使用率为50%(每100ms最多用50ms):docker run --cpu-period=100000 --cpu-quota=50000 ubuntu:latest /bin/bash
内存限制用于防止容器过度消耗宿主机内存,常用参数如下:
-m/--memory=<value>:设置容器最大可用物理内存(如512m表示512MB,2g表示2GB)。例如,限制容器内存为512MB:docker run -m 512m ubuntu:latest /bin/bash
--memory-swap=<value>:设置内存+交换空间(Swap)的总限制(单位同内存)。若设为-1,则表示不限制Swap使用(默认值);若设为与-m相同的值,则禁止使用Swap(推荐)。例如,限制内存512MB且不使用Swap:docker run -m 512m --memory-swap=512m ubuntu:latest /bin/bash
--memory-reservation=<value>:设置内存软限制(默认为-m值的50%),用于系统压力大时的资源回收触发条件。例如,设置内存硬限制500MB、软限制200MB:docker run -m 500m --memory-reservation=200m ubuntu:latest /bin/bash
--kernel-memory=<value>:限制容器内核内存使用(无法交换到Swap,单位同内存)。例如,限制内核内存为50MB:docker run --kernel-memory 50M ubuntu:latest /bin/bash
通过--device-read-bps(读取速率)、--device-write-bps(写入速率)参数限制容器对指定设备的I/O速度(单位:字节/秒,如1mb=1MB/s)。例如,限制容器对/dev/sda的写入速率为30MB/s:
docker run --device-write-bps=/dev/sda:30MB ubuntu:latest /bin/bash
Docker原生不直接支持网络带宽限制,但可通过cgroups工具(如tc)实现。例如,使用tc限制容器网络带宽(需提前安装iproute2包):
# 创建队列规则
tc qdisc add dev eth0 root handle 1: htb
# 添加子类并设置带宽限制(如100Mbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# 将容器流量关联到子类(需获取容器PID)
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst <容器IP> flowid 1:1
若使用Docker Compose管理容器,可在docker-compose.yml文件的deploy.resources字段中配置资源限制(适用于Swarm模式)。例如:
version: '3'
services:
myservice:
image: ubuntu:latest
deploy:
resources:
limits:
cpus: '0.5' # 限制CPU为0.5核
memory: 512M # 限制内存为512MB
reservations:
cpus: '0.25' # 预留0.25核CPU
memory: 256M # 预留256MB内存
部署时使用docker stack deploy -c docker-compose.yml <stack_name>命令。
若需为所有容器设置默认资源限制,可修改Docker Daemon配置文件(/etc/docker/daemon.json),添加以下内容:
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"exec-opts": ["native.cgroupdriver=systemd"]
}
修改后需重启Docker服务使配置生效:
sudo systemctl restart docker
该配置可设置默认文件描述符限制(如nofile),避免容器占用过多文件句柄。
docker stats <容器ID/名称>实时查看容器的CPU、内存、网络等使用情况。docker inspect <容器ID>查看容器的详细资源限制配置(如HostConfig中的Memory、NanoCpus字段)。以上方法可根据实际需求组合使用,例如同时限制CPU、内存和磁盘I/O,确保容器运行稳定且不影响宿主机及其他容器。