docker run命令直接限制(单容器快速配置)docker run命令是最基础的容器资源限制方式,适用于临时或单容器场景,支持CPU、内存、磁盘I/O、网络带宽等多种资源类型的限制。
CPU限制:
--cpus=<数值>:指定容器可使用的CPU核心数(如--cpus=2表示允许使用2个完整核心;--cpus=0.5表示使用半个核心)。--cpuset-cpus=<核心编号>:限制容器只能使用指定的CPU核心(如--cpuset-cpus=0,2表示仅使用宿主机的第0和第2个核心)。docker run -it --cpus=2 --cpuset-cpus=0,2 centos:latest /bin/bash。内存限制:
-m/--memory=<大小>:设置容器最大可使用的内存量(如-m=512m表示512MB;-m=2g表示2GB)。--memory-swap=<大小>:设置容器可使用的内存与交换空间的总和(如--memory=512m --memory-swap=1g表示内存512MB+交换空间512MB,总和1GB)。docker run -it -m=512m --memory-swap=1g centos:latest /bin/bash。磁盘I/O限制:
--blkio-weight=<权重>:设置容器块设备I/O的相对权重(范围1-10000,默认500,权重越高,I/O优先级越高)。--device-read-bps=<设备路径:速率>/--device-write-bps=<设备路径:速率>:限制容器对指定设备的读/写速率(如--device-read-bps=/dev/sda:1mb表示限制从/dev/sda读取速率为1MB/s)。docker run -it --blkio-weight=800 --device-read-bps=/dev/sda:1mb centos:latest /bin/bash。网络带宽限制:
Docker本身不直接支持网络带宽限制,但可通过tc(Traffic Control)工具或第三方网络驱动实现。例如,使用tc限制eth0接口的出口带宽为1Mbps:
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:10 htb rate 1mbit
```。
进程数限制:
使用--pids-limit=<数值>限制容器内可创建的最大进程数(如--pids-limit=100表示最多100个进程)。
示例:docker run -it --pids-limit=100 centos:latest /bin/bash。
若使用Docker Compose管理多个容器,可在docker-compose.yml文件的deploy.resources字段中定义资源限制,支持reservations(预留资源)和limits(最大限制)两种类型。
示例配置(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。
Docker底层依赖Linux cgroups(控制组)实现资源限制,可通过直接操作cgroups文件系统调整资源。需确保Docker使用systemd作为cgroup driver(默认配置)。
查看cgroups配置:
容器ID可通过docker ps获取,cgroups路径为/sys/fs/cgroup/<资源类型>/docker/<容器ID>/。
示例:查看容器内存限制文件:cat /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes。
修改cgroups配置:
cpu.cfs_quota_us(配额)和cpu.cfs_period_us(周期,默认100000μs)设置。例如,限制容器每周期最多使用50ms CPU时间(即0.5个核心):mkdir /sys/fs/cgroup/cpu/my_cgroup
echo 50000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us # 50ms
echo 100000 > /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_period_us # 100ms
echo <容器PID> > /sys/fs/cgroup/cpu/my_cgroup/tasks # 将容器进程加入cgroup
memory.limit_in_bytes文件(单位字节)。例如,限制容器内存为512MB:echo 536870912 > /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes
```。
若需为所有容器设置默认资源限制,可修改Docker守护进程的配置文件/etc/docker/daemon.json。
示例配置(限制默认CPU份额、内存交换):
{
"default-ulimits": {
"nofile": { # 文件描述符限制
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": { # 进程数限制
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
}
},
"exec-opts": ["native.cgroupdriver=systemd"], # 使用systemd作为cgroup driver
"log-driver": "json-file",
"log-opts": {
"max-size": "100m" # 日志文件大小限制
}
}
修改后重启Docker服务使配置生效:systemctl restart docker。
docker update命令部分调整,如CPU、内存限制)。Docker Compose或Docker Swarm管理资源,便于统一监控和维护。