Docker資源管理方式
一、docker資源控制
Docker通過Cgroup 來控制容器使用的資源配額,包括CPU、內(nèi)存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
Caroup 是ControlGroups的縮寫,是Linux 內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源(如 cpu、內(nèi)存、磁盤,io等等)的機(jī)制,被LXC、docker等很多項(xiàng)目用于實(shí)現(xiàn)進(jìn)程資源控制。
Cgroup本身是提供將進(jìn)程進(jìn)行分組化管理的功能和接口的基礎(chǔ)結(jié)構(gòu),I/O或內(nèi)存的分配控制等具體的資源管理是通過該功能來實(shí)現(xiàn)的。
- 資源限制:可以對任務(wù)使用的資源總額進(jìn)行限制。
- 優(yōu)先級分配:通過分配的cpu時(shí)間片數(shù)量以及磁盤IO帶寬大小,實(shí)際上相當(dāng)于控制了任務(wù)運(yùn)行優(yōu)先級。
- 資源統(tǒng)計(jì):可以統(tǒng)計(jì)系統(tǒng)的資源使用量,如cpu時(shí)長,內(nèi)存用量等。
- 任務(wù)控制: cgroup可以對任務(wù) 執(zhí)行掛起、恢復(fù)等操作。
二、docker占用宿主機(jī)cpu的限制
2.1 cpu的使用率上限
Linux通過CFS (Completely Fair Scheduler,完全公平調(diào)度器)來調(diào)度各個(gè)進(jìn)程對ceu的使用。CFS默認(rèn)的調(diào)度周期是100ms 。我們可以設(shè)置每個(gè)容器進(jìn)程的調(diào)度周期,以及在這個(gè)周期內(nèi)各個(gè)容器最多能使用多少CPU時(shí)間。
使用--cpu-period 即可設(shè)置調(diào)度周期,使用--cpu-quota即可設(shè)置在每個(gè)周期內(nèi)容器能使用的CPU時(shí)間。兩者可以配合使用。CFS周期的有效范圍是 1ms~1s,對應(yīng)的--cpu-period 的數(shù)值范圍是1000~1000000。而容器的CPU配額必須不小于1ms,即--cpu-quota的值必須>= 1000。而容器的CPU配額必須不小于1ms,即--cpu-quota的值必須>= 1000。
docker run -itd --name test5 centos:7 /bin/bash docker ps -a cd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/ cd /sys/fs/cgroup/cpu/docker/ -1 cat cpu.cfs_period_us 100000 #cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默認(rèn)為100000。 #cpu.cfs_quota_us:表示該cgroups限制占用的時(shí)間(微秒),默認(rèn)為-1,表示不限制。 如果設(shè)為50000,表示占用50000/100000=50%的CPU。


進(jìn)行CPU壓力測試
docker exec -it test5 bash vi /cpu.sh #!/bin/bash i=0 while true do let i++ done chmod +x /cpu.sh ./cpu.sh top #可以看到這個(gè)腳本占了很多的cpu資源


設(shè)置50%的比例分配CPU使用時(shí)間上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash #可以重新創(chuàng)建一個(gè)容器并設(shè)置限額 或者 cd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/ echo 50000 > cpu.cfs_quota_us docker exec -it 3ed82355f811 /bin/bash ./cpu.sh top #可以看到cpu占用率接近50%,cgroups對cpu的控制起了效果 #在多核情況下,如果允許容器進(jìn)程完全占用兩個(gè) CPU, 則可以將 cpu-period 設(shè)置為 100000( 即 0.1 秒), cpu-quota設(shè)置為 200000(0.2 秒)。





2.2 設(shè)置CPU資源占用比(設(shè)置多個(gè)容器時(shí)才有效)
注意:該方式需要設(shè)置多個(gè)容器時(shí)才會(huì)生效
創(chuàng)建容器時(shí)可以使用選項(xiàng) --cpu-shares 數(shù)值(該數(shù)值要為1024的倍數(shù),1024代表一份,當(dāng)個(gè)容器占用cpu的份額由自身分配的份數(shù)除于所有容器占用cpu的份數(shù),就為該容器所占用cpu資源的百分比)
[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7 [root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7 [root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7
創(chuàng)建三個(gè)容器為 b1 和 b2 和 b3,設(shè)置容器的權(quán)重,使得b1和b2和b3的CPU資源占比為1/2和1/4和1/4。

開啟三個(gè)終端,啟動(dòng)容器壓測:
#三個(gè)容器均為以下壓測操作 #下載壓測工具依賴環(huán)境 yum install -y epel-release #下載壓測工具 yum install -y stress #進(jìn)行四個(gè)線程壓測 stress -c 2 #再開啟一個(gè)終端查看測試結(jié)果 docker stats

查看容器運(yùn)行狀態(tài)(動(dòng)態(tài)更新)

由測試結(jié)果, 可以看到在cPU進(jìn)行時(shí)間片分配的時(shí)候,容器b1比容器b2和b3多一倍的機(jī)會(huì)獲得cpu的時(shí)間片。但分配的結(jié)果取決于當(dāng)時(shí)主機(jī)和其他容器的運(yùn)行狀態(tài),實(shí)際上也無法保證容器 b2和b3一定能獲得cpu時(shí)間片
比如容器b2和b3的進(jìn)程一直是空閑的,那么容器b1是可以獲取比容器b2和b3更多的cpu時(shí)間片的。極端情況下,例如主機(jī)上只運(yùn)行了一個(gè)容器,即使它的cpu份額只有50,它也可以獨(dú)占整個(gè)主機(jī)的cpu資源。
Cgroups 只在容器分配的資源緊缺時(shí),即在需要對容器使用的資源進(jìn)行限制時(shí),才會(huì)生效。因此,無法單純根據(jù)某個(gè)容器的cpu 份額來確定有多少cpu資源分配給它,資源分配結(jié)果取決于同時(shí)運(yùn)行的其他容器的CPU分配和容器中進(jìn)程運(yùn)行情況。
2.3 設(shè)置容器綁定指定的cpu
查看主機(jī)中的cpu編號
top 按數(shù)字“1”

進(jìn)行綁核創(chuàng)建容器
[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 1 centos:7

壓力測試:
yum install -y epel-release yum install -y stress stress -c 1

三、內(nèi)存使用的限制
3.1 限制容器可以使用的最大內(nèi)存
m (或--memory=)選項(xiàng)用于限制容器可以使用的最大內(nèi)存
docker run -itd --name d1 -m 512m centos:7 /bin/bash docker stats


3.2 限制容器可用的swap 大小
#限制可用的swap 大小,--memory-swap
- 強(qiáng)調(diào)一下, --memory-swap是必須要與 --memory(或-m)一起使用的。
- 正常情況下, --memory-swap 的值包含容器可用內(nèi)存和可用swap 。
- 所以 -m 300m --memory-swap=1g 的含義為:容器可以使用300M 的物理內(nèi)存,并且可以使用700M (1G - 300M)的swap。 ? 設(shè)置為0或者不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。 如果 --memory-swap 的值和 -m 值相同,則容器不能使用swap。 如果 --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,而可以使用的swap空間使用不受限制(宿主機(jī)有多少swap 容器就可以使用多少)。
#--memory-swap 的值包含容器可用內(nèi)存和可用swap,減去-m的值才是可用swap的值。 #表示容器可以使用512M的物理內(nèi)存,并且可以使用512M的swap。因?yàn)?g減去512m的物理內(nèi)存,剩余值才是可用swap。 docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash ? ? #--memoryswap值和 -m 的值相同,表示容器無法使用swap docker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash ? ? # --memory-swap 的值設(shè)置為0或者不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。 docker run -itd --name d4 -m 512m centos:7 bash ? ? # --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,但可以使用的swap空間使用不受限制(宿主機(jī)有多少swap 容器就可以使用多少)。 docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash
四、對磁盤IO的配置控制(blkio)的限制
- -device-read-bps:限制某個(gè)設(shè)備上的讀速度bps ( 數(shù)據(jù)量),單位可以是kb、mb (M)或者gb。
- --device-write-bps : 限制某個(gè)設(shè)備上的寫速度bps ( 數(shù)據(jù)量),單位可以是kb、mb (M)或者gb。
該速度是指每秒鐘進(jìn)行讀寫操作1M,1G或者是1kb
- --device-read-iops :限制讀某個(gè)設(shè)備的iops (次數(shù))
- --device-write-iops :限制寫入某個(gè)設(shè)備的iops ( 次數(shù))
4.1 默認(rèn)情況下容器的寫速度
[root@localhost ~]#docker run -id --name e1 centos:7 [root@localhost ~]#docker exec -it e1 bash [root@8657384cb483 /]# dd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct ## oflag=direct 規(guī)避文件讀寫系統(tǒng)中所帶來的緩存,避免影響測試結(jié)果

4.2 進(jìn)行寫速度限制的容器創(chuàng)建
docker run -it --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash dd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct

五、清除docker占用的磁盤空間
docker system prune -a 可用于清理磁盤,刪除關(guān)閉的容器、無用的數(shù)據(jù)卷和網(wǎng)絡(luò)。
docker system prune -a


總結(jié)
對cpu的限制參數(shù)
設(shè)置單個(gè)容器進(jìn)程能夠使用的CPU使用率上限 針對新建的容器: docker run --cpu-period 單個(gè)CPU調(diào)度周期時(shí)間(1000~1000000) --cpu-quota 容器進(jìn)程能夠使用的最大CPU時(shí)間(>=1000) 針對已存在的容器: 修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目錄下的 cpu.cfs_period_us(單個(gè)CPU調(diào)度周期時(shí)間) cpu.cfs_quota_us(容器進(jìn)程能夠使用的最大CPU時(shí)間) 文件的值 設(shè)置多個(gè)容器的CPU占用份額(只能在多個(gè)容器同時(shí)運(yùn)行且CPU資源緊張時(shí)生效) docker run --cpu-shares 容器進(jìn)程最大占用CPU的份額(值為1024的倍數(shù)) 設(shè)置容器綁定指定的CPU docker run --cpuset-cpus CPUID1[,CPUID2,....]
對內(nèi)存的限制
設(shè)置容器能夠使用的內(nèi)存和swap的值
docker run -m 內(nèi)存值 --memory-swap 內(nèi)存和swap的總值
設(shè)置 0 或 不設(shè)置,表示swap為內(nèi)存的2倍
設(shè)置 -1,表示不限制swap的值,宿主機(jī)有多少容器即可使用多少
設(shè)置 與 -m 一樣的值,表示不使用swap對磁盤IO的限制
docker run --device-read-bps 磁盤設(shè)備文件路徑:速率 #限制容器在某個(gè)磁盤上讀的速度
--device-write-bps 磁盤設(shè)備文件路徑:速率 #限制容器在某個(gè)磁盤上寫的速度
--device-read-iops 磁盤設(shè)備文件路徑:次數(shù) #限制容器在某個(gè)磁盤上讀的次數(shù)
--device-write-iops 磁盤設(shè)備文件路徑:次數(shù) #限制容器在某個(gè)磁盤上寫的速度以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker環(huán)境調(diào)用mysqldump進(jìn)行數(shù)據(jù)備份方式
這篇文章主要介紹了docker環(huán)境調(diào)用mysqldump進(jìn)行數(shù)據(jù)備份方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
3分鐘帶你學(xué)會(huì)docker搭建帕魯服務(wù)器
幻獸帕魯已經(jīng)正式開服,目前在線人數(shù)已經(jīng)超過7W+,很多玩家想自己創(chuàng)建服務(wù)器和朋友一起聯(lián)機(jī)游玩,本文主要介紹了3分鐘帶你學(xué)會(huì)docker搭建帕魯服務(wù)器,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Docker創(chuàng)建本地鏡像實(shí)現(xiàn)方法解析
這篇文章主要介紹了Docker創(chuàng)建本地鏡像實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Docker部署Mysql,.Net6,Sqlserver等容器
這篇文章介紹了Docker部署Mysql,.Net6,Sqlserver等容器的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
Docker中容器日志查看與監(jiān)控的5個(gè)必備排錯(cuò)命令
Docker 提供了強(qiáng)大的監(jiān)控與日志工具,只要掌握幾個(gè)關(guān)鍵命令,你就能像偵探一樣,快速找到問題根源,本文為大家整理了5 個(gè)必備排錯(cuò)命令,希望對大家有所幫助2025-11-11
如何使用 Gunicorn + Nginx + Docker 
本篇文章介紹了使用Gunicorn+Nginx+ocker器ginx三件套部署Dginx+Nginx+N開發(fā)服務(wù)器的全過程,本文結(jié)合實(shí)例給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-05-05

