本文目录导读:

在Shell脚本中配置容器内存交换(Swap),主要涉及 限制容器内存交换 和 完全禁用内存交换 两种情况,以下是具体实现方法:
限制容器内存交换
通过Docker run参数
#!/bin/bash # 限制内存交换为512MB docker run -it \ --memory="1g" \ --memory-swap="1.5g" \ --memory-swappiness="0" \ ubuntu bash
--memory:物理内存限制--memory-swap:总内存(物理+交换)限制--memory-swappiness:内核交换行为(0-100)
通过docker-compose
# docker-compose.yml
version: '3'
services:
app:
image: ubuntu
deploy:
resources:
limits:
memory: 1G
memory-swap: 1.5G
sysctls:
- vm.swappiness=0
完全禁用内存交换
通过cgroup设置
#!/bin/bash CONTAINER_ID=$(docker ps -q --filter "name=mycontainer") # 禁用交换 echo 0 > /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.swappiness echo 0 > /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.use_hierarchy # 设置内存和交换限制相同值 docker update --memory="512m" --memory-swap="512m" $CONTAINER_ID
通过Docker run直接禁用
#!/bin/bash docker run -it \ --memory="1g" \ --memory-swap="1g" \ --kernel-memory="512m" \ ubuntu bash
完整的Shell脚本示例
#!/bin/bash
configure_memory_swap() {
local CONTAINER_NAME=$1
local MEMORY_LIMIT=$2 # 如:512m、1g
local SWAP_ENABLED=$3 # true/false
if [ "$SWAP_ENABLED" = "false" ]; then
# 禁用交换:设置内存和交换相同值
docker run -d \
--name="$CONTAINER_NAME" \
--memory="$MEMORY_LIMIT" \
--memory-swap="$MEMORY_LIMIT" \
--memory-swappiness="0" \
ubuntu sleep infinity
else
# 启用有限交换
local SWAP_LIMIT=$(echo "$MEMORY_LIMIT" | sed 's/[0-9]*//') # 提取单位
local MEM_VAL=$(echo "$MEMORY_LIMIT" | sed 's/[a-zA-Z]*//') # 提取数值
SWAP_LIMIT="${MEM_VAL}${SWAP_LIMIT}"
docker run -d \
--name="$CONTAINER_NAME" \
--memory="$MEMORY_LIMIT" \
--memory-swap="$MEMORY_LIMIT" \
--memory-swappiness="10" \
ubuntu sleep infinity
fi
}
# 使用示例
configure_memory_swap "myapp" "1g" false
验证配置是否生效
#!/bin/bash
verify_swap_config() {
local CONTAINER_ID=$1
echo "=== 内存交换配置验证 ==="
docker inspect $CONTAINER_ID | jq '.[0].HostConfig.MemorySwap'
echo "=== 容器内查看swap状态 ==="
docker exec $CONTAINER_ID cat /proc/meminfo | grep -i swap
echo "=== cgroup交换配置 ==="
docker exec $CONTAINER_ID cat /sys/fs/cgroup/memory/memory.swappiness
}
# 使用示例
verify_swap_config $(docker ps -q -f name=myapp)
注意事项
系统层面配置
#!/bin/bash # 系统禁用swap(会影响所有容器) sudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab # 设置内核swappiness echo "vm.swappiness = 0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
兼容性检查脚本
#!/bin/bash
check_swap_config() {
echo "检查Docker版本:"
docker version --format '{{.Server.Version}}'
echo "检查cgroup版本:"
docker info | grep "Cgroup"
echo "当前系统swap:"
free -h | grep -i swap
# 检查是否支持memory-swap配置
if [[ $(docker version --format '{{.Server.Version}}') > "17.05" ]]; then
echo "✅ 支持memory-swap配置"
else
echo "❌ Docker版本过低,需升级"
fi
}
check_swap_config
生产环境建议脚本
#!/bin/bash
# 生产环境容器内存交换配置
PRODUCTION_MEM_SWAP_CONFIG() {
local SERVICE=$1
local MEMORY="2g"
echo "部署 $SERVICE 并禁用swap..."
docker run -d \
--name="$SERVICE" \
--memory="$MEMORY" \
--memory-swap="$MEMORY" \
--memory-swappiness="0" \
--kernel-memory="1g" \
--oom-kill-disable=false \
--restart=always \
$SERVICE:latest
echo "验证swap配置:"
docker inspect $SERVICE | grep -E "Memory|Swap"
}
PRODUCTION_MEM_SWAP_CONFIG "my-production-app"
这些脚本可以帮助你根据不同的需求配置容器内存交换行为,建议在生产环境中禁用或严格限制内存交换,以避免性能问题。