1. 程式人生 > >Docker學習<三>

Docker學習<三>

技術 swap img 執行 cgroup wap 所有 swa 參數

Docker啟動容器

docker run命令啟動容器,添加參數--name可以根據容器的性質和用途自行給容器命名,如果沒有用--name參數,docker會自動給容器起名

進入容器的兩種方法:attach、exec

通過docker attach可以attach到容器啟動命令的終端,可通過Ctrl+p然後Ctrl+q組合鍵退出attach終端

通過docker exec進入相同的容器,說明如下:

1. -it以交互模式打開pseudo -TTY,執行bash,其結果就是打開一個bash終端

2. 進入容器中,容器的hostname就是“短ID”

3. 可以像在普通的Linux中一樣執行命令

4. 執行exit退出容器,回到Docker host

docker exec -it <container> bash | sh是執行exec最常用的方式

attach與exec的區別

1. attach直接進入容器啟動命令的終端,不會啟動新的進程

2. exec則是在容器中打開新的終端,並且可以啟動新的進程

3. 如果想直接在終端查看啟動命令的輸出,可以使用docker logs命令,-f參數可以持續打印輸出

按用途容器大致可以分為兩類:服務類容器和工具類容器

1. 服務類容器以daemon的形式運行,對外提供服務。比如web server,數據庫等。通過-d參數以守護方式啟動這類容器非常合適。如果需要排查問題,可以通過exec -it進入容器

2. 工具類容器通常給我們提供一個臨時的工作環境,通常以run -it方式運行

容器常用的操作

stop/start/restart

通過docker stop可以停止運行的容器。容器在Docker host中實際上是一個進程,docker stop命令本質上是向該進程發送一個SIGTERM信號,如果想快速停止容器,可以使用docker kill命令

對於停止的容器,可以通過docker start啟動,docker start會保留容器第一次啟動時的所有參數

docker restart用於重啟容器。用docker run命令啟動容器時,可以加上參數--restart=always,意味著不論容器因何種原因退出,都立即重啟。該參數的形式還可以是--restart=no-failure:3,意思是如果啟動進程退出代碼非0,則重啟容器,最多重啟三次

pause/unpause容器

docker pause可以讓容器暫時停止工作,處於暫停狀態的容器不會占用CPU資源,直到通過docker unpause恢復運行

刪除容器

退出的容器依然會占用Docker host的文件系統資源,如果確定不再使用這些容器,可以使用docker rm來刪除,docker rm一次可以指定多個容器,如果希望批量刪除停止的容器,可以使用以下命令

docker rm -v $(docker ps -aq -f status=exited)

限制容器對內存的使用

內存限額

容器可使用內存包括兩部分:物理內存和swap。Docker通過以下兩個參數來控制容器內存的使用量

1. -m或--memory:設置內存的使用限額,如1G

2. --memory-swap:設置內存+swap使用限額

當我們執行docker run -m 200M --memory-swap=300M ubuntu,其含義是允許容器最多使用200M的內存和100M的swap。默認以上兩個參數都為-1,即對容器的內存和swap的使用沒有限制

下面使用progrium/stress鏡像來學習如何為容器分配內存,該鏡像可對容器執行壓力測試,執行命令如下

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

--vm 1:啟動一個工作線程

--vm-bytes 280M:每個線程分配280M內存

運行結果如下

技術分享圖片

因為280M在可分配範圍(300M)內,因此工作線程可以正常工作,其過程為

1. 分配280M內存

2. 釋放280M內存

3. 再分配280M內存

4. 再釋放280M內存

5. 一直循環……

如果我們分配的內存超過300M,結果如下

技術分享圖片

如果分配內存超過限額,stress線程報錯,容器自動退出

如果啟動容器時只指定了-m參數而沒有指定--memory-swap參數,那麽--memory-swap默認是-m的兩倍

限制容器CPU的使用

Docker可以通過-c或-cpu-shares設置容器使用CPU的權重。如果不指定,默認為1024。與內存限額不同的是,通過-c設置的cpu share並不是一個絕對的數值,而是一個相對的權重值。某個容器最終能分配到的CPU取決於它的cpu share占所有cpu share總和的比例。也就是說,通過cpu share可以設置容器cpu使用的優先級

下面繼續用progrium/stress來做測試

1. 啟動container_A,cpu share為1024

技術分享圖片

其中--cpu為當前host的CUP顆數,本機為2顆

2. 啟動container_B,cpu share為512

技術分享圖片

3. 在host中執行top,查看容器對CPU的使用情況

技術分享圖片

container_A消耗是container_B的兩倍

4. 暫停container_A

技術分享圖片

5. top顯示container_B在container_A空閑時能夠用滿整個CPU

技術分享圖片

限制容器Block IO

block IO權重

默認情況下,所有容器能平等地讀寫磁盤,可以通過設置--blkio-weight參數來改變容器block IO的優先級。--blkio-weight與--cpu-shares類似,設置的是相對權重值,默認是500。下面例子是container_A讀寫磁盤的帶寬是container_B的兩倍

docker run -it --name container_A --blkio-weight 600 ubuntu

docker run -it --name container_B --blkio-weight 300 ubuntu

限制bps和iops

bps為每秒讀寫的數據量,iops為每秒IO的次數。可以通過下面的參數來控制容器的bps和iops

--device-read-bps:限制讀某個設備的bps

--device-write-bps:限制寫某個設備的bps

--device-read-iops:限制讀某個設備的iops

--device-write-iops:限制寫某個設備的iops

下面的例子限制容器寫/dev/sda的速度為30MB/s

技術分享圖片

通過dd測試在容器中寫磁盤的速度,oflag=direct指定用direct IO方式寫文件,這樣--device-write-bps才能生效。結果表明bps=23.3MB/s,沒有超過30MB/s的限速

作為對比,如果不限速

技術分享圖片

cgroup實現資源限額,namespace實現資源隔離

Docker容器小結

下面是容器常用的操作命令

      create:創建容器
      run:運行容器
      pause:暫停容器
      unpause:取消暫停繼續運行容器
      stop:停止容器
      kill:快速停止容器
      start:開啟容器
      restart:重啟容器
      attach:attach到容器啟動進程的終端
      exec:在容器中啟動新進程,通常使用-it參數
      logs:顯示容器啟動進程的控制臺輸出,用-f持續打印
      rm:刪除容器

Docker學習<三>