一、Docker引擎
Docker 引擎由許多專用的工具協(xié)同工作,從而可以創(chuàng)建和運行容器,主要的組件構(gòu)成如下:Docker 客戶端(Docker Client)、Docker 守護進程(Docker daemon)、containerd 以及 runc。總體邏輯如下圖所示。

1、runc
runc 是 OCI 容器運行時規(guī)范的參考實現(xiàn),主要用于創(chuàng)建容器
2、Docker daemon
在對 Docker daemon 的功能進行拆解后,所有的容器執(zhí)行邏輯被重構(gòu)到一個新的名為 containerd(發(fā)音為 container-dee)的工具中。它的主要任務(wù)是容器的生命周期管理——start | stop | pause | rm....
3、shim
shim 是實現(xiàn)無 daemon 的容器(用于將運行中的容器與 daemon 解耦,以便進行 daemon 升級等操作)不可或缺的工具。一旦容器創(chuàng)建完畢,對應(yīng)的 runc 進程就會退出,一旦容器進程的父進程 runc 退出,相關(guān)聯(lián)的 containerd-shim 進程就會成為容器的父進程。
二、鏡像
鏡像可以理解為一種構(gòu)建時(build-time)結(jié)構(gòu),而容器可以理解為一種運行時(run-time)結(jié)構(gòu),如下圖所示。

Docker 主機安裝之后,本地并沒有鏡像。
1、拉取鏡像
docker image pull 是下載鏡像的命令,默認情況下,鏡像會從 Docker Hub 的倉庫中拉取。docker image pull alpine:latest 命令會從 Docker Hub 的 alpine 倉庫中拉取標(biāo)簽為 latest 的鏡像。
Linux Docker 主機本地鏡像倉庫通常位于 /var/lib/docker/<storage-driver>,Windows Docker 主機則是 C:\ProgramData\docker\windowsfilter。
可以使用以下命令檢查 Docker 主機的本地倉庫中是否包含鏡像。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE
Docker 鏡像存儲在鏡像倉庫服務(wù)(Image Registry)當(dāng)中。鏡像倉庫服務(wù)包含多個鏡像倉庫(Image Repository)。同樣,一個鏡像倉庫中可以包含多個鏡像。
Docker Hub 也分為官方倉庫(Official Repository)和非官方倉庫(Unofficial Repository)。
2、官方倉庫拉取鏡像
從官方倉庫拉取鏡像時,docker image pull 命令的格式如下。
# docker image pull <repository>:<tag> # 在之前的 Linux 示例中,通過下面的兩條命令完成 Alpine 和 Ubuntu 鏡像的拉取。 docker image pull alpine:latest docker image pull ubuntu:latest docker image pull mongo:3.3.11 //該命令會從官方Mongo庫拉取標(biāo)簽為3.3.11的鏡像
注意:如果沒有在倉庫名稱后指定具體的鏡像標(biāo)簽,則 Docker 會假設(shè)用戶希望拉取標(biāo)簽為 latest 的鏡像。
3、非官方倉庫拉取鏡像
下面通過示例來展示如何從 tu-demo 倉庫中拉取 v2 這個鏡像,其中鏡像的擁有者是 Docker Hub 賬戶 nigelpoulton
docker image pull nigelpoulton/tu-demo:v2 //該命令會從以我自己的 Docker Hub 賬號為命名空間的 tu-demo 庫中下載標(biāo)簽為 v2 的鏡像
拉取鏡像 docker image pull
查看已經(jīng)拉取的鏡像 docker image ls
構(gòu)建一個新的鏡像 docker image build
移除全部的懸虛鏡像 docker image prune
鏡像搜索 docker search 鏡像倉庫
鏡像刪除 docker image remove
三、容器
容器是鏡像的運行時實例。

1、啟動容器
基礎(chǔ)的格式 docker container run <image> <app>中,指定了啟動所需的鏡像以及要運行的應(yīng)用
ocker container run -it ubuntu /bin/bash 則會啟動某個 Ubuntu Linux 容器,并運行 Bash Shell 作為其應(yīng)用。
2、停止容器
docker container stop
3、再次啟動該容器
docker container start
4、刪除容器
docker container rm
當(dāng)退出容器而沒有終止容器運行時,可以通過docker container exec 命令將終端重新連接到 Docker
docker container exec -it container bash