實踐: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 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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2699311/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker進階與實踐之六:容器卷管理Docker
- Docker容器日誌管理最佳實踐Docker
- Docker進階與實踐之三:Docker映象Docker
- Docker容器的原理與實踐 (下)Docker
- docker容器與映象的區別Docker
- Docker進階與實踐之四:Docker映象倉庫Docker
- docker映象體積優化方法與實踐Docker優化
- Docker容器編排技術解析與實踐Docker
- 製作容器映象的最佳實踐
- Docker映象構建:技術深度解析與實踐指南Docker
- Docker 匯出容器 / 映象Docker
- Docker掃盲之容器與映象的基本使用Docker
- Docker配置本地映象與容器的儲存位置Docker
- 《前端運維》三、Docker--1映象與容器前端運維Docker
- 使用Portainer部署Docker容器實踐AIDocker
- 最火的容器技術|Docker入門與實踐Docker
- 突破難關:Docker映象和容器的區別以及構建的最佳實踐Docker
- Azure Devops實踐(5)- 構建springboot專案打包docker映象及容器化部署devSpring BootDocker
- 1.03 docker的映象和容器Docker
- 容器技術之Docker映象Docker
- 虛擬機器與容器的混合管理實踐虛擬機
- Docker | Docker技術基礎梳理(四) - 深入理解映象與容器Docker
- Kubernetes+Docker+Istio 容器雲實踐Docker
- 靜態WEB容器映象最小化實踐Web
- Nodejs Docker 映象體積優化實踐NodeJSDocker優化
- 製作 Python Docker 映象的最佳實踐PythonDocker
- Docker——映象管理Docker
- Docker 與 Podman 容器管理的比較Docker
- Docker--容器和映象的使用Docker
- docker 批量刪除容器和映象Docker
- 細述docker容器建立MariaDB映象Docker
- 容器映象加速指南:探索 Kubernetes 快取最佳實踐快取
- Docker最佳實踐:5個方法精簡映象Docker
- Docker實踐,Shell指令碼自動根據映象名和埠,啟動docker容器,執行springcloud專案Docker指令碼SpringGCCloud
- 實現容器安全管理的最佳實踐
- 通過容器提交映象(docker commit)以及推送映象(docker push)筆記DockerMIT筆記
- Docker的容器管理Docker
- JFrog助力Google Anthos混合雲Devops實踐,實現安全高質量的容器映象管理Godev