實踐:Docker容器與映象管理

安全劍客發表於2020-06-18
Docker 是一個用於開發,交付和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎架構分開,從而可以快速交付軟體;藉助 Docker,您可以與管理應用程式相同的方式來管理基礎架構;通過利用 Docker 的方法來快速交付,測試和部署程式碼,您可以大大減少編寫程式碼和在生產環境中執行程式碼之間的延遲。

實踐:Docker容器與映象管理實踐:Docker容器與映象管理

容器管理
執行容器

1、執行一個容器示例:

# 啟動一個httpd容器,使其在後臺執行並將其80埠對映到宿主機80埠

docker run -d -p 80:80 httpd

2、將容器在前臺執行:

# 啟動一個ubuntu 16.04的容器,列印完"hello world"即退出

docker run ubuntu:16.04 /bin/echo " hello world "

# 在前臺執行容器並進入容器與容器互動

docker run ubuntu:16.04 /bin/bash

需要說明的是,容器是為任務而生的。一個容器建議只執行一個程式,而且這個程式需要在容器的前臺執行,不能通過daemon的方式執行。如果程式退出,容器也會隨之停止

3、容器的啟動過程說明:

檢查本地是否存在指定的映象,如果沒有就從指定的倉庫下載

利用映象啟動一個容器

分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層

從宿主機配置的網橋介面中橋接一個虛擬介面到容器中去

從地址池配置一個IP給容器

執行使用者指定的程式

執行完畢後停止容器

4、將容器放入後臺執行:

docker run -d ubuntu:16.04 /bin/bash -c "while true; do echo hello world; sleep 1;done"

5、docker run常用選項說明

-t:配置一個偽終端並繫結到容器的標準輸入上

-i:讓容器的標準輸入保持開啟

-d:將容器放入後臺執行

-c:指定分配該容器的cpu分片

-m:指定分配給該容器的記憶體大小,單位為B,K,M,G

6、檢視當前節點上的容器狀態

docker ps    #檢視當前正在執行的容器

選項:

-a:檢視所有容器,包括停止的

-q:只顯示容器ID

-l:顯示最後一次建立的容器

7、進入容器

docker attach <容器name>    # 多個視窗同時attach到一個視窗時,會同步顯示,該指令已廢棄
docker exec -it <容器id/容器name> /bin/bash

8、執行容器的最佳實踐

容器按用途大致可分為兩類:

服務類容器,如webserver、database等

工具類容器,如curl容器、redis-cli容器等

通常而言,服務類容器需要長期執行,所以使用daemon的方式執行;而工作類環境通常是給我們提供一個臨時的工作環境,所以一般以run –ti的方式在前臺執行

容器的啟停操作
# 容器的建立:
	docker create 
# 容器的啟動:
	docker start <容器id>
# 容器的停止:
	docker stop <容器id>
	docker kill <容器id>
# 容器的重啟:
	docker restart <容器id>
# 容器的刪除:
	docker rm <容器id>
	選項:
    	-f:強行終止並刪除一個執行中的容器
        -v:刪除容器掛載的資料卷 
# 暫停容器:
	docker pause <容器id>
# 從暫停中恢復:
	docker unpause <容器id>
容器匯入匯出
#不管容器是否在執行,均可直接匯出
docker export> test_for_run.tar    
#載入,實現容器遷移
cat test_for_run.tar | docker import - test/ubuntu:v1.0
容器生命週期管理

實踐:Docker容器與映象管理實踐:Docker容器與映象管理

容器資源限制

一個docker host上會執行若干容器,每個容器都需要CPU、記憶體和 IO 資源。對於 KVM,VMware等虛擬化技術,使用者可以控制分配多少 CPU、記憶體資源給每個虛擬機器。對於容器,Docker 也提供了類似的機制避免某個容器因佔用太多資源而影響其他容器乃至整個 host 的效能。

記憶體限制

啟動一個ubuntu容器,限制記憶體為200M, 記憶體與swap的總和為300M:

docker run -it -m 200M --memory-swap 300M ubuntu:16.04

選項說明:

-m:允許分配的記憶體大小

--memory-swap:允許分配的記憶體和swap的總大小

--memory-swapiness:控制記憶體與swap置換的比例

需要說明的是,如果啟用了--memory-swap引數,相當於使用了swap,則實際記憶體限制並不生效,要想限制生效,可以不啟動該引數,且將--memory-swappiness置為0

下面是一個壓測示例:

docker run –it –m 200M –memory-swapiness 0 progrium/stress –-vm 1 –-vm-bytes 180M

選項:

--vm:設定記憶體工作執行緒數

--vm-byptes:設定單個記憶體工作執行緒使用的記憶體大小

上面的示例中,--vm-bytes為180M,容器工作正常;如果將其修改為230M,則容器OOM退出

關於記憶體資源的更多限制可以參考這裡:https://blog.opskumu.com/docker-memory-limit.html

CPU限制

預設情況下,所有容器可以平等的使用宿主機cpu資源且沒有限制。docker可以通過-c或--cpu-shares設定容器使用的cpu的許可權。如果不指定,預設為1024。

與記憶體限額不同,通過 -c 設定的 cpu share 並不是 CPU 資源的絕對數量,而是一個相對的權重值。某個容器最終能分配到的 CPU 資源取決於它的 cpu share 佔所有容器 cpu share 總和的比例。

換句話說:通過cpu share可以設定容器使用CPU的優先順序。

例如,在host中啟動了兩個容器:

docker run --name container_A -c 1024 ubuntu
docker run --name container_B -c 512 ubuntu

container_A的cpu share 1024,是 container_B 的兩倍。當兩個容器都需要 CPU 資源時,container_A可以得到的 CPU 是container_B的兩倍。

需要特別注意的是,這種按權重分配CPU只會發生在CPU 資源緊張的情況下。如果container_A 處於空閒狀態,這時,為了充分利用CPU資源,container_B 也可以分配到全部可用的 CPU。

下面是一個壓測示例:

# --cpu用於設定cpu工作執行緒的數量,有幾個核就設定為幾

docker run --name "container_A" -c 1024 progrium/stress --cpu 1
docker run --name "container_B" -c 512 progrium/stress --cpu 1

兩個容器執行起來之後,可以通過在宿主機上使用top檢視cpu的資源消耗可以看到兩個容器的cpu消耗。

關於cpu資源的更多限制可以參考這裡:https://blog.opskumu.com/docker-cpu-limit.html

io 限制

Block IO 是另一種可以限制容器使用的資源。Block IO 指的是磁碟的讀寫,docker 可通過設定權重、限制 bps 和 iops 的方式控制容器讀寫磁碟的頻寬,下面分別討論。

需要說明的是,目前Block IO限額只對direct IO(不使用檔案快取)有效

下面是限制bps和iops的引數說明:

--device-read-bps,限制讀某個裝置的 bps。

--device-write-bps,限制寫某個裝置的 bps。

--device-read-iops,限制讀某個裝置的 iops。

--device-write-iops,限制寫某個裝置的 iops。

bps是byte per second,每秒讀寫的資料量

iops是io per second,每秒io的次數

簡單示例

# 建立一個容器,限制寫的bps為30M

docker run -it --device-write-bps /dev/sda:30MB ubuntu

# 容器中,執行如下操作檢視效果,然後可以通過取消限制,來檢視對比效果:

time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

關於io資源的更多限制可以參考這裡:https://blog.opskumu.com/docker-io-limit.html

映象管理

映象命名規範

無論我們對映象做何種操作,首先它得有個名字。我們在前面使用docker run來執行容器的時候,就需要傳遞一個映象名稱,容器基於該映象來執行。

其中repository包含如下內容:

[Docker Registry地址/][專案目錄/]<名稱>
所以一個完整的映象命名如下:
[Docker Registry地址/][專案目錄/]<名稱>:[標籤]
示例:
hub.breezey.top/op-base/openresty:1.11.2.4
hub.breezey.top/op-base/openresty-php:1.11.2.4-7.0.27
mysql:5.6
ubuntu

當沒指明映象tag時,預設為latest,但latest沒有任何特殊含義,在docker hub上很多repository將latest作為最新穩定版本的別名,但這只是一種約定,不是強制規定,一個repository可以有多個tag,而多個tag也可能對應同一個映象

映象基本操作

1、獲取映象

docker pull centos:6.6    #直接從docker hub獲取映象
docker pull dl.dockerpool.com:5000/centos:6.6    #從dockerpool獲取映象

2、檢視映象資訊

docker images
docker inspect centos:latest    #獲取映象的詳細資訊

3、為映象建立tag

docker tag centos:latest dl.dockerpool.com:5000/centos:6.6

4、搜尋映象

docker search mysql    #搜尋mysql映象

5、 刪除映象(注:如果映象有容器生成,需要先刪除容器)

#如果一個映象有多個tag,只會刪除指定的tag,映象本身不會刪除,如果docker rmi後指定映象ID,則所有tag都會被刪除

docker rmi centos:6.6

# 刪除無標籤映象(即為none)

docker rmi $(docker images -q --filter "dangling=true")

6、匯出和載入映象

# 將本地映象匯出

docker save -o centos_6.6.tar centos:6.6

# 將本地檔案匯入映象

docker load --input centos_6.6.tar

7、通過docker commit提交一個新映象

docker commit -m "Add a new file" -a "Breeze" a925cb40b3f0 test  #使用a925cb40b3f0容器生成一個名為test的映象

-a:指定作者

-m:相關說明資訊

-p:提交時暫停容器執行

原文地址: https://www.linuxprobe.com/container-image-management.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2699311/,如需轉載,請註明出處,否則將追究法律責任。

相關文章