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

Docker 是一個(gè)用于開發(fā),交付和運(yùn)行應(yīng)用程序的開放平臺。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,從而可以快速交付軟件;借助 Docker,您可以與管理應(yīng)用程序相同的方式來管理基礎(chǔ)架構(gòu);通過利用 Docker 的方法來快速交付,測試和部署代碼,您可以大大減少編寫代碼和在生產(chǎn)環(huán)境中運(yùn)行代碼之間的延遲。

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

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)商城,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

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

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

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

docker run -d -p 80:80 httpd

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

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

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

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

docker run ubuntu:16.04 /bin/bash

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

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

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

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

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

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

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

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

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

4、將容器放入后臺運(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)說明

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

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

-d:將容器放入后臺運(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í),會同步顯示,該指令已廢棄
docker exec -it <容器id/容器name> /bin/bash

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

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

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

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

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

容器的啟停操作
# 容器的創(chuàng)建:
	docker create 
# 容器的啟動:
	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上會運(yùn)行若干容器,每個(gè)容器都需要CPU、內(nèi)存和 IO 資源。對于 KVM,VMware等虛擬化技術(shù),用戶可以控制分配多少 CPU、內(nèi)存資源給每個(gè)虛擬機(jī)。對于容器,Docker 也提供了類似的機(jī)制避免某個(gè)容器因占用太多資源而影響其他容器乃至整個(gè) host 的性能。

內(nèi)存限制

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

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

選項(xiàng)說明:

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

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

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

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

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

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資源且沒有限制。docker可以通過-c或--cpu-shares設(shè)置容器使用的cpu的權(quán)限。如果不指定,默認(rèn)為1024。

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

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

例如,在host中啟動了兩個(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只會發(fā)生在CPU 資源緊張的情況下。如果container_A 處于空閑狀態(tài),這時(shí),為了充分利用CPU資源,container_B 也可以分配到全部可用的 CPU。

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

# --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)行起來之后,可以通過在宿主機(jī)上使用top查看cpu的資源消耗可以看到兩個(gè)容器的cpu消耗。

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

io 限制

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

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

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

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

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

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

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

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

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

簡單示例

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

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

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

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ī)范

無論我們對鏡像做何種操作,首先它得有個(gè)名字。我們在前面使用docker run來運(yùn)行容器的時(shí)候,就需要傳遞一個(gè)鏡像名稱,容器基于該鏡像來運(yùn)行。

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

[Docker Registry地址/][項(xiàng)目目錄/]<名稱>
所以一個(gè)完整的鏡像命名如下:
[Docker Registry地址/][項(xià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)沒指明鏡像tag時(shí),默認(rèn)為latest,但latest沒有任何特殊含義,在docker hub上很多repository將latest作為最新穩(wěn)定版本的別名,但這只是一種約定,不是強(qiáng)制規(guī)定,一個(gè)repository可以有多個(gè)tag,而多個(gè)tag也可能對應(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,只會刪除指定的tag,鏡像本身不會刪除,如果docker rmi后指定鏡像ID,則所有tag都會被刪除

docker rmi centos:6.6

# 刪除無標(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、通過docker commit提交一個(gè)新鏡像

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

-a:指定作者

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

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

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

網(wǎng)站名稱:實(shí)踐:Docker容器與鏡像管理
本文來源:http://bm7419.com/article32/igdosc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)軟件開發(fā)、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司