Ubuntu中Docker资源限制的常用方法
在Ubuntu系统中,可以通过多种方式为Docker容器设置资源限制(包括CPU、内存、磁盘I/O、网络带宽等),以防止容器过度消耗系统资源,保障宿主机及其他容器的稳定运行。以下是具体实现方式:
一、CPU资源限制
CPU限制主要通过核心数分配、权重设置、时间配额及核心绑定等方式实现,适用于控制容器的CPU使用优先级和上限。
1. 限制CPU核心数(–cpus)
使用--cpus参数直接指定容器可使用的最大CPU核心数(支持小数,如0.5表示半核)。例如,限制容器最多使用2个CPU核心:
docker run --cpus=2 ubuntu:latest
该参数直观易用,适用于需要明确核心数的场景。
2. 设置CPU权重(–cpu-shares)
通过--cpu-shares参数设置容器的CPU相对权重(默认值为1024)。权重越高,容器在CPU资源紧张时获得的份额越多。例如,设置权重为512(约为默认的一半):
docker run --cpu-shares=512 ubuntu:latest
注意:该参数仅在CPU资源不足时生效,若宿主机有足够CPU资源,所有容器均可获得足额分配。
3. 精确控制CPU时间(–cpu-period/–cpu-quota)
通过--cpu-period(调度周期,单位:微秒,默认100000μs=100ms)和--cpu-quota(周期内CPU配额,单位:微秒)组合,精确控制容器的CPU使用比例。例如,限制容器CPU使用不超过50%(每100ms最多使用50ms):
docker run --cpu-period=100000 --cpu-quota=50000 ubuntu:latest
该方式适用于需要精细化调整的场景。
4. 绑定特定CPU核心(–cpuset-cpus)
使用--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)。
1. 设置内存硬上限(–memory/-m)
使用-m或--memory参数指定容器可使用的最大内存(支持M/G等单位)。例如,限制容器最多使用512MB内存:
docker run -m 512m ubuntu:latest
若容器内存使用超过该值,Docker会触发OOM Killer终止容器(除非配置了交换空间)。
2. 设置内存+交换空间上限(–memory-swap)
--memory-swap参数设置“内存+交换空间”的总上限(格式:内存+交换空间,如1g表示1GB内存+1GB交换空间)。例如,限制内存512MB、交换空间512MB(总计1GB):
docker run -m 512m --memory-swap=1g ubuntu:latest
注意:若--memory-swap设置为-1,则表示交换空间无限制(默认值)。
3. 设置内存预留(–memory-reservation)
--memory-reservation参数设置内存软预留(默认值为--memory的50%),作为内存不足时的预警阈值。例如,设置内存上限500MB、预留200MB:
docker run -m 500m --memory-reservation=200m ubuntu:latest
该参数不会限制最大内存使用,但会在内存争用时触发Docker回收机制,尝试将容器内存缩减至预留值。
4. 限制内核内存(–kernel-memory)
内核内存(如slab、sockets等)无法交换到磁盘,过度使用可能导致系统服务阻塞。使用--kernel-memory参数限制内核内存使用(如50MB):
docker run -m 500m --kernel-memory=50m ubuntu:latest
该参数需配合-m使用,且不能超过-m的值。
三、磁盘I/O资源限制
通过blkio子系统限制容器的磁盘读写速度,防止某个容器独占磁盘资源。
1. 限制读/写速度(–device-read-bps/–device-write-bps)
使用--device-read-bps(读取速度,单位:字节/秒)和--device-write-bps(写入速度,单位:字节/秒)参数,限制容器对指定设备的读写速率。例如,限制对/dev/sda的写入速度为1MB/s:
docker run --device-write-bps=/dev/sda:1mb ubuntu:latest
该参数适用于需要控制磁盘IO的场景(如数据库、日志服务等)。
2. 限制读/写IOPS(–device-read-iops/–device-write-iops)
使用--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实现。
1. 使用tc命令限制带宽
以限制容器的网络带宽为例(如10Mbps):
# 进入容器的网络命名空间
nsenter -t -n
# 添加流量控制规则(出方向,限制为10Mbps)
tc qdisc add dev eth0 root tbf rate 10mbit latency 50ms burst 1540
注意:该方法需要手动操作,适用于需要精细化控制的场景。
五、持久化设置(修改daemon.json)
若需要为所有容器设置默认资源限制,可修改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命令可动态调整已运行容器的资源限制(无需重启容器)。例如,将容器的内存限制调整为1GB、CPU权重调整为2048:
docker update -m 1g --cpu-shares=2048
该命令适用于需要临时调整资源需求的场景。
以上方法覆盖了Docker容器资源限制的主要场景,可根据实际需求选择合适的方式组合使用。例如,同时限制CPU核心数、内存上限及磁盘IO速度,以实现全面的资源管控。
以上就是关于“ubuntu中docker资源如何限制”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm