Ubuntu中Docker资源限制的常用方法
在Ubuntu系统中,可以通过多种方式为Docker容器设置资源限制(包括CPU、内存、磁盘I/O、网络带宽等),以防止容器过度消耗系统资源,保障宿主机及其他容器的稳定运行。以下是具体实现方式:
CPU限制主要通过核心数分配、权重设置、时间配额及核心绑定等方式实现,适用于控制容器的CPU使用优先级和上限。
使用--cpus
参数直接指定容器可使用的最大CPU核心数(支持小数,如0.5
表示半核)。例如,限制容器最多使用2个CPU核心:
docker run --cpus=2 ubuntu:latest
该参数直观易用,适用于需要明确核心数的场景。
通过--cpu-shares
参数设置容器的CPU相对权重(默认值为1024)。权重越高,容器在CPU资源紧张时获得的份额越多。例如,设置权重为512(约为默认的一半):
docker run --cpu-shares=512 ubuntu:latest
注意:该参数仅在CPU资源不足时生效,若宿主机有足够CPU资源,所有容器均可获得足额分配。
通过--cpu-period
(调度周期,单位:微秒,默认100000μs=100ms)和--cpu-quota
(周期内CPU配额,单位:微秒)组合,精确控制容器的CPU使用比例。例如,限制容器CPU使用不超过50%(每100ms最多使用50ms):
docker run --cpu-period=100000 --cpu-quota=50000 ubuntu:latest
该方式适用于需要精细化调整的场景。
使用--cpuset-cpus
参数将容器绑定到指定的CPU核心(如0,1
表示核心0和1,0-3
表示核心0至3)。例如,限制容器仅使用核心0:
docker run --cpuset-cpus=0 ubuntu:latest
该参数适用于需要隔离CPU资源的场景(如NUMA架构),减少核心间的竞争。
内存限制通过硬上限、软预留及交换空间等参数设置,防止容器占用过多内存导致系统OOM(Out of Memory)。
使用-m
或--memory
参数指定容器可使用的最大内存(支持M
/G
等单位)。例如,限制容器最多使用512MB内存:
docker run -m 512m ubuntu:latest
若容器内存使用超过该值,Docker会触发OOM Killer终止容器(除非配置了交换空间)。
--memory-swap
参数设置“内存+交换空间”的总上限(格式:内存+交换空间
,如1g
表示1GB内存+1GB交换空间)。例如,限制内存512MB、交换空间512MB(总计1GB):
docker run -m 512m --memory-swap=1g ubuntu:latest
注意:若--memory-swap
设置为-1
,则表示交换空间无限制(默认值)。
--memory-reservation
参数设置内存软预留(默认值为--memory
的50%),作为内存不足时的预警阈值。例如,设置内存上限500MB、预留200MB:
docker run -m 500m --memory-reservation=200m ubuntu:latest
该参数不会限制最大内存使用,但会在内存争用时触发Docker回收机制,尝试将容器内存缩减至预留值。
内核内存(如slab、sockets等)无法交换到磁盘,过度使用可能导致系统服务阻塞。使用--kernel-memory
参数限制内核内存使用(如50MB):
docker run -m 500m --kernel-memory=50m ubuntu:latest
该参数需配合-m
使用,且不能超过-m
的值。
通过blkio
子系统限制容器的磁盘读写速度,防止某个容器独占磁盘资源。
使用--device-read-bps
(读取速度,单位:字节/秒)和--device-write-bps
(写入速度,单位:字节/秒)参数,限制容器对指定设备的读写速率。例如,限制对/dev/sda
的写入速度为1MB/s:
docker run --device-write-bps=/dev/sda:1mb ubuntu:latest
该参数适用于需要控制磁盘IO的场景(如数据库、日志服务等)。
使用--device-read-iops
(读取IOPS)和--device-write-iops
(写入IOPS)参数,限制容器对指定设备的IO操作次数(每秒)。例如,限制对/dev/sda
的读取IOPS为1000:
docker run --device-read-iops=/dev/sda:1000 ubuntu:latest
该参数适用于SSD等高速设备,更精准地控制IO负载。
Docker本身不直接支持网络带宽限制,但可通过tc
(Traffic Control)命令结合cgroups
实现。
以限制容器<container_id>
的网络带宽为例(如10Mbps):
# 进入容器的网络命名空间
nsenter -t <container_pid> -n
# 添加流量控制规则(出方向,限制为10Mbps)
tc qdisc add dev eth0 root tbf rate 10mbit latency 50ms burst 1540
注意:该方法需要手动操作,适用于需要精细化控制的场景。
若需要为所有容器设置默认资源限制,可修改Docker守护进程的配置文件/etc/docker/daemon.json
(需重启Docker服务生效)。例如,设置默认内存限制为512MB、CPU核心数为1:
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"exec-opts": ["native.cgroupdriver=systemd"]
}
修改后执行sudo systemctl restart docker
使配置生效。
使用docker update
命令可动态调整已运行容器的资源限制(无需重启容器)。例如,将容器<container_name>
的内存限制调整为1GB、CPU权重调整为2048:
docker update -m 1g --cpu-shares=2048 <container_name>
该命令适用于需要临时调整资源需求的场景。
以上方法覆盖了Docker容器资源限制的主要场景,可根据实际需求选择合适的方式组合使用。例如,同时限制CPU核心数、内存上限及磁盘IO速度,以实现全面的资源管控。