首頁 > 軟體

Docker映象及容器

2020-06-16 16:47:45

一、Docker核心概念

1、映象(image)

Docker的映象是建立容器的基礎,類似虛擬機器的快照,可以理解為是一個面向Docker容器引擎的唯讀模板,比如一個映象可以是一個完整的CentOS作業系統,也可以是一個安裝了MySQL的應用程式,稱之為一個映象。
映象檔案使用者可以自己建立和更新現有映象,也可以從網上下載已經做好的應用映象直接使用。

2、容器(Container)

容器是映象的另一個執行範例,是獨立執行的一個或一組應用以及他們所必須的執行環境,包括檔案系統、系統庫類、shell環境等。映象是唯讀模板,而容器會給這個唯讀模板一個額外的可寫層。

3、倉庫(Repository)

倉庫是用來集中存放映象的地方,當自己建立了映象後,可以使用push命令將它上傳到公共倉庫(Public)或者私有倉庫(Private),這樣,當其他機器想要使用時,直接下載下來即可使用。

二、Docker映象操作

1、搜尋映象

  • 通過docker search 命令搜尋遠端官方倉庫的共用映象。
  • 搜尋鍵碼為httpd的映象

docker search httpd

2、獲取映象

  • 對於docker來說,如果下載映象時不指定標籤,則預設會下載倉庫中最新版,因此也可通過制定標籤來下載指定版本,這裡的標籤(tag)就是用來區分映象版本的。

  • 下載映象httpd

docker pull httpd

整個下載過程可以看出,映象檔案由若干層(Layer)組成,我們稱之為AUFS(檔案聯合系統),是實現增量儲存與更新的基礎,下載過程中會輸出映象的各層資訊

3、檢視映象資訊

docker images

REPOSITORY ---映象屬於的倉庫
TAG ---映象的標籤資訊,標記同一個倉庫中不同映象
IMAGE ID ---映象的唯一ID號,唯一標識了該映象
CREATED ---映象建立時間
SIZE ---映象大小

  • 還可以根據映象的唯一標識ID號,獲取映象詳細資訊。

docker inspect 11426a19f1a2

  • 使用docker tag命令來為原生的映象新增新的標籤。

命令格式:docker tag 映象名稱:[標籤] 新名稱:[新標籤]

  • 例如:本地映象httpd新增新的名稱為apache,新的標籤為apache1

docker tag httpd apache:apache1

4、刪除映象

  • 方法一:docker rmi 倉庫名稱:標籤
  • 方法二:docker rmi 映象ID號

  • 註:當一個映象有多個標籤的時候,docker rmi 命令只是刪除該映象多個標籤中的指定標籤,不會影響映象檔案。但當該映象只剩下一個標籤的時候,此時刪除該標籤的時候會徹底刪除該映象。
  • 當使用方法二刪除時,必須確保該映象沒有被容器使用才能進行,刪除時系統會先刪除掉指向該映象的所有標籤,然後刪除映象本身。如果該映象已經被容器使用,正確的做法是先刪除依賴該映象的所有容器,在刪除映象

5、存出映象和匯入映象

存出映象

  • 當需要把一台機器上的映象遷移到另一台機器上的時候,需要將映象儲存成本地檔案,這一過程叫做存出映象。
  • 別的機器通過拷貝的映象,將該映象匯入到自己的映象庫中,這一過程叫做載入映象。

<br/>命令格式:docker save -o 儲存檔名 儲存的映象<br/>

  • 將原生的httpd映象存出apache2

docker save -o apache2 httpd

載入映象

命令格式:docker load < 存出的映象檔案
或者:
docker --input 存出的映象檔案

6、上傳映象

  • 本地儲存的映象檔案越來越多,就要一個專門的地方存放這些映象---倉庫。目前比較方便的就是公共倉庫,預設上傳的是Docker hub官方倉庫,需要註冊賬號完成登入後才能上傳。

  • 在上傳映象之前還需要對本地映象新增新的標籤,然後再使用docker push命令上傳。

docker tag httpd apache:test
docker login

Username: madeb  //此賬號需自己註冊
Password:
Login Succeeded

  • 成功登入後就可上傳映象了。

docker push apache:test

  • 註:若是需要退出登入

docker logout

三、Docker容器操作

1、容器的建立與啟動

  • 新建立的容器處於停止狀態,不執行任何程式。
  • 需要在其中發起一個進程來啟動容器,該進程是容器的唯一進程。
  • 該進程結束時,容器也會完全停止。

<br/>命令格式:docker create [選項] 映象 執行的程式<br/>

-i 讓容器的輸入保持開啟
-t 讓Docker分配一個偽終端

docker create -it httpd /bin/bash
docker ps -a
docker start e1e05c66ec9c //開啟容器
docker ps -a

  • 建立容器並執行一條命令。
  • 這種方式和在本地執行命令幾乎沒有區別

docker run httpd /usr/bin/bash -c ls /

  • 容器在執行完ls / 後會立馬停止,這個時候就需要讓docker以守護態在後台執行
  • 例如,下面的程式就會在後台持續執行。

docker run -d httpd /usr/bin/bash -c ls / "while true; do echo hello;done"

2、容器的終止

  • 想要停止容器的執行前需要檢視容器的執行狀態,以及ID號

docker ps -a

CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS              NAMES
e1e05c66ec9c        httpd              "/bin/bash"        26 minutes ago      Up 25 minutes      80/tcp              friendly_eucliddocker stop e1e05c66ec9c

  • 當檢視到STATUS狀態為Exited時,即狀態終止。

3、容器的進入

  • 當不進入容器時,讓容器執行任務,一條任務執行完成後容器會自動停止,為了避免繁瑣的情況,我們需要進入容器執行,且退出容器後,容器並不會停止。

命令格式:docker exec -it e1e05c66ec9c /bin/bash
-i 表示讓容器的輸入保持開啟
-t 表示讓docker分配一個偽終端

  • 例如

docker exec -it e1e05c66ec9c /bin/bash

4、容器的匯出與匯入

容器匯出

  • 無論這個容器是執行還是停止均可匯出。

<br/>命令格式:docker export 容器ID/名稱 &gt; 檔名<br/>

  • 將容器匯出為apache1

docker export e1e05c66ec9c > apache1

容器匯入

  • 匯出的檔案從A機器拷貝到B機器,之後使用docker import命令匯入,成為映象。

<br/>命令格式:cat 檔名 | docker import - 生成的映象名稱:標籤<br/>

  • 例如匯入apache1 成為本地映象

cat apache1 | docker import - apache1 註:此處必須先使用cat,不然無法匯入
docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
apache1            latest              2bfb89eb2c5d        49 seconds ago      174MB
apache              apache1            11426a19f1a2        8 days ago          178MB
httpd              latest              11426a19f1a2        8 days ago          178M

5、容器的刪除

  • 可以使用docker rm 命令將一個已經處於終止狀態的容器刪除。

<br/>命令格式:docker rm 容器ID/名稱<br/>

docker rm e1e05c66ec9c
docker ps -a | grep e1e05c66ec9c

  • 如果要刪除一個正在執行的容器,可以新增-f選項強制刪除,但建議先將容器停止在做刪除操作。

docker預設的儲存目錄在本地/var/lib/docker/,docker的映象、容器、紀錄檔等內容全部都儲存在這裡,也可單獨使用大容量分割區來儲存這些內容,並且一般選擇LVM邏輯卷,從而避免出現docker執行過程中儲存目錄容量不足的問題。

四、Docker資源控制

1、限制cpu使用速率

  • 在docker中可以通過--cpu-quota選項來限制cpu使用率,cpu的百分比是以1000為單位的。

docker run --cpu-quota 20000 e1e05c66ec9c //cpu的使用率限定為20%

  • 還可以通過Cgroup組態檔立即生效

echo 20000 > /sys/fs/cgroup/cpu/docker/e1e05c66ec9ced2d6290ebe8e3fdea27f439dcbeea70921ec5d9e5b0bcffaf11/cpu.cfs_quota_us

2、多工按比例分析CPU

  • 當有多個容器任務執行時,很難計算cpu的使用率,為了使容器合理使用cpu資源,可以通過--cpu-share選項設定cpu按比例共用資源,這種方??還可以實現cpu使用率的動態調整。

docker run --cpu-shares 1024 容器A
docker run --cpu-shares 1024 容器B
docker run --cpu-shares 2048 容器C

3、限制cpu核心使用

  • 如果伺服器有16個核心,那麼cpu編號為0~15,使容器系結第1~4個核心使用。

docker run --cpuset-cpus 0,1,2,3 容器名

2、對記憶體使用的限制

  • 在docker中可以通過docker run -m 命令來限制記憶體使用量,相應的組態檔為/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes。需要注意的是,一旦容器cgroup使用的記憶體超過了限制的容量,Linux核心將會嘗試收回這些記憶體,如果仍舊沒法控制記憶體控制在限制範圍之內,進程就會被殺死。

docker run -m 512m 容器名 //限制容器的記憶體為512m

3、對blkio的限制

  • 如果是在一台伺服器上進行容器的混合部署,那麼會出現同時有幾個程式寫磁碟資料的情況,這時可以--device-write-iops選項來限制寫入的iops,相應的還有--device-read-bps選項可以限制讀取的iops,但是這種方法只能針對blkio限制的是裝置(device),而不是分割區,相應的組態檔/sys/fs/cgroup/blkio/docker/容器ID/blkioo.throttle.write_iops_device

docker run --device-write-bps /dev/sda1:1mb 容器名 //限制容器的/dev/sda1的寫入ipos為1MB

更多Docker相關教學見以下內容: 

Linux 下的 Docker 安裝與使用  https://www.linuxidc.com/Linux/2018-06/152996.htm
CentOS 7安裝Docker應用容器引擎 https://www.linuxidc.com/Linux/2018-06/152856.htm
CentOS 7.3環境安裝Docker 18.03 https://www.linuxidc.com/Linux/2018-05/152356.htm
使用Docker分分鐘啟動常用應用  https://www.linuxidc.com/Linux/2017-04/142649.htm
CentOS 7使用Docker搭建GitLab伺服器  https://www.linuxidc.com/Linux/2018-04/151725.htm
30分鐘帶你了解Docker  https://www.linuxidc.com/Linux/2018-08/153346.htm

Docker容器常見操作詳解  https://www.linuxidc.com/Linux/2018-08/153685.htm

Docker發布應用程式指南 https://www.linuxidc.com/Linux/2018-08/153405.htm


IT145.com E-mail:sddin#qq.com