温馨提示×

Docker在CentOS上的资源限制如何设置

小樊
42
2025-10-06 22:23:56
栏目: 智能运维

Docker在CentOS上的资源限制设置方法

在CentOS系统中,Docker容器的资源限制主要通过命令行参数Docker Composecgroups配置Daemon全局配置等方式实现,覆盖CPU、内存、磁盘I/O、网络带宽等核心资源维度,避免容器过度占用宿主机资源导致系统不稳定。

一、基础资源限制(通过docker run命令)

1. CPU资源限制

  • –cpus:限制容器可使用的CPU核心数(支持小数,如0.5表示半个核心)。
    示例:docker run -it --cpus=2 centos:latest /bin/bash(限制容器使用2个CPU核心)。
  • –cpuset-cpus:将容器绑定到特定CPU核心(适用于多核环境的隔离优化)。
    示例:docker run -it --cpuset-cpus="0,2" centos:latest /bin/bash(容器仅能使用CPU 0和2)。
  • –cpu-shares(相对权重):设置容器CPU资源的相对分配比例(默认1024),资源紧张时按比例分配。
    示例:docker run -it --cpu-shares=512 centos:latest /bin/bash(权重为默认的一半,资源不足时占用更少CPU时间)。

2. 内存资源限制

  • –memory(-m):设置容器最大可用内存(如512m表示512MB,1g表示1GB),超出会触发OOM(Out of Memory)错误。
    示例:docker run -it --memory=512m centos:latest /bin/bash(限制内存为512MB)。
  • –memory-swap:设置容器可使用的物理内存+交换空间总和(格式:--memory=<物理内存> --memory-swap=<物理内存+交换空间>)。
    示例:docker run -it --memory=512m --memory-swap=1g centos:latest /bin/bash(物理内存512MB+交换空间512MB,总和1GB)。
  • –memory-reservation:设置内存预留值(系统内存紧张时,保证容器至少获得该值的内存,避免突发OOM)。
    示例:docker run -it --memory=1g --memory-reservation=512m centos:latest /bin/bash(最大1GB,预留512MB)。
  • –oom-kill-disable:禁用OOM Killer(容器内存溢出时不杀死进程,而是暂停容器,需谨慎使用)。
    示例:docker run -it --memory=512m --oom-kill-disable centos:latest /bin/bash

3. 磁盘I/O限制

  • –blkio-weight:设置块设备I/O权重(范围10-1000,默认500),权重越高,I/O资源分配越多。
    示例:docker run -it --blkio-weight=500 centos:latest /bin/bash(中等I/O权重)。
  • –blkio-throttle-read-bps-device/–blkio-throttle-write-bps-device:限制容器对特定设备的读/写带宽(格式:<设备路径>:<速率>,如/dev/sda)。
    示例:docker run -it --blkio-throttle-read-bps-device=/dev/sda:1mb --blkio-throttle-write-bps-device=/dev/sda:1mb centos:latest /bin/bash(限制/dev/sda设备的读写带宽为1MB/s)。

4. 网络带宽限制

Docker原生不直接支持网络带宽限制,但可通过**–device-read-bps**/–device-write-bps参数限制容器对特定网络设备的读写速度(需结合网络模式使用)。
示例:docker run -it --device-read-bps=eth0:1mb --device-write-bps=eth0:1mb centos:latest /bin/bash(限制eth0网卡的读写带宽为1MB/s)。

二、使用Docker Compose设置资源限制

通过docker-compose.yml文件可批量管理容器的资源限制,适用于生产环境的多容器部署。示例如下:

version: '3'
services:
  web:
    image: nginx:latest
    deploy:
      resources:
        reservations:  # 最低资源预留(系统保证)
          cpus: '0.5'       # 至少0.5个CPU核心
          memory: 256M      # 至少256MB内存
        limits:           # 最大资源限制(容器不能超过)
          cpus: '1'         # 最多1个CPU核心
          memory: 512M      # 最多512MB内存

使用docker-compose up -d启动服务后,Compose会自动应用上述资源限制。

三、通过cgroups配置细粒度控制

Docker底层依赖Linux cgroups(控制组)实现资源隔离,可通过直接操作cgroups文件系统进行更精细的调整(需root权限)。

1. 查看cgroups路径

容器启动后,Docker会自动在/sys/fs/cgroup/下创建对应的cgroup目录(如cpu/docker/<容器ID>memory/docker/<容器ID>)。
示例:ls /sys/fs/cgroup/cpu/docker/(查看所有容器的CPU cgroup路径)。

2. 修改CPU限制

  • cpu.cfs_quota_us:周期内可使用的CPU时间(微秒),cpu.cfs_period_us:时间周期(默认100000微秒,即100ms)。
    示例:限制容器使用50%的CPU(100ms周期内用50ms):
    echo 50000 > /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_quota_us
    echo 100000 > /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.cfs_period_us
    

3. 修改内存限制

  • memory.limit_in_bytes:容器最大可用内存(字节)。
    示例:限制内存为512MB:
    echo 536870912 > /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
    

修改后立即生效,但容器重启后会恢复默认值,需通过脚本或自动化工具持久化配置。

四、通过Docker Daemon全局配置

若需为所有容器设置默认资源限制,可修改Docker守护进程的配置文件/etc/docker/daemon.json(若文件不存在则新建),添加以下内容:

{
  "default-ulimits": {
    "memlock": {  // 限制内存锁定大小(防止容器锁住过多内存)
      "Name": "memlock",
      "Hard": -1,  // 硬限制(-1表示无限制)
      "Soft": -1   // 软限制(-1表示无限制)
    },
    "nproc": {    // 限制进程数
      "Name": "nproc",
      "Hard": 65535,
      "Soft": 65535
    },
    "nofile": {   // 限制文件描述符数量
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  },
  "exec-opts": ["native.cgroupdriver=systemd"]  // 使用systemd作为cgroup驱动(推荐)
}

修改后重启Docker服务使配置生效:

sudo systemctl restart docker

注意default-ulimits设置的限制会被docker run命令中的参数覆盖。

注意事项

  1. 资源限制的有效性:所有资源限制参数(如--cpus--memory)需在创建容器时指定,容器运行后无法修改(需删除重建)。
  2. 生产环境建议:优先使用Docker Compose或Kubernetes管理资源限制,便于批量配置和动态调整;同时结合docker stats命令实时监控容器资源使用情况(如docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}")。
  3. 避免过度限制:资源限制过严可能导致容器无法正常运行(如内存限制过低触发频繁OOM),需根据应用实际需求调整。

0