一 docer運行應用
1.1 常見容器運行
1 root@docker:~# docker #查看docker相關命令
2 root@docker:~# docker run -d -p 80:80 httpd #從docker hub下載httpd鏡像,啓動httpd容器,並將容器的80端口映射到宿主機的80端口
3 root@docker:~# docker run centos:7 echo "hello world"
4 hello world
docker容器能夠理解爲在沙盒中運行的進程。這個沙盒包含了該進程運行所必須的資源,包括文件系統、系統類庫、shell 環境等等。但這個沙盒默認是不會運行任何程序的。你須要在沙盒中運行一個進程來啓動某一個容器。這個進程是該容器的惟一進程,因此當該進程結束的時候,容器也會徹底的中止。
1 root@docker:~# docker ps #查看運行的容器狀況
參數說明:
- CONTAINER ID:容器ID
- NAMES:自動分配的容器名稱
1 root@docker:~# docker logs 634cf027ad85 #查看容器內的標準輸出
2 root@docker:~# docker stop 634cf027ad85 #中止容器
3 root@docker:~# docker ps #再次查看
注意:
同一倉庫源能夠有多個 TAG,表明這個倉庫源的不一樣個版本,如ubuntu倉庫源裏,有15.十、14.04等多個不一樣的版本,咱們使用 REPOSTITORY:TAG 來定義不一樣的鏡像。
若運行docker時不指定tag,則默認使用latest鏡像。
1.2 交互式運行容器
1 root@docker:~# docker run -i -t centos:7 /bin/bash
各個參數解析:
- -t:在新容器內指定一個僞終端或終端。
- -i:容許你對容器內的標準輸入 (STDIN) 進行交互。
二 運行Web應用及其餘操做
2.1 容器後端運行
1 root@docker:~# docker pull training/webapp
2 root@docker:~# docker run -d -P training/webapp python app.py
參數說明:
- -d:讓容器在後臺運行。
- -P:將容器內部使用的網絡端口映射到咱們使用的主機上。
1 root@docker:~# docker ps
可知此docker開放了5000端口映射到主機端口32768上。
測試訪問。
2.2 指定端口運行容器
1 root@docker:~# docker run -d -p 8080:5000 training/webapp python app.py #使用-p參數來綁定指定端口。
2 root@docker:~# docker run -d -p 9090:5000/tcp --name web training/webapp python app.py #使用--name標記能夠爲容器命名
3 root@docker:~# docker ps
注意:容器的名稱是惟一的,若命名了一個叫web的容器,當再次使用web這個名稱時,須要用docker rm刪除以前建立的容器,也能夠再執行docker run的時候加—rm標記來中止舊的容器,並刪除,rm和-d參數是不兼容的。
測試新綁定的端口。
1 root@docker:~# docker port 25cbcff93d56
2 5000/tcp -> 0.0.0.0:8080
3 root@docker:~# docker port 95b731acd6b5
4 5000/tcp -> 0.0.0.0:32768
2.3 進入容器
1 root@docker:~# docker exec -it 5e7ad2db2304 /bin/bash
2 root@docker:~# docker exec -it web /bin/bash
2.4 容器其餘操做
1 root@docker:~# docker logs -f 95b731acd6b5 #查看運行日誌
2 root@docker:~# docker inspect web #查看Docker容器的配置和狀態信息
3 root@docker:~# docker restart 5e7ad2db2304 #重啓docker
4 root@docker:~# docker stop 95b731acd6b5 #中止docker
5 root@docker:~# docker kill 25cbcff93d56 #中止docker
6 root@docker:~# docker ps -a #查看全部容器狀況
7 root@docker:~# docker start 95b731acd6b5 #運行已中止的docker
8 root@docker:~# docker rm 95b731acd6b5 #刪除該docker
注意:刪除容器時,容器必須是中止狀態,查看容器詳細信息可輸入前部分ID,如docker inspect 6b52。
1 root@docker:~# docker pause 5e7ad2db2304 #暫停容器
2 root@docker:~# docker unpause 5e7ad2db2304 #恢復容器
三 容器生命週期管理
3.1 容器生命週期
四 docker資源限制
用戶內存限制就是對容器能使用的內存和交換分區的大小做出限制。
4.1 資源限制意義
主機運行若干容器,每一個容器都須要cpu、內存以及IO資源,爲避免由於單個容器佔用過多資源而影響到全部其餘容器乃至整個宿主機的性能,須要對容器資源進行限制。
五 docker內存限制
5.1 內存限制
Docker 提供的內存限制功能有如下幾點:
- 容器能使用的內存和交換分區大小。
- 容器的核心內存大小。
- 容器虛擬內存的交換行爲。
- 容器內存的軟性限制。
- 是否殺死佔用過多內存的容器。
- 容器被殺死的優先級。
通常狀況下,達到內存限制的容器過段時間後就會被系統殺死。
5.2 內存限制相關參數
執行docker run命令時能使用的和內存限制相關的全部選項以下。
選項
|
描述
|
-m,--memory
|
內存限制,格式是數字加單位,單位能夠爲 b,k,m,g。最小爲4M
|
--memory-swap
|
內存+交換分區大小總限制,格式同上,必須比-m設置的值大
|
--memory-reservation
|
內存的軟性限制,格式同上
|
--oom-kill-disable
|
是否阻止 OOM killer 殺死容器,默認沒設置
|
--oom-score-adj
|
容器被 OOM killer 殺死的優先級,範圍是[-1000, 1000],默認爲 0
|
--memory-swappiness
|
用於設置容器的虛擬內存控制行爲。值爲 0~100 之間的整數
|
--kernel-memory
|
核心內存限制。格式同上,最小爲 4M
|
提示:
-m,--memory選項的參數最小爲 4 M;
--memory-swap不是交換分區,而是內存加交換分區的總大小,因此--memory-swap必須比-m,--memory大;
若不設置-m,--memory和--memory-swap,容器默承認用完宿主機全部內存和swap分區。但容器佔宿主機全部內存和swap分區超過一段時間後,會被宿主機系統殺死(若沒有設置--00m-kill-disable=true)。
5.3 內存設置方式
- 設置-m,--memory,不設置--memory-swap
1 root@docker:~# docker run -d --name ubuntu_01 -m 1G --memory-swap 0 ubuntu:16.04
#該容器能使用的內存大小爲1G,能使用的 swap 分區大小也爲1G,容器內的進程能申請到的總內存大小爲2G。
做用:使用-m或--memory設置一個不小於 4M 的a值,不設置--memory-swap,或將--memory-swap設置爲 0。則表示容器能使用的內存大小爲 a,能使用的交換分區大小也爲 a。由於 Docker 默認容器交換分區的大小和內存相同。若容器中運行一個一直不停申請內存的程序,則該程序最終能使用的內存大小爲 2a。
- 設置-m,--memory=a,--memory-swap=b,且b > a
1 root@docker:~# docker run -d --name ubuntu_02 -m 1G --memory-swap 3G ubuntu:16.04
#該容器能使用的內存大小爲 1G,能使用的 swap 分區大小爲 2G。容器內的進程能申請到的總內存大小爲 3G。
做用:使用-m或--memory設置一個不小於 4M 的a值,且b必須大於a,使用--memory-swap設置一個參數 b。則表示容器能使用的內存大小爲 a,能使用的交換分區+內存大小爲 b,b-a 即爲容器能使用的 swap 分區大小。
- 設置-m,--memory=a,--memory-swap=-1
1 root@docker:~# docker run -d --name ubuntu_03 -m 1G --memory-swap -1 ubuntu:16.04
#該容器能使用的內存大小爲 1G,且不限制容器使用swap分區大小,即1G+宿主機swap大小。
做用:使用-m或--memory設置一個不小於 4M 的a值,使用--memory-swap設置一個參數-1,則表示限制容器能使用的內存大小爲 a,且不限制容器使用 swap 分區大小。
提示:若出現以下提示:
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
可打開內核內存限制的操做:
1 root@docker:~# vi /etc/default/grub
2 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
3 root@docker:~# update-grub #重啓系統
5.4 內存軟性限制
設置--memory-reservation。
1 root@docker:~# docker run -d --name ubuntu_04 -m 2G --memory-reservation 1G ubuntu:16.04
#該容器能使用的內存大小爲 2G,當宿主機內存資源緊張時,系統會回收1G內存,以便嘗試將容器的內存鎖緊到 1G 如下。
做用:Memory reservation是一種軟性限制,用於節制容器內存使用。使用--memory-reservation設置一個比-m小的值後,雖然容器最多可使用-m設置的內存大小,但在宿主機內存資源緊張時,在系統的下次內存回收時,系統會回收容器的部份內存頁,強迫容器的內存佔用回到--memory-reservation設置的值大小。沒有設置時(默認狀況下)--memory-reservation的值則--memory-reservation和-m的限定的值相同。將它設置爲 0 或設置的比-m的參數大等同於沒有設置。這種軟性機制,它不保證任什麼時候刻容器使用的內存不會超過--memory-reservation限定的值,它只是確保容器不會長時間佔用超過--memory-reservation限制的內存大小。
5.5 OOM killer
1 root@docker:~# docker run -d --name ubuntu_05 -m 1G --oom-kill-disable ubuntu:16.04
#該容器能使用的內存大小爲 1G,並禁止了 OOM killer。
做用:OOM killer機制指默認狀況下,在出現 out-of-memory(OOM) 錯誤時,系統會殺死容器內的進程來獲取更多空閒內存。經過設置--oom-kill-disable選項來禁止 OOM killer 殺死容器內進程。但請確保只有在使用了-m/--memory選項時才使用--oom-kill-disable禁用 OOM killer。若是沒有設置-m選項,卻禁用了 OOM-killer,可能會形成出現 out-of-memory 錯誤時,系統經過殺死宿主機進程或獲取更改內存。
5.6 --memory-swappiness
1 root@docker:~# docker run -d --name ubuntu_06 --memory-swappiness=0 ubuntu:16.04
#該容器關閉了匿名頁面交換,能夠保持容器的工做集,避免交換代理的性能損失。
做用:默認狀況下,容器的內核能夠交換出必定比例的匿名頁。--memory-swappiness可設置從 0 到 100這個比例。0 表示關閉匿名頁面交換。100 表示全部的匿名頁均可以交換。默認狀況下,若是不使用--memory-swappiness,則該值從父進程繼承而來。
注意:--memory-swappiness=0 表示禁用容器 swap 功能。
六 CPU限制
Docker 的資源限制和隔離徹底基於 Linux cgroups。對 CPU 資源的限制方式也和 cgroups 相同。Docker 提供的 CPU 資源限制選項能夠在多核系統上限制容器能利用哪些 vCPU。而對容器最多能使用的 CPU 時間有兩種限制方式:
- 當多個 CPU 密集型的容器競爭 CPU 時,設置各個容器能使用的 CPU 時間相對比例。
- 以絕對的方式設置容器在每一個調度週期內最多能使用的 CPU 時間。
6.1 CPU限制相關參數
執行docker run命令時能使用的和內存限制相關的全部選項以下。
選項
|
描述
|
--cpuset-cpus=""
|
容許使用的 CPU 集,值能夠爲 0-3,0,1
|
-c,--cpu-shares=0
|
CPU 共享權值(相對權重)
|
cpu-period=0
|
限制 CPU CFS 的週期,範圍從 100ms~1s,即[1000, 1000000]
|
--cpu-quota=0
|
限制 CPU CFS 配額,必須不小於1ms,即 >= 1000
|
--cpuset-mems=""
|
容許在上執行的內存節點(MEMs),只對 NUMA 系統有效
|
其中--cpuset-cpus用於設置容器可使用的 vCPU 核。-c,--cpu-shares用於設置多個容器競爭 CPU 時,各個容器相對能分配到的 CPU 時間比例。--cpu-period和--cpu-quata用於絕對設置容器能使用 CPU 時間。
6.2 CPU集
1 root@docker:~# docker run -d --name ubuntu_07 --cpuset-cpus="1,3" ubuntu:16.04
#表示容器中的進程能夠在 cpu 1 和 cpu 3 上執行。
6.3 CPU 資源的相對限制
默認狀況下,全部的容器獲得同等比例的 CPU 週期。在有多個容器競爭 CPU 時可設置每一個容器能使用的 CPU 時間比例。這個比例叫做共享權值,經過-c或--cpu-shares設置。Docker 默認每一個容器的權值爲 1024。不設置或將其設置爲 0,都將使用這個默認值。系統會根據每一個容器的共享權值和全部容器共享權值和比例來給容器分配 CPU 時間。
舉例:
假設有三個正在運行的容器,這三個容器中的任務都是 CPU 密集型的。第一個容器的 cpu 共享權值是 1024,其它兩個容器的 cpu 共享權值是 512。第一個容器將獲得 50% 的 CPU 時間,而其它兩個容器就只能各獲得 25% 的 CPU 時間了。若是再添加第四個 cpu 共享值爲 1024 的容器,每一個容器獲得的 CPU 時間將從新計算。第一個容器的CPU 時間變爲 33%,其它容器分得的 CPU 時間分別爲 16.5%、16.5%、33%。
注意:這個比例只有在 CPU 密集型的任務執行時纔有用。在四核的系統上,假設有四個單進程的容器,它們都能各自使用一個核的 100% CPU 時間,無論它們的 cpu 共享權值是多少。
在多核系統上,CPU 時間權值是在全部 CPU 核上計算的。即便某個容器的 CPU 時間限制少於 100%,它也能使用各個 CPU 核的 100% 時間。
例如,假設有一個不止三核的系統。用-c=512的選項啓動容器{C0},而且該容器只有一個進程,用-c=1024的啓動選項爲啓動容器C1,而且該容器有兩個進程。CPU 權值的分佈多是這樣的:
1 PID container CPU CPU share
2 100 {C0} 0 100% of CPU0
3 101 {C1} 1 100% of CPU1
4 102 {C1} 2 100% of CPU2
6.4 CPU 資源的絕對限制
Linux 經過 CFS(Completely Fair Scheduler,徹底公平調度器)來調度各個進程對 CPU 的使用。CFS 默認的調度週期是 100ms。
可設置每一個容器進程的調度週期,以及在這個週期內各個容器最多能使用多少 CPU 時間。使用--cpu-period便可設置調度週期,使用--cpu-quota便可設置在每一個週期內容器能使用的 CPU 時間。二者通常配合使用。
root@docker:~# docker run -d --name ubuntu_08 --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04
#將 CFS 調度的週期設爲 50000,將容器在每一個週期內的 CPU 配額設置爲 25000,表示該容器每 50ms 能夠獲得 50% 的 CPU 運行時間。
$ docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash
root@docker:~# docker run -d --name ubuntu_09 --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04
將容器的 CPU 配額設置爲 CFS 週期的兩倍,即容器分配兩個 vCPU 就能夠了。該配置表示容器能夠在每一個週期內使用兩個 vCPU 的 100% 時間。
提示:CFS 週期的有效範圍是 1ms~1s,對應的--cpu-period的數值範圍是 1000~1000000。而容器的 CPU 配額必須不小於 1ms,即--cpu-quota的值必須 >= 1000。能夠看出這兩個選項的單位都是 us。
七 Block IO限制
Block IO 是另外一種能夠限制容器使用的資源。Block IO 指的是磁盤的讀寫,docker 可經過設置權重、限制 bps 和 iops 的方式控制容器讀寫磁盤的帶寬。
選項
|
描述
|
--blkio-weight
|
設置的都是資源使用的權重
提示:該設置都是資源緊張的狀況下才會起到權重的做用,正常狀況下,都是平等的。
--blkio-weight-device 針對特定的設備設置權重
|
--device-read-bps
|
限制讀某個設備的bps(數據量)
|
--device-write-bps
|
限制寫入某個設備的bps(數據量)
|
--device-read-iops
|
限制讀某個設備的iops(次數)
|
--device-write-iops
|
限制寫入某個設備的iops(次數)
|
注意:目前 Block IO 限額只對 direct IO(不使用文件緩存)有效。
7.1 block IO 權重
1 root@docker:~# docker run -d --name ubuntu_10 --blkio-weight 600 ubuntu:16.04
2 root@docker:~# docker run -d --name ubuntu_11 --blkio-weight 300 ubuntu:16.04
#ubuntu_10容器的讀寫磁盤的帶寬是ubuntu_11的兩倍。
7.2 限制 bps 和 iops
bps:byte per second,每秒讀寫的數據量。
iops:io per second,每秒 IO 的次數。
1 root@docker:~# docker run -d --name ubuntu_12 --device-write-bps /dev/sda:30MB ubuntu:16.04
#ubuntu_12容器寫 /dev/sda 的速率爲 30 MB/s。