Docker 學習筆記(第二集:image)

chenggx發表於2020-08-31

簡介

Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。

上面是比較官方的解釋,估計大部分也沒看太懂,那麼我就用我自己理解的方式說一下吧。

image 類似於我們安裝系統的映象檔案,透過 image 檔案我們可以生成容器檔案。一般映象檔案是分層儲存的,使用了Union Fs 的技術(具體是個啥我也不太懂?‍♂️),也就說一個映象檔案是很多塊組成的,有點類似於現在前端的元件化開發,是一組檔案組成的。映象可以向物件導向的類一樣可以進行繼承,透過一些基礎映象來構建屬於我們自己的映象。

上面說了一大堆好像還不是很明白的樣子,下面還是用例子來說明吧。go go go~

獲取映象

透過 docker pull 命令從 Docker Hub 倉庫獲取映象。


docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]

具體的選項可以透過 docker pull –help 檢視

  1. 地址的格式一般是 <域名/IP>[:埠號] 預設地址是 Docker Hub, 可以省略

  2. 倉庫名:這裡的倉庫名是兩段式名稱,即 <使用者名稱>/<軟體名>。對於 Docker Hub,如果不給出使用者名稱,則預設為 library,也就是官方映象。

  3. 標籤: 一般為版本號

這裡穿插一個映象急速的內容

由於國內網路的問題我們需要對拉取映象的地址映象更改,使用國內的映象地址來加快拉取速度。

linux 系統(已測試)

在 /etc/docker/daemon.json 中寫入如下內容(如果檔案不存在請新建該檔案)


{

"registry-mirrors": [

"https://hub-mirror.c.163.com",

"https://mirror.baidubce.com"

]

}

重啟服務


$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

Windows 10(未測試)

在工作列托盤 Docker 圖示內右鍵選單選擇 Settings,開啟配置視窗後在左側導航選單選擇 Docker Engine,在右側像下邊一樣編輯 json 檔案,之後點選 Apply & Restart 儲存後 Docker 就會重啟並應用配置的映象地址了。


{

"registry-mirrors": [

"https://hub-mirror.c.163.com",

"https://mirror.baidubce.com"

]

}

macOS。(已測試)

在工作列點選 Docker Desktop 應用圖示 -> Perferences,在左側導航選單選擇 Docker Engine,在右側像下邊一樣編輯 json 檔案。修改完成之後,點選 Apply & Restart 按鈕,Docker 就會重啟並應用配置的映象地址了。


{

"registry-mirrors": [

"https://hub-mirror.c.163.com",

"https://mirror.baidubce.com"

]

}

執行 $ docker info如果從結果中看到如下內容,說明配置成功。


...

Registry Mirrors:

https://hub-mirror.c.163.com/

...

繼續映象的拉取

使用 docker pull 拉取Ubuntu 映象


$ docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu

7595c8c21622: Pull complete

d13af8ca898f: Pull complete

70799171ddba: Pull complete

b6c12202c5ef: Pull complete

Digest: sha256:a61728f6128fb4a7a20efaa7597607ed6e69973ee9b9123e3b4fd28b7bba100b

Status: Downloaded newer image for ubuntu:18.04

docker.io/library/ubuntu:18.04

上面的命令中沒有給出 Docker 映象倉庫地址,因此將會從 Docker Hub 獲取映象。而映象名稱是 ubuntu:18.04,因此將會獲取官方映象 library/ubuntu 倉庫中標籤為 18.04 的映象。

從下載過程中可以看到我們之前提及的分層儲存的概念,映象是由多層儲存所構成。下載也是一層層的去下載,並非單一檔案。

以映象為基礎啟動容器


$ docker run -i -t --rm ubuntu:18.04 bash

root@94053f3fa153:/# cat /etc/os-release

NAME="Ubuntu"

VERSION="18.04.4 LTS (Bionic Beaver)"

ID=ubuntu

ID_LIKE=debian

PRETTY_NAME="Ubuntu 18.04.4 LTS"

VERSION_ID="18.04"

HOME_URL="https://www.ubuntu.com/"

SUPPORT_URL="https://help.ubuntu.com/"

BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"

PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"

VERSION_CODENAME=bionic

UBUNTU_CODENAME=bionic

root@94053f3fa153:/#

docker run 就是執行容器的命令,具體格式在後面容器相關章節進行詳細介紹。這裡簡單解釋一下

  • -i 互動式操作,讓容器的標準輸入保持開啟。

  • -t 選項讓 Docker 分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上。

  • –rm 容器退出後隨之將其刪除。(預設情況下,為了排障需求,退出的容器並不會立即刪除,除非手動 docker rm。我們這裡只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 –rm 可以避免浪費空間。)

  • ubuntu:18.04 使用 ubuntu:18.04 映象為基礎來啟動容器。

  • bash 放在映象名後的是 命令,這裡我們希望有個互動式 Shell,因此用的是 bash。

進入容器後,我們可以在 Shell 下操作,執行任何所需的命令。這裡,我們執行了 cat /etc/os-release,這是 Linux 常用的檢視當前系統版本的命令,從返回的結果可以看到容器內是 Ubuntu 18.04.1 LTS 系統。

最後我們透過 exit 退出了這個容器。

列出映象

使用 docker image ls 列出已經下載了的映象檔案


$ docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE

redis latest 5f515359c7f8 5 days ago 183 MB

nginx latest 05a60462f8ba 5 days ago 181 MB

mongo 3.2 fe9198c04d62 5 days ago 342 MB

<none> <none> 00285df0df87 5 days ago 342 MB

ubuntu 18.04 f753707788c5 4 weeks ago 127 MB

ubuntu latest f753707788c5 4 weeks ago 127 MB

列表包含了 倉庫名、標籤、映象 ID、建立時間 以及 所佔用的空間。

  • 映象 ID 則是映象的唯一標識,因為一個映象可以對應多個標籤。因此,在上面的例子中,我們可以看到 ubuntu:18.04 和 ubuntu:latest 擁有相同的 ID,因為它們對應的是同一個映象。

  • 映象的體積跟 Docker Hub 上的不一致是因為 Docker Hub 中顯示的體積是壓縮後的體積。而 docker image ls 顯示的是映象下載到本地後,展開的大小,準確說,是展開後的各層所佔空間的總和。

  • 另外一個需要注意的問題是,docker image ls 列表中的映象體積總和並非是所有映象實際硬碟消耗。由於 Docker 映象是多層儲存結構,並且可以繼承、複用,因此不同映象可能會因為使用相同的基礎映象,從而擁有共同的層。由於 Docker 使用 Union FS,相同的層只需要儲存一份即可,因此實際映象硬碟佔用空間很可能要比這個列表映象大小的總和要小的多。

使用以下命令檢視映象、容器、資料卷所佔用的空間。


$ docker system df

TYPE TOTAL ACTIVE SIZE RECLAIMABLE

Images 24 0 1.992GB 1.992GB (100%)

Containers 1 0 62.82MB 62.82MB (100%)

Local Volumes 9 0 652.2MB 652.2MB (100%)

Build Cache 0B 0B

虛懸映象


<none> <none> 00285df0df87 5 days ago 342 MB

既沒有倉庫名,也沒有標籤,顯示為 none 的就是虛懸映象

個映象原本是有映象名和標籤的,原來為 mongo:3.2,隨著官方映象維護,釋出了新版本後,重新 docker pull mongo:3.2 時,mongo:3.2 這個映象名被轉移到了新下載的映象身上,而舊的映象上的這個名稱則被取消,從而成為了 。除了 docker pull 可能導致這種情況,docker build 也同樣可以導致這種現象。由於新舊映象同名,舊映象名稱被取消,從而出現倉庫名、標籤均為 的映象。這類無標籤映象也被稱為 虛懸映象(dangling image) ,可以用下面的命令專門顯示這類映象:


$ docker image ls -f dangling=true

REPOSITORY TAG IMAGE ID CREATED SIZE

<none> <none> 00285df0df87 5 days ago 342 MB

一般來說,虛懸映象已經失去了存在的價值,是可以隨意刪除的,可以用下面的命令刪除。


$ docker image prune

中間層映象

為了加速映象構建、重複利用資源,Docker 會利用 中間層映象。所以在使用一段時間後,可能會看到一些依賴的中間層映象。預設的 docker image ls 列表中只會顯示頂層映象,如果希望顯示包括中間層映象在內的所有映象的話,需要加 -a 引數。


$ docker image ls -a

這些無標籤映象不應該刪除,否則會導致上層映象因為依賴丟失而出錯

常用列出映象的命令

根據倉庫名列出映象


$ docker image ls ubuntu

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu 18.04 f753707788c5 4 weeks ago 127 MB

ubuntu latest f753707788c5 4 weeks ago 127 MB

列出特定的某個映象


$ docker image ls ubuntu:18.04

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu 18.04 f753707788c5 4 weeks ago 127 MB

只檢視映象ID


$ docker image ls -q

5f515359c7f8

05a60462f8ba

fe9198c04d62

00285df0df87

f753707788c5

f753707788c5

1e0c3dd64ccd

以表格等距顯示,並且有標題行


$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

IMAGE ID REPOSITORY TAG

5f515359c7f8 redis latest

05a60462f8ba nginx latest

fe9198c04d62 mongo 3.2

00285df0df87 <none> <none>

f753707788c5 ubuntu 18.04

f753707788c5 ubuntu latest

刪除映象

格式


$ docker image rm [選項] <映象1> [<映象2> ...]

其中,<映象> 可以是 映象短 ID、映象長 ID、映象名 或者 映象摘要。

Untagged 和 Deleted

因為一個映象可以有多個標籤,當我們執行 docker image rm 命令時,如果如果還有其他標籤指向這個映象,那麼就不會產生 Delete 操作。

用 docker image ls 命令來配合刪除

以下命令可以刪除所有倉庫名為 redis 的映象


$ docker image rm $(docker image ls -q redis)

程式設計師的藝術人生

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章