Docker中配置容器的Swap限制防范宿主機(jī)死機(jī)
要在 Docker 中配置 Swap 限制來(lái)防范宿主機(jī)死機(jī),核心不是“單獨(dú)限制 Swap”,而是通過(guò) --memory 和 --memory-swap 聯(lián)合控制內(nèi)存與交換空間的總邊界。Swap 本身不是萬(wàn)能保險(xiǎn)——若宿主機(jī)沒(méi)開(kāi)啟 swap 分區(qū),容器根本用不了 swap;若配置不當(dāng)(比如只設(shè) --memory-swap 不設(shè) --memory),Docker 會(huì)直接報(bào)錯(cuò)或靜默降級(jí),起不到防護(hù)作用。
一、核心參數(shù):限制容器 Swap
Docker 使用 --memory-swap 控制"內(nèi)存 + Swap"的總和,而非僅 Swap 大小。
| 場(chǎng)景 | 命令 / 配置 | 說(shuō)明 |
|---|---|---|
| 完全禁用 Swap(推薦生產(chǎn)環(huán)境) | docker run -m 1g --memory-swap=1g | memory-swap 等于 memory,Swap 被禁,容器超限即觸發(fā) OOM Killer,快速止損 |
| 限制 Swap 用量 | docker run -m 1g --memory-swap=2g | 可用 1GB 內(nèi)存 + 1GB Swap,總計(jì) 2GB |
| 危險(xiǎn):不限制 Swap | docker run -m 1g(默認(rèn)) | 默認(rèn) Swap = memory,總計(jì) 2GB;若設(shè)為 -1 則無(wú)限 Swap,極易拖垮宿主機(jī) |
Docker Compose 配置示例
services:
app:
image: myapp:latest
deploy:
resources:
limits:
memory: 1G
memory-swap: 1G # 與 memory 相同,禁用 swap
reservations:
memory: 512M
restart: on-failure:3二、宿主機(jī)層面加固
1. 啟用 cgroup swap 限制支持
部分 Ubuntu/Debian 系統(tǒng)默認(rèn)未開(kāi)啟,需修改 GRUB:
# 編輯 /etc/default/grub GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" sudo update-grub sudo reboot
開(kāi)啟后約有 1% 內(nèi)存開(kāi)銷和 10% 性能損耗,但生產(chǎn)環(huán)境強(qiáng)烈建議開(kāi)啟。
2. 調(diào)整宿主機(jī) Swappiness
降低系統(tǒng)使用 Swap 的激進(jìn)程度,優(yōu)先使用物理內(nèi)存:
# 臨時(shí)生效 sudo sysctl vm.swappiness=10 # 永久生效:寫(xiě)入 /etc/sysctl.conf echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
3. 設(shè)置 Docker Daemon 全局限制
在 /etc/docker/daemon.json 中配置默認(rèn)資源限制(需重啟 Docker):
{
"default-ulimits": {
"memlock": { "Name": "memlock", "Hard": -1, "Soft": -1 }
}
}三、關(guān)鍵注意事項(xiàng)
| ?? 危險(xiǎn)操作 | 后果 | 建議 |
|---|---|---|
| --memory-swap=-1 | 容器可無(wú)限使用 Swap,導(dǎo)致磁盤(pán) thrashing,宿主機(jī)卡死 | 生產(chǎn)環(huán)境絕對(duì)禁止 |
| --oom-kill-disable 且未設(shè) -m | OOM 時(shí)內(nèi)核無(wú)法殺容器,可能殺系統(tǒng)進(jìn)程或?qū)е滤罊C(jī) | 僅在設(shè)置了 -m 且明確需要時(shí)才使用 |
| 容器設(shè)置 restart: always + 無(wú)資源限制 | 容器反復(fù) OOM 重啟,持續(xù)消耗資源 | 使用 on-failure:3 限制重啟次數(shù) |
四、監(jiān)控與應(yīng)急
1. 檢查現(xiàn)有容器是否有限制
docker ps --format "{{.Names}}" | xargs docker inspect \
--format='{{.Name}}: Memory={{.HostConfig.Memory}} Swap={{.HostConfig.MemorySwap}}'Memory=0 表示無(wú)限制,是潛在風(fēng)險(xiǎn)。
2. 實(shí)時(shí)監(jiān)控
# 查看容器內(nèi)存/Swap 使用
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
# 查看宿主機(jī) Swap 使用
free -h
cat /proc/swaps3. 應(yīng)急處理(宿主機(jī)已卡死)
若宿主機(jī)已因 Swap 耗盡死機(jī),需通過(guò) VNC/控制臺(tái)連接:
# 停止 Docker 服務(wù),防止容器自動(dòng)重啟 systemctl stop docker # 找到問(wèn)題容器并刪除/禁用 cd /var/lib/docker/containers/ # 修改 hostconfig.json 中 RestartPolicy 為 never,或刪除容器目錄 systemctl start docker
五、生產(chǎn)環(huán)境檢查清單
- 所有容器必須設(shè)置 --memory 硬限制
- --memory-swap 建議等于 --memory(禁用 Swap)或不超過(guò) 1.5 倍內(nèi)存
- 關(guān)鍵業(yè)務(wù)容器配置 --restart=on-failure:3,避免無(wú)限重啟
- 宿主機(jī)開(kāi)啟 swapaccount=1 和 cgroup_enable=memory
- 部署 Prometheus + cAdvisor 監(jiān)控,設(shè)置內(nèi)存使用率 >70% 告警
- 定期執(zhí)行 docker stats 審查資源分配是否合理
一句話總結(jié):生產(chǎn)環(huán)境中,給每個(gè)容器設(shè)置 --memory 并令 --memory-swap 等于 --memory,是防止單個(gè)容器耗盡宿主機(jī) Swap 導(dǎo)致系統(tǒng)死機(jī)的最有效手段 。
到此這篇關(guān)于Docker中配置容器的Swap限制防范宿主機(jī)死機(jī)的文章就介紹到這了,更多相關(guān)Docker Swap限制防范宿主機(jī)死機(jī)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中編碼和時(shí)區(qū)設(shè)置不生效問(wèn)題排查小結(jié)
本文主要介紹了在Docker容器中排查編碼和時(shí)區(qū)設(shè)置不生效的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Docker網(wǎng)絡(luò)配置與自定義IP容器通信
IP地址是Docker容器在網(wǎng)絡(luò)中的唯一標(biāo)識(shí),每個(gè)Docker都會(huì)被分配一個(gè) IP,用于網(wǎng)絡(luò)通信,本文主要介紹了Docker網(wǎng)絡(luò)配置與自定義IP容器通信,感興趣的可以了解一下2024-03-03
Docker 啟動(dòng)Redis 并設(shè)置密碼的操作
這篇文章主要介紹了Docker 啟動(dòng)Redis 并設(shè)置密碼的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11

