本文目录导读:

在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"
这些脚本可以帮助你根据不同的需求配置容器内存交换行为,建议在生产环境中禁用或严格限制内存交换,以避免性能问题。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播