溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

實(shí)踐:Docker容器與鏡像管理

發(fā)布時(shí)間:2020-08-11 23:35:58 來(lái)源:ITPUB博客 閱讀:330 作者:安全劍客 欄目:云計(jì)算
Docker 是一個(gè)用于開(kāi)發(fā),交付和運(yùn)行應(yīng)用程序的開(kāi)放平臺(tái)。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開(kāi),從而可以快速交付軟件;借助 Docker,您可以與管理應(yīng)用程序相同的方式來(lái)管理基礎(chǔ)架構(gòu);通過(guò)利用 Docker 的方法來(lái)快速交付,測(cè)試和部署代碼,您可以大大減少編寫(xiě)代碼和在生產(chǎn)環(huán)境中運(yùn)行代碼之間的延遲。

實(shí)踐:Docker容器與鏡像管理

容器管理
運(yùn)行容器

1、運(yùn)行一個(gè)容器示例:

# 啟動(dòng)一個(gè)httpd容器,使其在后臺(tái)運(yùn)行并將其80端口映射到宿主機(jī)80端口

docker run -d -p 80:80 httpd

2、將容器在前臺(tái)運(yùn)行:

# 啟動(dòng)一個(gè)ubuntu 16.04的容器,打印完"hello world"即退出

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

# 在前臺(tái)運(yùn)行容器并進(jìn)入容器與容器交互

docker run ubuntu:16.04 /bin/bash

需要說(shuō)明的是,容器是為任務(wù)而生的。一個(gè)容器建議只運(yùn)行一個(gè)進(jìn)程,而且這個(gè)進(jìn)程需要在容器的前臺(tái)運(yùn)行,不能通過(guò)daemon的方式運(yùn)行。如果進(jìn)程退出,容器也會(huì)隨之停止

3、容器的啟動(dòng)過(guò)程說(shuō)明:

檢查本地是否存在指定的鏡像,如果沒(méi)有就從指定的倉(cāng)庫(kù)下載

利用鏡像啟動(dòng)一個(gè)容器

分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫(xiě)層

從宿主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去

從地址池配置一個(gè)IP給容器

執(zhí)行用戶(hù)指定的程序

執(zhí)行完畢后停止容器

4、將容器放入后臺(tái)運(yùn)行:

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

5、docker run常用選項(xiàng)說(shuō)明

-t:配置一個(gè)偽終端并綁定到容器的標(biāo)準(zhǔn)輸入上

-i:讓容器的標(biāo)準(zhǔn)輸入保持打開(kāi)

-d:將容器放入后臺(tái)運(yùn)行

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

-m:指定分配給該容器的內(nèi)存大小,單位為B,K,M,G

6、查看當(dāng)前節(jié)點(diǎn)上的容器狀態(tài)

docker ps    #查看當(dāng)前正在運(yùn)行的容器

選項(xiàng):

-a:查看所有容器,包括停止的

-q:只顯示容器ID

-l:顯示最后一次創(chuàng)建的容器

7、進(jìn)入容器

docker attach <容器name>    # 多個(gè)窗口同時(shí)attach到一個(gè)窗口時(shí),會(huì)同步顯示,該指令已廢棄
docker exec -it <容器id/容器name> /bin/bash

8、運(yùn)行容器的最佳實(shí)踐

容器按用途大致可分為兩類(lèi):

服務(wù)類(lèi)容器,如webserver、database等

工具類(lèi)容器,如curl容器、redis-cli容器等

通常而言,服務(wù)類(lèi)容器需要長(zhǎng)期運(yùn)行,所以使用daemon的方式運(yùn)行;而工作類(lèi)環(huán)境通常是給我們提供一個(gè)臨時(shí)的工作環(huán)境,所以一般以run –ti的方式在前臺(tái)運(yùn)行

容器的啟停操作
# 容器的創(chuàng)建:
	docker create 
# 容器的啟動(dòng):
	docker start <容器id>
# 容器的停止:
	docker stop <容器id>
	docker kill <容器id>
# 容器的重啟:
	docker restart <容器id>
# 容器的刪除:
	docker rm <容器id>
	選項(xiàng):
    	-f:強(qiáng)行終止并刪除一個(gè)運(yùn)行中的容器
        -v:刪除容器掛載的數(shù)據(jù)卷 
# 暫停容器:
	docker pause <容器id>
# 從暫停中恢復(fù):
	docker unpause <容器id>
容器導(dǎo)入導(dǎo)出
#不管容器是否在運(yùn)行,均可直接導(dǎo)出
docker export> test_for_run.tar    
#載入,實(shí)現(xiàn)容器遷移
cat test_for_run.tar | docker import - test/ubuntu:v1.0
容器生命周期管理

實(shí)踐:Docker容器與鏡像管理

容器資源限制

一個(gè)docker host上會(huì)運(yùn)行若干容器,每個(gè)容器都需要CPU、內(nèi)存和 IO 資源。對(duì)于 KVM,VMware等虛擬化技術(shù),用戶(hù)可以控制分配多少 CPU、內(nèi)存資源給每個(gè)虛擬機(jī)。對(duì)于容器,Docker 也提供了類(lèi)似的機(jī)制避免某個(gè)容器因占用太多資源而影響其他容器乃至整個(gè) host 的性能。

內(nèi)存限制

啟動(dòng)一個(gè)ubuntu容器,限制內(nèi)存為200M, 內(nèi)存與swap的總和為300M:

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

選項(xiàng)說(shuō)明:

-m:允許分配的內(nèi)存大小

--memory-swap:允許分配的內(nèi)存和swap的總大小

--memory-swapiness:控制內(nèi)存與swap置換的比例

需要說(shuō)明的是,如果啟用了--memory-swap參數(shù),相當(dāng)于使用了swap,則實(shí)際內(nèi)存限制并不生效,要想限制生效,可以不啟動(dòng)該參數(shù),且將--memory-swappiness置為0

下面是一個(gè)壓測(cè)示例:

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

選項(xiàng):

--vm:設(shè)置內(nèi)存工作線程數(shù)

--vm-byptes:設(shè)置單個(gè)內(nèi)存工作線程使用的內(nèi)存大小

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

關(guān)于內(nèi)存資源的更多限制可以參考這里:https://blog.opskumu.com/docker-memory-limit.html

CPU限制

默認(rèn)情況下,所有容器可以平等的使用宿主機(jī)cpu資源且沒(méi)有限制。docker可以通過(guò)-c或--cpu-shares設(shè)置容器使用的cpu的權(quán)限。如果不指定,默認(rèn)為1024。

與內(nèi)存限額不同,通過(guò) -c 設(shè)置的 cpu share 并不是 CPU 資源的絕對(duì)數(shù)量,而是一個(gè)相對(duì)的權(quán)重值。某個(gè)容器最終能分配到的 CPU 資源取決于它的 cpu share 占所有容器 cpu share 總和的比例。

換句話(huà)說(shuō):通過(guò)cpu share可以設(shè)置容器使用CPU的優(yōu)先級(jí)。

例如,在host中啟動(dòng)了兩個(gè)容器:

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

container_A的cpu share 1024,是 container_B 的兩倍。當(dāng)兩個(gè)容器都需要 CPU 資源時(shí),container_A可以得到的 CPU 是container_B的兩倍。

需要特別注意的是,這種按權(quán)重分配CPU只會(huì)發(fā)生在CPU 資源緊張的情況下。如果container_A 處于空閑狀態(tài),這時(shí),為了充分利用CPU資源,container_B 也可以分配到全部可用的 CPU。

下面是一個(gè)壓測(cè)示例:

# --cpu用于設(shè)置cpu工作線程的數(shù)量,有幾個(gè)核就設(shè)置為幾

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

兩個(gè)容器運(yùn)行起來(lái)之后,可以通過(guò)在宿主機(jī)上使用top查看cpu的資源消耗可以看到兩個(gè)容器的cpu消耗。

關(guān)于cpu資源的更多限制可以參考這里:https://blog.opskumu.com/docker-cpu-limit.html

io 限制

Block IO 是另一種可以限制容器使用的資源。Block IO 指的是磁盤(pán)的讀寫(xiě),docker 可通過(guò)設(shè)置權(quán)重、限制 bps 和 iops 的方式控制容器讀寫(xiě)磁盤(pán)的帶寬,下面分別討論。

需要說(shuō)明的是,目前Block IO限額只對(duì)direct IO(不使用文件緩存)有效

下面是限制bps和iops的參數(shù)說(shuō)明:

--device-read-bps,限制讀某個(gè)設(shè)備的 bps。

--device-write-bps,限制寫(xiě)某個(gè)設(shè)備的 bps。

--device-read-iops,限制讀某個(gè)設(shè)備的 iops。

--device-write-iops,限制寫(xiě)某個(gè)設(shè)備的 iops。

bps是byte per second,每秒讀寫(xiě)的數(shù)據(jù)量

iops是io per second,每秒io的次數(shù)

簡(jiǎn)單示例

# 創(chuàng)建一個(gè)容器,限制寫(xiě)的bps為30M

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

# 容器中,執(zhí)行如下操作查看效果,然后可以通過(guò)取消限制,來(lái)查看對(duì)比效果:

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

關(guān)于io資源的更多限制可以參考這里:https://blog.opskumu.com/docker-io-limit.html

鏡像管理

鏡像命名規(guī)范

無(wú)論我們對(duì)鏡像做何種操作,首先它得有個(gè)名字。我們?cè)谇懊媸褂胐ocker run來(lái)運(yùn)行容器的時(shí)候,就需要傳遞一個(gè)鏡像名稱(chēng),容器基于該鏡像來(lái)運(yùn)行。

其中repository包含如下內(nèi)容:

[Docker Registry地址/][項(xiàng)目目錄/]<名稱(chēng)>
所以一個(gè)完整的鏡像命名如下:
[Docker Registry地址/][項(xiàng)目目錄/]<名稱(chēng)>:[標(biāo)簽]
示例:
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

當(dāng)沒(méi)指明鏡像tag時(shí),默認(rèn)為latest,但latest沒(méi)有任何特殊含義,在docker hub上很多repository將latest作為最新穩(wěn)定版本的別名,但這只是一種約定,不是強(qiáng)制規(guī)定,一個(gè)repository可以有多個(gè)tag,而多個(gè)tag也可能對(duì)應(yīng)同一個(gè)鏡像

鏡像基本操作

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    #獲取鏡像的詳細(xì)信息

3、為鏡像創(chuàng)建tag

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

4、搜索鏡像

docker search mysql    #搜索mysql鏡像

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

#如果一個(gè)鏡像有多個(gè)tag,只會(huì)刪除指定的tag,鏡像本身不會(huì)刪除,如果docker rmi后指定鏡像ID,則所有tag都會(huì)被刪除

docker rmi centos:6.6

# 刪除無(wú)標(biāo)簽鏡像(即為none)

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

6、導(dǎo)出和載入鏡像

# 將本地鏡像導(dǎo)出

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

# 將本地文件導(dǎo)入鏡像

docker load --input centos_6.6.tar

7、通過(guò)docker commit提交一個(gè)新鏡像

docker commit -m "Add a new file" -a "Breeze" a925cb40b3f0 test  #使用a925cb40b3f0容器生成一個(gè)名為test的鏡像

-a:指定作者

-m:相關(guān)說(shuō)明信息

-p:提交時(shí)暫停容器運(yùn)行

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI