1. 程式人生 > >三、Docker引擎、映象、容器

三、Docker引擎、映象、容器

1、Docker引擎

Docker engine 是執行和管理容器的核心軟體,我們常簡單稱為Docker或Docker平臺,其與VMware的ESXi有點像。

Docker engine採用模組化的設計,且有許多可插拔元件。其基於Open Container Initiative(OCI)制定的開放標準。

組成Docker engine的三個主要部件:daemon、containerd、runc,如下圖所示:

runc:小巧且輕量級的針對libcontainer的CLI包裝器,在生命週期中的一個單一目的是create containers。實際上是一個獨立的容器執行時工具。

containerd :主要包括容器的執行邏輯,唯一目的是管理容器的生命週期操作: start | stop | pause | rm....
例子:啟動一個新容器

命令:docker container run

$ docker container run --name ctr1 -it alpine:latest sh (基於alpine:latest映象啟動一個新容器)

當在Docker client輸入上述命令時,將其轉換成 合適的API payload,然後把他們POSTs到正確的API端點。

注:daemon不包含任何建立容器的程式碼,其與containerd通過CRUD-style API進行通訊。

2、Docker映象

Docker images類似於VM templates。A VM template 像一個 stopped VM — a Docker image像一個 stopped container. 如果您是開發者,你可以認為它與classes一樣。

你可以從一個映象倉庫拉取映象。最流行的映象倉庫是https://hub.docker.com。

映象由多層組成,層疊在一起,並表示為單個物件。映象內部是一個精簡版的OS以及執行應用程式所需要的全部檔案和依賴。因為容器旨在快速和輕便,映象往往很小。二者關係如下圖所示:

命令docker container run 和 docker service create可以從一個單一映象啟動一個或多個容器。一旦從一個映象啟動了一個容器,二者就就相互依賴。直到最後一個使用此映象的容器停止和銷燬後,才能刪除此映象。否則會提示無法刪除錯誤。

容器的目的是執行一個應用程式或者服務,這意味建立容器的映象必須包含執行服務或者應用程式的所有OS和應用程式檔案。所有執行在Docker主機上的容器共享主機核心。為此,映象僅包含足夠的作業系統(通常是OS相關的檔案和檔案系統物件)。

由於Windows OS工作的方式,基於Windows的映象比基於Linux的映象要大很多。

在基於Linux的Docker主機上,本地映象倉庫位於/var/lib/docker/<storage-driver>,在基於Windows的Docker主機上,位於C:\ProgramData\docker\windowsfilter。可通過如下命令在檢視本地倉庫中的映象:

docker image ls

使用docker image pull命令可從遠端映象倉庫拉取映象到本地映象倉庫。
映象註冊(Image registries)

Docker映象儲存在image registries。最常用的registry是Docker Hub(https://hub.docker.com)。Image registries包含多個映象倉庫,反之,映象倉庫可以包含多個映象。如下圖所示。

Docker Hub有官方倉庫和非官方倉庫的概念。

大多數流行的作業系統和應用程式在Docker Hub上都有自己的官方倉庫,他們通常位於Docker Hub名稱空間的最頂層。如下所示:

  • nginx: https://hub.docker.com/_/nginx/
  • busybox: https://hub.docker.com/_/busybo
  • redis: https://hub.docker.com/_/redis/
  • mongo: https://hub.docker.com/_/mongo/

映象命名和標籤(Image naming and tagging)

通過給定由“:”分割的倉庫名稱和標籤,可以很簡單的從官方倉庫尋找映象。命令如下:

docker image pull <repository>:<tag>

例如:docker image pull alpine:latest 和docker image pull ubuntu:latest
上述兩個命令拉取 images 標籤為 “latest” 從the “alpine” 和 “ubuntu” repositories.

注意:標記為“latest”標籤的映象並不一定是倉庫中的最新映象。

如下命令可以拉取此倉庫中指定名稱的所有映象(通過在docker image pull 命令列增加 -a):

docker image pull -a nigelpoulton/tu-demo

(注:如果拉取倉庫中包含的映象為多架構和多平臺,上述命令可能會失敗)

過濾docker image ls的輸出

通過新增標籤 --filter,如docker image ls --filter dangling=true

A dangling image is an image that is no longer tagged, and appears in listings as <none>:<none>.

產生的原因是因為在構建新的映象時,使用了已經存在的標籤來打標籤。比如, 基於alpine:3.4構建 映象並打標籤為.然後更新Dockerfile用alpine:3.5替換alpine:3.4 ,運行同樣的構建命令。這將會建立新的映象且標籤為dodge:challenger,從舊映象移除標籤。舊映象就變為dangling。可使用命令 docker image prune來刪除所有的dangling映象。如果增加-a標誌,則會刪除所有未使用的映象(未被任何容器使用的映象)

Docker僅僅是一組鬆散耦合的只讀的層,如下圖所示:

可以通過docker image inspect image-name來檢視一個image所包含的layers。多個映象可以共享相同的layer,可以節省空間和提高效能。

通過摘要拉取映象

前面講了使用tag來拉取映象,這存在一個問題-tag是可變的。可能存在偶然用錯誤的標籤 標註了映象,也有可能對不同的image使用了相同的tag,這都可能引起問題。

Docker1.10引進了一個新的內容定址儲存模型。作為這個模型的一部分,所有的映象獲取一個加密的內容雜湊。也稱之為摘要,因為摘要是映象內容的雜湊,改變映象內容而不改變摘要是不可能的,意味著摘要是不可變的,這可以解決上述問題。

在每次拉取映象時,docker image pull命令包含了映象摘要,作為返回碼的一部分。也可以通過docker image ls --digests image-name來檢視映象的摘要

多架構映象

Docker支援多架構映象。這意味著一個單一的映象可以支援多平臺和多架構 (比如Linux on x64,Linux on PowerPC, Windows x64, ARM 等)。為達到目的,Registry API支援兩個重要的構造:

  • manifest lists (new)
  • manifests

如下圖所示:

刪除映象

docker image rm imageID