docker的底層原理及運用

Docker虛擬化與普通虛擬化的區別
Docker虛擬化佔用資源較少,更快的啓動,具備更好的性能,而普通虛擬化佔用資源較大啓動須要1,2分鐘。Docker中的容器與宿主機的內核相同,若是虛擬機服務器對內核版本有要求,這個服務就不太適合docker來實現,而適合普通虛擬化。
注意:**全虛擬化,所須要的硬件都必須準備好(KVM,vm)nginx

docker容器與宿主機內核的關係:
查看鏡像
docker images
進入容器
docker run -it centos:latest /bin/bash
docker run -it --name test centos:7 /bin/bash
查看容器根目錄(與宿主機的/目錄基本相同)
docker的底層原理及運用
由此能夠看出內核也相同
若是虛擬機服務對內核版本有要求,這個服務就不太適合docker來實現了。
內核,若是須要安裝的服務與宿主機的內核不匹配,那麼能夠考慮,別的虛擬化軟件,由於容器中的內核與宿主機的內核相同*。web

busybox:欺騙層。
Docker是不佔用端口的,運用的是在後臺運行(由圖)
docker的底層原理及運用
解耦:解除耦合,解除衝突
耦合:衝突現象。

在docker程序run ......》新的centos系統(nginx,web)
對於docker來講只是運行了一個進程而已。docker

Namespace和cgroup的意思與做用:
Namespace(名稱空間);用來隔離容器
Cgroup(控制組):對容器資源的限制。
Namespace的六項隔離,與docker容器cgroup方面的功能:***
Namespace的六項隔離:
IPC:共享內存,消息隊列
MNT:掛載點,文件系統
NET:網絡棧
PID:進程編號
USER:用戶。組
UTS:主機名,域名。
Namespec :六項隔離,實現了容器與宿主機,容器與容器之間的隔離。
cgroup的功能:
1》資源限制:cgroup能夠對進程組使用的資源總額進行限制。
2>優先級分配:經過分配的cpu時間片數量以及硬盤IO帶寬的大小,實際上相對於控制了進程運行的優先級別
3》資源統計:cgroup能夠統計系統資源使用量,好比cpu使用時間,內存使用量等,用於按量計費,同時還支持掛起動能,也就是說經過cgroup把全部資源限制起來,對資源都不能使用,注意着並非說咱們的程序不能使用了,知識不能使用資源,處於等待狀態。
4》進程控制;能夠對進程組執行掛起,恢復等操做。*centos

測試實驗:
下載一個httpd
docker的底層原理及運用
啓動
systemctl start httpdbash

資源的限制
cd /sys/fs/cgroup
目錄下是對cpu 內存等的各類限制
權重值
cat cpu.shares
docker的底層原理及運用
cat tasks(pid編號)
這裏記錄的都是進程編號
docker的底層原理及運用服務器

選項:
內存限額:
容器內存包括兩個部分,物理內存,和swap
能夠經過參數控制容器內存使用量:
-m或者--memory:設置內存的使用限額
--memory-swap:設置內存+swap的使用限額。
舉個例子:
運行一個容器,而且限制該容器最多使用200M內存和100M的swap
dokcer run -it -m 200M  --memory-swap 300M centos:7
**進入此目錄下能夠清晰查看內存與swap等限制:**
[root@4e168a544caf memory]# pwd
/sys/fs/cgroup/memory
內存使用限制
[root@4e168a544caf memory]# cat  memory.limit_in_bytes 
209715200字節
內存+swap限制
[root@4e168a544caf memory]# cat memory.memsw.limit_in_bytes 
314572800

對比一個沒有限制的容器咱們會發現,若是運行容器以後不限制內存的話,意味着沒有限制。網絡

CPU使用,
經過-c使用--cpu-shares設置容器使用cpu的權重,若是不設置,默認爲1024
舉個例子:
沒有限制 :(1024)
** docker  run  -it --name  containerA centos:7**
[root@dbe30b65321c /]# cd /sys/fs/cgroup/cpu
[root@dbe30b65321c cpu]# cat cpu.shares 
1024(默認值)

有限制:(512)
**docker run -it  --name  containerB  -c 512  centos:7**
[root@7b8e6a807f06 cpu]# cat cpu.shares 
512(限制的值)
[root@7b8e6a807f06 cpu]# pwd
/sys/fs/cgroup/cpu

**容器的Block  IO
磁盤的讀寫;**
Docker  中能夠經過設置權重,限制bps和iops的方式控制容器讀寫磁盤的IO,
Bps:每秒讀寫的數據量 byte  per  second
Iops:每秒IO的次數,io per  second
默認狀況下,全部容器都可以平等的讀寫磁盤。也能夠經過--blkio-weight參數改變容器的blockIO的優先級

--device-read-bps:顯示讀取某個設備的bps:
--device-write-bps:顯示寫入某個設備的bps
--device-read-iops:顯示讀取某個設備的iops
--device-write-iops:顯示寫入某個設備的iops
好比:
1.限制testA這個容器。寫入/dev/sda這塊磁盤的bps爲30MB
*docker  run  --name  testA  --device-write-bps /dev/sda:30MB centos:7*
刪除容器:
*docker rm  testA*
2.從/dev/zero輸入,而後輸出到tet.out文件中,每次大小爲1M,總共800次,oflag=direct用來指定directlO方式寫文件,這樣纔會使—device-write-bps生效。
[**root@docker ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos:7
[root@cf54dd8861da /]# time  dd  if=/dev/zero  of=test.out  bs=1M count=800  oflag=direct**

docker的底層原理及運用
[root@cf54dd8861da /]# du -h test.out
800M test.out
沒有對testB限制磁盤的讀寫(代表該下載與上傳只與網速相關)
[root@docker ~]# docker run -it --name testB centos:7
[root@3a76843b4339 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 1.54945 s, 541 MB/side

real 0m1.551s
user 0m0.001s
sys 0m0.636s性能

根據對比也能夠看出無法限制空間利用率大小測試

相關文章
相關標籤/搜索