温馨提示×

Ubuntu Docker资源限制怎么设置

小樊
52
2025-10-24 22:26:26
栏目: 智能运维

Ubuntu下Docker资源限制设置方法

在Ubuntu系统中,可以通过多种方式为Docker容器设置资源限制(包括CPU、内存、磁盘I/O等),确保容器不会过度消耗宿主机资源,保障系统稳定性。以下是具体设置方式:

1. 通过docker run命令直接设置(临时生效)

这是最常用的临时限制方式,适用于单次启动容器的场景。

  • CPU限制
    • --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无限制)。
  • 磁盘I/O限制
    • --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

2. 使用Docker Compose配置(适用于多容器管理)

通过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命令,资源限制将自动生效。

3. 修改Docker Daemon配置(默认限制)

若需要为所有容器设置默认资源限制,可修改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

4. 通过cgroups直接操作(高级精细控制)

Docker底层依赖Linux cgroups实现资源限制,可通过直接操作cgroups文件系统实现更细粒度的调整(如修改已运行容器的限制)。

  • 查看容器cgroup路径
    docker inspect --format='{{.HostConfig.CgroupParent}}' <container_id>
    
  • 限制内存使用
    进入容器对应的cgroup目录(如/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)
    
  • 限制CPU使用
    进入容器对应的cgroup目录(如/sys/fs/cgroup/cpu/docker/<container_id>),修改cpu.cfs_quota_uscpu.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
    

注意事项

  • 资源限制需在容器启动前设置:除cgroups直接操作外,其他方式无法修改已运行容器的资源限制;
  • 合理分配资源:避免过度限制导致容器无法正常运行(如内存限制过小可能导致OOM Killer终止容器);
  • 监控资源使用:使用docker stats命令实时查看容器资源占用情况,根据实际需求调整限制参数;
  • 生产环境建议:结合Kubernetes等编排工具,实现动态资源调度和更完善的限制策略。

0