本文目录导读:

在Shell脚本中配置容器资源配额,主要针对Docker容器进行CPU、内存、磁盘IO等资源的限制,以下是详细的配置方法:
CPU资源配额配置
限制CPU使用数量
# 限制容器只能使用1.5个CPU核心 docker run -d --cpus="1.5" --name container1 nginx # 限制容器使用特定CPU核心(0和1号核心) docker run -d --cpuset-cpus="0,1" --name container2 nginx # CPU份额(相对权重,默认1024) docker run -d --cpu-shares=512 --name container3 nginx
CPU配额脚本示例
#!/bin/bash # CPU限制脚本 CONTAINER_NAME="web-app" CPU_LIMIT="2.0" # 限制2个CPU核心 CPU_SHARES="512" # CPU份额 docker run -d \ --name $CONTAINER_NAME \ --cpus="$CPU_LIMIT" \ --cpu-shares=$CPU_SHARES \ nginx:latest
内存资源配额配置
限制内存使用
# 限制最大内存为512MB docker run -d --memory="512m" --name container4 nginx # 限制内存+swap总大小为1GB docker run -d --memory="512m" --memory-swap="1g" --name container5 nginx # 禁用swap(只使用物理内存) docker run -d --memory="512m" --memory-swap="512m" --name container6 nginx # 设置内存软限制(可以超过此值但会被限制) docker run -d --memory-reservation="256m" --name container7 nginx
内存限制脚本
#!/bin/bash # 内存限制配置 CONTAINER_NAME="database" MEM_LIMIT="1g" # 最大内存 MEM_RESERVATION="512m" # 内存软限制 SWAP_LIMIT="2g" # 内存+swap总大小 docker run -d \ --name $CONTAINER_NAME \ --memory="$MEM_LIMIT" \ --memory-reservation="$MEM_RESERVATION" \ --memory-swap="$SWAP_LIMIT" \ mysql:8.0
磁盘IO限制
限制读写速度
# 限制读取速度为10MB/s docker run -d --device-read-bps /dev/sda:10mb --name container8 nginx # 限制写入速度为5MB/s docker run -d --device-write-bps /dev/sda:5mb --name container9 nginx # 限制读取IOPS为100 docker run -d --device-read-iops /dev/sda:100 --name container10 nginx # 限制写入IOPS为50 docker run -d --device-write-iops /dev/sda:50 --name container11 nginx
完整的资源配额脚本
#!/bin/bash
# 完整的资源配额配置脚本
set -e
# 配置参数
read -p "请输入容器名称: " CONTAINER_NAME
read -p "请输入CPU限制(核心数,如1.5): " CPU_LIMIT
read -p "请输入内存限制(如512m或1g): " MEM_LIMIT
read -p "是否限制磁盘IO? (y/n): " LIMIT_IO
# 构建docker run命令
DOCKER_CMD="docker run -d --name $CONTAINER_NAME"
# 添加CPU限制
if [ -n "$CPU_LIMIT" ]; then
DOCKER_CMD="$DOCKER_CMD --cpus=\"$CPU_LIMIT\""
fi
# 添加内存限制
if [ -n "$MEM_LIMIT" ]; then
DOCKER_CMD="$DOCKER_CMD --memory=\"$MEM_LIMIT\""
fi
# 磁盘IO限制
if [ "$LIMIT_IO" = "y" ]; then
read -p "请输入读取速度限制(如10mb): " READ_SPEED
read -p "请输入写入速度限制(如5mb): " WRITE_SPEED
DOCKER_CMD="$DOCKER_CMD --device-read-bps /dev/sda:$READ_SPEED"
DOCKER_CMD="$DOCKER_CMD --device-write-bps /dev/sda:$WRITE_SPEED"
fi
# 添加镜像
DOCKER_CMD="$DOCKER_CMD nginx:latest"
# 执行命令
echo "执行命令: $DOCKER_CMD"
eval $DOCKER_CMD
# 检查容器状态
if [ $? -eq 0 ]; then
echo "容器 $CONTAINER_NAME 创建成功"
docker stats --no-stream $CONTAINER_NAME
else
echo "容器创建失败"
exit 1
fi
资源配额验证脚本
#!/bin/bash
# 验证容器资源限制
verify_limits() {
local container_name=$1
echo "=== 容器资源限制信息 ==="
# CPU限制
echo "CPU限制:"
docker inspect $container_name --format='{{.HostConfig.CpusetCpus}}'
docker inspect $container_name --format='{{.HostConfig.CpuShares}}'
# 内存限制
echo "内存限制:"
docker inspect $container_name --format='{{.HostConfig.Memory}}'
docker inspect $container_name --format='{{.HostConfig.MemorySwap}}'
# 查看实时资源使用
echo "实时资源使用:"
docker stats --no-stream $container_name
}
# 使用示例
verify_limits "web-app"
批量配置资源配额
#!/bin/bash
# 批量创建受限容器
CONTAINERS=("app1" "app2" "app3")
CPU_LIMITS=("1.0" "2.0" "0.5")
MEM_LIMITS=("256m" "512m" "128m")
for i in "${!CONTAINERS[@]}"; do
docker run -d \
--name "${CONTAINERS[$i]}" \
--cpus="${CPU_LIMITS[$i]}" \
--memory="${MEM_LIMITS[$i]}" \
nginx:latest
echo "容器 ${CONTAINERS[$i]} 已创建"
done
# 查看所有容器资源使用
echo "所有容器资源使用情况:"
docker stats --no-stream ${CONTAINERS[@]}
注意事项
- 资源限制不严格:内存限制是硬限制,CPU限制相对灵活
- 主机资源考虑:所有容器的资源限制总和不应超过主机可用资源
- 内核版本要求:某些限制功能需要较新的Linux内核版本
- CGroup版本:Docker 20.10+默认使用cgroup v2,配置方式略有不同
这个脚本提供了从单容器到批量配置的完整解决方案,可以根据实际需求调整参数。