您好,登錄后才能下訂單哦!
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 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資源且沒有限制。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
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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。