Docker中配置容器的Swap限制防范宿主機(jī)死機(jī)
要在 Docker 中配置 Swap 限制來防范宿主機(jī)死機(jī),核心不是“單獨(dú)限制 Swap”,而是通過 --memory 和 --memory-swap 聯(lián)合控制內(nèi)存與交換空間的總邊界。Swap 本身不是萬能保險——若宿主機(jī)沒開啟 swap 分區(qū),容器根本用不了 swap;若配置不當(dāng)(比如只設(shè) --memory-swap 不設(shè) --memory),Docker 會直接報(bào)錯或靜默降級,起不到防護(hù)作用。
一、核心參數(shù):限制容器 Swap
Docker 使用 --memory-swap 控制"內(nèi)存 + Swap"的總和,而非僅 Swap 大小。
| 場景 | 命令 / 配置 | 說明 |
|---|---|---|
| 完全禁用 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 |
| 危險:不限制 Swap | docker run -m 1g(默認(rèn)) | 默認(rèn) Swap = memory,總計(jì) 2GB;若設(shè)為 -1 則無限 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)未開啟,需修改 GRUB:
# 編輯 /etc/default/grub GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" sudo update-grub sudo reboot
開啟后約有 1% 內(nèi)存開銷和 10% 性能損耗,但生產(chǎn)環(huán)境強(qiáng)烈建議開啟。
2. 調(diào)整宿主機(jī) Swappiness
降低系統(tǒng)使用 Swap 的激進(jìn)程度,優(yōu)先使用物理內(nèi)存:
# 臨時生效 sudo sysctl vm.swappiness=10 # 永久生效:寫入 /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)
| ?? 危險操作 | 后果 | 建議 |
|---|---|---|
| --memory-swap=-1 | 容器可無限使用 Swap,導(dǎo)致磁盤 thrashing,宿主機(jī)卡死 | 生產(chǎn)環(huán)境絕對禁止 |
| --oom-kill-disable 且未設(shè) -m | OOM 時內(nèi)核無法殺容器,可能殺系統(tǒng)進(jìn)程或?qū)е滤罊C(jī) | 僅在設(shè)置了 -m 且明確需要時才使用 |
| 容器設(shè)置 restart: always + 無資源限制 | 容器反復(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 表示無限制,是潛在風(fēng)險。
2. 實(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ī),需通過 VNC/控制臺連接:
# 停止 Docker 服務(wù),防止容器自動重啟 systemctl stop docker # 找到問題容器并刪除/禁用 cd /var/lib/docker/containers/ # 修改 hostconfig.json 中 RestartPolicy 為 never,或刪除容器目錄 systemctl start docker
五、生產(chǎn)環(huán)境檢查清單
- 所有容器必須設(shè)置 --memory 硬限制
- --memory-swap 建議等于 --memory(禁用 Swap)或不超過 1.5 倍內(nèi)存
- 關(guān)鍵業(yè)務(wù)容器配置 --restart=on-failure:3,避免無限重啟
- 宿主機(jī)開啟 swapaccount=1 和 cgroup_enable=memory
- 部署 Prometheus + cAdvisor 監(jiān)控,設(shè)置內(nèi)存使用率 >70% 告警
- 定期執(zhí)行 docker stats 審查資源分配是否合理
一句話總結(jié):生產(chǎn)環(huán)境中,給每個容器設(shè)置 --memory 并令 --memory-swap 等于 --memory,是防止單個容器耗盡宿主機(jī) Swap 導(dǎo)致系統(tǒng)死機(jī)的最有效手段 。
到此這篇關(guān)于Docker中配置容器的Swap限制防范宿主機(jī)死機(jī)的文章就介紹到這了,更多相關(guān)Docker Swap限制防范宿主機(jī)死機(jī)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中編碼和時區(qū)設(shè)置不生效問題排查小結(jié)
本文主要介紹了在Docker容器中排查編碼和時區(qū)設(shè)置不生效的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Docker網(wǎng)絡(luò)配置與自定義IP容器通信
IP地址是Docker容器在網(wǎng)絡(luò)中的唯一標(biāo)識,每個Docker都會被分配一個 IP,用于網(wǎng)絡(luò)通信,本文主要介紹了Docker網(wǎng)絡(luò)配置與自定義IP容器通信,感興趣的可以了解一下2024-03-03

