如何解決對(duì)Docker容器內(nèi)存限制警告或未實(shí)際限制的問(wèn)題
解決對(duì)Docker容器內(nèi)存限制警告或未實(shí)際限制的問(wèn)題
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
a229353897850843206a76458307a37eaeb3c8e1adf0e58e458b9ed10790cfa8
當(dāng)試圖在啟動(dòng)docker容器時(shí)使用–memory指令時(shí)可能會(huì)出現(xiàn)此類(lèi)警告。
場(chǎng)景
筆者的場(chǎng)景是試圖在一個(gè)2G內(nèi)存服務(wù)器上加入RabbitMQ,但是內(nèi)存已所剩無(wú)幾。為了防止種種問(wèn)題,需要進(jìn)行限制。
一個(gè)想法是在啟動(dòng)容器時(shí)使用–memory指令限制其內(nèi)存大小。但啟動(dòng)成功后筆者收到文章上述警告。
含義
這意味著筆者服務(wù)器的Linux 內(nèi)核當(dāng)前沒(méi)有啟用對(duì) swap 限制的支持,或者 cgroup 沒(méi)有正確掛載。而cgroup(Control Group)是 Linux 內(nèi)核中的一個(gè)功能,用于限制、控制和監(jiān)視進(jìn)程組的資源使用,如 CPU、內(nèi)存、磁盤(pán) I/O 等。
cgroup 允許系統(tǒng)管理員將一組進(jìn)程組織在一起,并為它們分配資源。
如果你沒(méi)有正確掛載cgorup,在這種情況下,雖然你指定了 --memory 限制,但無(wú)法限制容器的 swap 內(nèi)存使用。
解決方案
步驟 1:更新 GRUB 配置
- 編輯 GRUB 配置文件:
sudo nano /etc/default/grub
- 在
GRUB_CMDLINE_LINUX_DEFAULT行中添加cgroup_enable=memory swapaccount=1:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"
這行將引導(dǎo)加載程序的默認(rèn)內(nèi)核命令行參數(shù),以下是具體參數(shù)釋義:
quiet: 啟動(dòng)時(shí)禁用大多數(shù)內(nèi)核啟動(dòng)信息的顯示,使啟動(dòng)過(guò)程更加簡(jiǎn)潔。splash: 啟用啟動(dòng)時(shí)顯示圖形啟動(dòng)畫(huà)面(Splash Screen),通常用于顯示啟動(dòng)時(shí)的廠(chǎng)商標(biāo)志或進(jìn)度條。cgroup_enable=memory: 啟用內(nèi)核的 cgroup 內(nèi)存子系統(tǒng),允許使用 cgroup 來(lái)管理和限制內(nèi)存資源。swapaccount=1: 啟用 swap 賬戶(hù)統(tǒng)計(jì)。這個(gè)參數(shù)使 cgroup 能夠跟蹤和管理交換空間(swap)的使用情況。
- 保存并退出編輯器
步驟 2:更新 GRUB 并重啟
- 更新 GRUB 配置:
sudo update-grub
- 重啟系統(tǒng):
sudo reboot
驗(yàn)證
通過(guò)以下命令檢驗(yàn)容器是否真的將memory進(jìn)行了限制。
比如,驗(yàn)證RabbitMQ的內(nèi)存是否被限制在350mb以?xún)?nèi):
sudo docker stats rabbitmq
得到如下輸出結(jié)果:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7e38b33cd7f7 rabbitmq 0.16% 135.3MiB / 350MiB 67.65% 1.2kB / 0B 56.9MB / 598kB 29
可以發(fā)現(xiàn)在limit一列中,的確將RabbitMQ的內(nèi)存限制在350mb以?xún)?nèi)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker核心知識(shí)點(diǎn)和常用指令(命令)速通
Docker是一種容器化平臺(tái),它通過(guò)容器技術(shù)將所有依賴(lài)項(xiàng)打包到一個(gè)鏡像中,再通過(guò)鏡像運(yùn)行一個(gè)獨(dú)立并且可移植的容器,這篇文章主要介紹了Docker核心知識(shí)點(diǎn)和常用指令(命令)的相關(guān)資料,需要的朋友可以參考下2026-04-04
docker已啟動(dòng)容器修改添加端口映射的兩種方法
最近工作中遇到一個(gè)問(wèn)題,docker容器啟動(dòng)后怎么修改端口映射?通過(guò)查找相關(guān)資料解決了,這篇文章主要給大家介紹了關(guān)于docker已啟動(dòng)容器修改添加端口映射的兩種方法,需要的朋友可以參考下2022-08-08
docker找不到鏡像無(wú)法成功下載ragflow-main的問(wèn)題解決辦法
這篇文章主要介紹了docker找不到鏡像無(wú)法成功下載ragflow-main的問(wèn)題解決辦法,文中通過(guò)代碼及圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用docker具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-04-04
已有docker鏡像構(gòu)建過(guò)程分析(使用示例)
docker history命令用于查看指定鏡像的歷史層信息,它顯示了鏡像創(chuàng)建過(guò)程中的每一層,包括創(chuàng)建時(shí)間、創(chuàng)建者、大小和注釋等信息,本文介紹已有docker鏡像構(gòu)建過(guò)程分析,感興趣的朋友一起看看吧2024-12-12
Docker部署前后端分離項(xiàng)目的三種方式小結(jié)
本文主要介紹了Docker部署前后端分離項(xiàng)目的三種方式小結(jié),包含通過(guò)兩個(gè)容器部署,通過(guò)compose編排容器自動(dòng)部署和將前后端項(xiàng)目打成一個(gè)鏡像部署的三種方式,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
解決docker安裝完成報(bào):bridge-nf-call-iptables is disabled問(wèn)題
這篇文章主要介紹了解決docker安裝完成報(bào):bridge-nf-call-iptables is disabled問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Docker Buildx 多平臺(tái)鏡像構(gòu)建的項(xiàng)目實(shí)踐
本文全面介紹了Docker Buildx多平臺(tái)鏡像構(gòu)建技術(shù),從原理到生產(chǎn)實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05
Docker如何實(shí)現(xiàn)搭建本地私有倉(cāng)庫(kù)
這篇文章主要介紹了Docker搭建本地私有倉(cāng)庫(kù)的實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07

