温馨提示×

Ubuntu Docker容器资源限制如何设置

小樊
68
2025-09-18 20:11:05
栏目: 智能运维

Ubuntu下Docker容器资源限制设置方法

在Ubuntu系统中,可以通过命令行参数Docker ComposeDaemon配置文件等方式设置Docker容器的资源限制(包括CPU、内存、磁盘I/O等),以下是具体操作:

一、CPU资源限制

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
    

三、磁盘I/O资源限制

通过--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管理容器,可在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>命令。

六、通过Daemon配置文件设置默认限制

若需为所有容器设置默认资源限制,可修改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中的MemoryNanoCpus字段)。

以上方法可根据实际需求组合使用,例如同时限制CPU、内存和磁盘I/O,确保容器运行稳定且不影响宿主机及其他容器。

0