目錄
一、理論
1.資源控制
2.Docker數據管理
二、實驗
1.Docker資源控制
2.Docker數據管理?
三、問題
1.docker容器故障導致大量日志集滿,造成磁盤空間滿
2、當日志占滿之后如何處理
四、總結
一、理論
1.資源控制
(1)??CPU 資源控制
?? cgroups,是一個非常強大的linux內核工具,他不僅可以限制被 namespace 隔離起來的資源, 還可以為資源設置權重、計算使用量、操控進程啟停等等。 所以 cgroups( Control groups) 實現了對資源的配額和度量。
(2)cgroups四大功能
●資源限制:可以對任務使用的資源總額進行限制●優先級分配:通過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上相當于控制了任務運行優先級●資源統計:可以統計系統的資源使用量,如cpu時長,內存用量等●任務控制:cgroup可以對任務執行掛起、恢復等操作
(3)??設置CPU使用率上限
? ? Linux 通過 CFS(Completely Fair Scheduler,完全公平調度器)來調度各個進程對 CPU 的使用。CFS 默認的調度周期是 100ms。(10萬微秒)
? ? ? ? 我們可以設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少 CPU 時間。
? ? ? ? 使用 --cpu-period 即可設置調度周期,使用 --cpu-quota 即可設置在每個周期內容器能使用的 CPU 時間。兩者可以配合使用。
? ? ? ? CFS 周期的有效范圍是 1ms~1s,對應的 --cpu-period 的數值范圍是 1000~100000。
? ? ? ? 而容器的 CPU 配額必須不小于 1ms,即 --cpu-quota 的值必須 >= 1000。
啟用一臺容器:
?
docker run -itd --name test1 centos:7 /bin/bash
cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默認為100000。
cpu.cfs_quota_us:表示該control group限制占用的時間(微秒),默認為-1,表示不限制。 如果設為50000,表示占用50000/100000=50%的CPU。
?
①進行CPU壓力測試
編寫一個腳本:
docker exec -it 3ed82355f811 /bin/bash
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
運行:
chmod +x /cpu.sh
./cpu.sh
exit
②設置50%的比例分配CPU使用時間上限
docker run -itd --name test2 --cpu-quota 50000 centos:7 /bin/bash #可以重新創建一個容器并設置限額
或者
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
exit
(4)??設置CPU資源占用比(設置多個容器時才有效)
Docker 通過--cpu-shares 指定 CPU 份額,默認值為1024,值為1024的倍數。
例:
? ? ? ? 創建兩個容器為 c1 和 c2,若只有這兩個容器,設置容器的權重,使得c1和c2的CPU資源占比為1/3和2/3。
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
分別進入容器,進行壓力測試
yum install -y epel-release
yum install stress -y
stress -c 4
(5)設置容器綁定指定的CPU
先分配虛擬機4個CPU核數
創建容器
docker run -itd --name cc1 --cpuset-cpus 1,3 centos:7 /bin/bash
進入容器,進行壓力測試
yum install -y epel-release
yum install stress -y
stress -c 4
exit
退出容器,執行 top 命令再按 1 查看CPU使用情況
(6)?對磁盤IO配額控制(blkio)的限制
--device-read-bps:限制某個設備上的讀速度bps(數據量),單位可以是kb、mb(M)或者gb。
例:
docker run -itd --name test4 --device-read-bps /dev/sda:1M centos:7 /bin/bash
--device-write-bps : 限制某個設備上的寫速度bps(數據量),單位可以是kb、mb(M)或者gb。
例:
docker run -itd --name test5 --device-write-bps /dev/sda:1M centos:7 /bin/bash
--device-read-iops :限制讀某個設備的iops(次數)
?
--device-write-iops :限制寫入某個設備的iops(次數)
創建容器,并限制寫速度
docker run -it --name cc3 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
通過dd來驗證寫速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct #添加oflag參數以規避掉文件系統cache
2.Docker數據管理
(1)數據卷
?數據卷是一個供容器使用的特殊目錄,位于容器中。可將宿主機的目錄掛載到數據卷上,對數據卷的修改操作立刻可見,并且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移。數據卷的使用類似于Linux下對目錄進行的mount操作。
例:
先下載一個鏡像
docker pull centos:7
宿主機目錄/var/www掛載到容器中的/data1。
注意:宿主機本地目錄的路徑必須是使用絕對路徑。如果路徑不存在,Docker會自動創建相應的路徑。
docker run -V /var/www:/data1 --name web1 -it centos:7 /bin/bash
#-v選項可以在容器內創建數據卷ls
echo "this is cc1" > /data1/abc.txt
exit#返回宿主機進行查看
cat /var/www/abc.txt
(2)數據卷容器
如果需要在容器之間共享一些數據,最簡單的方法就是使用數據卷容器。數據卷容器是一個普通的容器,專門提供數據卷給其他容器掛載使用。
例:
創建一個容器作為數據卷容器
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt
使用 --volumes-from來掛載web2容器中的數據卷到新的容器
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1 /abc.txt
cat /data2/ABC.txt
(3)端口映射
在啟動容器的時候,如果不指定對應的端口,在容器外是無法通過網絡來訪問容器內的服務。端口映射機制將容器內的服務提供給外部網絡訪問,實質上就是將宿主機的端口映射到容器中,使得外部網絡訪問宿主機的端口便可訪問容器內的服務。
docker run -d --name test1 -P nginx
#隨機映射端口( 從32768開始)
docker run -d --name test2 -p 43000:80 nginx
#指定映射端口
?(4)容器互聯(使用centos鏡像)
容器互聯是通過容器的名稱在容器間建立一條專門的網絡通信隧道。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息
例:
docker run -itd -P --name xx1 centos:7 /bin/bash
創建并運行接收容器取名xx2,使用--1ink選項指定連接容器以實現容器互聯
docker run -itd -P --name xx2 --link xx1:xx2 centos:7 /bin/bash
進xx2容器,ping xxl
docker exec -it xx2 bash
二、實驗
1.Docker資源控制
(1)設置CPU使用率上限
進行CPU壓力測試
編寫一個腳本:
?
?查看腳本占用CPU資源
?設置50%的比例分配CPU使用時間上限
?可以看到CPU占用率接近50%,cgroups對CPU的控制起了效果
?(2)設置CPU資源占用比(設置多個容器時才有效)
創建兩個容器為 c1 和 c2,若只有這兩個容器,設置容器的權重,使得c1和c2的CPU資源占比為1/3和2/3。
?分別進入容器,進行壓力測試
容器c1
?
?容器c2
?查看容器運行狀態(動態更新)
CPU總和是400%。因為虛擬機使用的是4核,而且C1和C2的CPU使用百分比約為1:2
?(3)設置容器綁定指定的CPU
已分配虛擬機4個CPU核數
?創建容器
只允許cc1容器使用第2個和第4個CPU
?
?進入容器
安裝依賴包
?安裝壓力測試工具
??進行壓力測試
?執行 top 命令
?再按 1 查看CPU使用情況,只有第2個和第4個CPU被使用
?(4)對磁盤IO配額控制(blkio)的限制
創建容器,并限制寫速度
可以看到寫的速度被限制了
清理docker占用的磁盤空間:
用于清理磁盤,刪除關閉的容器、無用的數據卷和網絡
2.Docker數據管理?
(1)?數據卷
先下載一個鏡像
?宿主機目錄/var/www掛載到容器中的/data1。
注意:宿主機本地目錄的路徑必須是使用絕對路徑。如果路徑不存在,Docker會自動創建相應的路徑。
文件內容一樣
?(2)數據卷容器
創建一個容器作為數據卷容器
使用 --volumes-from來掛載web2容器中的數據卷到新的容器
?是在上一個容器創建的文件,說明掛載成功
?(3)端口映射
? 在啟動容器的時候,如果不指定對應的端口,在容器外是無法通過網絡來訪問容器內的服務。端口映射機制將容器內的服務提供給外部網絡訪問,實質上就是將宿主機的端口映射到容器中,使得外部網絡訪問宿主機的端口便可訪問容器內的服務。
?
?
?(4)??容器互聯(使用centos鏡像)
容器互聯是通過容器的名稱在容器間建立一條專門的網絡通信隧道。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息
創建并運行源容器取名xx1
?創建并運行接收容器取名xx2,使用--1ink選項指定連接容器以實現容器互聯
?進xx2容器,ping xxl
三、問題
1.docker容器故障導致大量日志集滿,造成磁盤空間滿
(1)解決方案
清除日志
#!/bin/bash
logs=$ (find /var/lib/docker/containers/ -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done
2、當日志占滿之后如何處理
###設置docker日志文件數量及每個日志大小vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver": "json-file", ? #我的一日志格式
"log-opts": { "max-size" : "500m", "max-file" : "3"} ? 日志的參數最大500M ? 我最大容器中有三個日志文件 每個日志文件大小是500M
}
修改完需要重新加載 ?systemctl daemon-reload
四、總結
清理docker占用的磁盤空間:
docker system prune -a #可以用于清理磁盤,刪除關閉的容器、無用的數據卷和網絡