Docker學習<三>
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學習<三>