您好,登錄后才能下訂單哦!
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)行代碼之間的延遲。 |
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>
#不管容器是否在運(yùn)行,均可直接導(dǎo)出 docker export> test_for_run.tar #載入,實(shí)現(xiàn)容器遷移 cat test_for_run.tar | docker import - test/ubuntu:v1.0
一個(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 的性能。
啟動(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
默認(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
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ù)
# 創(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
免責(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)容。