Docker容器與鏡像管理

容器管理

運行容器

一、運行一個容器示例:php

# 啓動一個httpd容器,使其在後臺運行並將其80端口映射到宿主機80端口
docker run -d -p 80:80 httpd

二、將容器在前臺運行:html

# 啓動一個ubuntu 16.04的容器,打印完"hello world"即退出
docker run ubuntu:16.04 /bin/echo " hello world "

# 在前臺運行容器並進入容器與容器交互
docker run ubuntu:16.04 /bin/bash

須要說明的是,容器是爲任務而生的。一個容器建議只運行一個進程,並且這個進程須要在容器的前臺運行,不能經過daemon的方式運行。若是進程退出,容器也會隨之中止mysql

三、容器的啓動過程說明:web

  • 檢查本地是否存在指定的鏡像,若是沒有就從指定的倉庫下載
  • 利用鏡像啓動一個容器
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個IP給容器
  • 執行用戶指定的程序
  • 執行完畢後中止容器

四、將容器放入後臺運行:redis

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

五、docker run經常使用選項說明sql

-t:配置一個僞終端並綁定到容器的標準輸入上
-i:讓容器的標準輸入保持打開
-d:將容器放入後臺運行
-c:指定分配該容器的cpu分片
-m:指定分配給該容器的內存大小,單位爲B,K,M,G

六、查看當前節點上的容器狀態docker

docker ps    #查看當前正在運行的容器 
選項:
    -a:查看全部容器,包括中止的
    -q:只顯示容器ID
    -l:顯示最後一次建立的容器

七、進入容器ubuntu

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

八、運行容器的最佳實踐centos

容器按用途大體可分爲兩類:api

  • 服務類容器,如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 <containerID> > test_for_run.tar    

#載入,實現容器遷移
cat test_for_run.tar | docker import - test/ubuntu:v1.0

容器生命週期管理

docker_life

容器資源限制

一個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限制

默認狀況下,全部容器能夠平等的使用宿主機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

io 限制

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來運行容器的時候,就須要傳遞一個鏡像名稱,容器基於該鏡像來運行。

一個完整的鏡像名稱由兩部分組成:

<image name> = <repository>:[tag]

其中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也可能對應同一個鏡像

鏡像基本操做

一、獲取鏡像

docker pull centos:6.6    #直接從docker hub獲取鏡像
docker pull dl.dockerpool.com:5000/centos:6.6    #從dockerpool獲取鏡像

二、查看鏡像信息

docker images
docker inspect centos:latest    #獲取鏡像的詳細信息

三、爲鏡像建立tag

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

四、搜索鏡像

docker search mysql    #搜索mysql鏡像

五、 刪除鏡像(注:若是鏡像有容器生成,須要先刪除容器)

#若是一個鏡像有多個tag,只會刪除指定的tag,鏡像自己不會刪除,若是docker rmi後指定鏡像ID,則全部tag都會被刪除
docker rmi centos:6.6   

# 刪除無標籤鏡像(即爲none)
docker rmi $(docker images -q --filter "dangling=true")

六、導出和載入鏡像

# 將本地鏡像導出
docker save -o centos_6.6.tar centos:6.6

# 將本地文件導入鏡像
docker load --input centos_6.6.tar

七、經過docker commit提交一個新鏡像

docker commit -m "Add a new file" -a "Breeze" a925cb40b3f0 test  #使用a925cb40b3f0容器生成一個名爲test的鏡像
-a:指定做者
-m:相關說明信息
-p:提交時暫停容器運行
相關文章
相關標籤/搜索