温馨提示×

centos上docker的资源限制

小樊
42
2025-09-30 12:28:28
栏目: 智能运维

在CentOS上限制Docker容器资源的主要方法

1. 使用docker run命令参数(最常用)

docker run命令提供了丰富的参数,可直接在启动容器时设置资源限制,适用于临时或一次性容器的资源管控。

  • CPU限制
    • --cpus=<value>:限制容器可使用的CPU核心数(支持小数,如1.5表示1.5核)。例如,限制容器使用2核:docker run -it --cpus=2 ubuntu:latest /bin/bash
    • --cpuset-cpus="<cpu_list>":将容器绑定到指定的CPU核心(如0,2表示仅使用第0和第2核),适用于多核环境的隔离优化。
    • --cpu-shares=<weight>:设置CPU相对权重(默认1024),当多个容器竞争CPU时,权重高的容器获得更多CPU时间(如--cpu-shares 512的容器资源占用约为--cpu-shares 1024的一半)。
  • 内存限制
    • -m/--memory=<size>:设置容器最大可用内存(如512m表示512MB、2g表示2GB),超出会触发OOM(Out of Memory) Killer终止容器。例如:docker run -it --memory=512m ubuntu:latest /bin/bash
    • --memory-swap=<size>:设置内存+交换空间的总限制(必须大于-m的值,如-m 512m --memory-swap=1g表示内存最多用512MB,交换空间最多用512MB)。
    • --memory-reservation=<size>:设置内存软限制(当容器内存使用超过该值时,Docker会尝试回收资源,但不强制终止)。
  • 磁盘I/O限制
    • --blkio-weight=<weight>:设置块设备I/O权重(范围10-1000,默认500),权重越高,磁盘I/O优先级越高(如--blkio-weight=800的容器优先级高于默认)。
    • --device-read-bps=<device>:<rate>/--device-write-bps=<device>:<rate>:限制指定设备的读/写速度(如--device-read-bps=/dev/sda:1mb表示限制/dev/sda的读取速度为1MB/s)。
  • 网络带宽限制
    • 结合--network模式(如bridge)和tc(Traffic Control)工具,或使用--device-read-bps/--device-write-bps限制网络接口的带宽(如--device-read-bps=eth0:1mb限制eth0的读取速度为1MB/s)。

2. 使用Docker Compose(适用于多容器应用)

通过docker-compose.yml文件定义资源限制,便于多容器应用的统一管理和部署(需Docker Compose版本≥3)。

  • 示例配置
    version: '3'
    services:
      web:
        image: nginx:latest
        deploy:
          resources:
            reservations:  # 最低资源保证(启动容器时分配)
              cpus: '0.5'    # 至少0.5核
              memory: 256M   # 至少256MB内存
            limits:         # 最大资源限制(运行时上限)
              cpus: '1'      # 最多1核
              memory: 512M   # 最多512MB内存
    
  • 说明reservations用于保证容器的最低资源需求(避免因宿主机资源不足导致容器无法启动),limits用于限制容器的最大资源使用(防止过度占用)。

3. 使用cgroups(底层细粒度控制)

Docker底层依赖Linux cgroups(控制组)实现资源限制,可通过直接操作cgroups文件系统进行更细粒度的调整(适用于高级用户或自动化脚本)。

  • 操作步骤
    1. 查看cgroups目录:ls /sys/fs/cgroup/(常见子目录包括cpumemoryblkio等)。
    2. 进入容器对应的cgroup目录(如/sys/fs/cgroup/cpu/docker/<container_id>)。
    3. 修改资源限制文件:
      • CPU:写入cpu.cfs_quota_us(配额,单位微秒)和cpu.cfs_period_us(周期,默认100000微秒,如echo 200000 > cpu.cfs_quota_us表示限制为2核)。
      • 内存:写入memory.limit_in_bytes(如echo 536870912 > memory.limit_in_bytes表示限制为512MB)。
    4. 将容器PID写入tasks文件:echo <container_pid> > tasks(使限制生效)。

4. 修改Docker Daemon配置(全局默认限制)

通过修改Docker守护进程的配置文件/etc/docker/daemon.json,可设置全局默认资源限制(适用于所有新创建的容器)。

  • 示例配置
    {
      "default-ulimits": {
        "nofile": {  // 文件描述符限制
          "Name": "nofile",
          "Hard": 65535,
          "Soft": 65535
        },
        "nproc": {   // 进程数限制
          "Name": "nproc",
          "Hard": 65535,
          "Soft": 65535
        }
      },
      "exec-opts": ["native.cgroupdriver=systemd"],  // 推荐使用systemd作为cgroup驱动
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"  // 日志文件大小限制
      }
    }
    
  • 生效步骤:修改后重启Docker服务:sudo systemctl restart docker

注意事项

  • 资源限制需在容器启动前设置docker run参数、Compose文件或Daemon配置需在容器创建时指定,运行后无法直接修改(需重建容器)。
  • 避免过度限制:限制过严可能导致容器无法正常运行(如内存限制过低触发OOM Killer)。
  • 生产环境推荐:使用Docker Compose或Daemon配置管理资源限制,便于统一维护和扩展。

0