Shell脚本如何配置容器资源配额

wen 实用脚本 1

本文目录导读:

Shell脚本如何配置容器资源配额

  1. CPU资源配额配置
  2. 内存资源配额配置
  3. 磁盘IO限制
  4. 完整的资源配额脚本
  5. 资源配额验证脚本
  6. 批量配置资源配额
  7. 注意事项

在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[@]}

注意事项

  1. 资源限制不严格:内存限制是硬限制,CPU限制相对灵活
  2. 主机资源考虑:所有容器的资源限制总和不应超过主机可用资源
  3. 内核版本要求:某些限制功能需要较新的Linux内核版本
  4. CGroup版本:Docker 20.10+默认使用cgroup v2,配置方式略有不同

这个脚本提供了从单容器到批量配置的完整解决方案,可以根据实际需求调整参数。

抱歉,评论功能暂时关闭!