Website logo

Robert Chang

技術部落格

Docker - 映像檔的標籤

昨天的最後我們停在了搜尋 Redis 映像檔的 DockerHub 頁面,今天將延續昨天的話題,講講映像檔的標籤。

映像檔的標籤

在昨天搜尋 Redis 的頁面中,會看到一個段落有著滿滿的版本以及作業系統的後綴。

screen shot

其實從一開始的容器練習章節,我們就一直都是使用 latest 的標籤 ( tag ),在目前的設定下可以說是最新的版本的意思,是因為 Docker 在沒有指定標籤的情況下,都會預設拉 latest 的版本下來,那要如何指定版本呢?可以用以下指令:

$ docker image pull redis:7.0
7.0: Pulling from library/redis
7a6db449b51b: Already exists
05b1f5f3b2c0: Pull complete
f0036f71a6fe: Pull complete
cd7ddcecb993: Pull complete
8cfc9a467ed7: Pull complete
2a9998409df9: Pull complete
Digest: sha256:495732ba570db6a3626370a1fb949e98273a13d41eb3e26f7ecb1f6e31ad4041
Status: Downloaded newer image for redis:7.0
docker.io/library/redis:7.0

接著可以透過下方指令來確認現在擁有的映像檔:

$ docker image list
REPOSITORY TAG     IMAGE ID     CREATED      SIZE
redis      7.0     dc7b40a0b05d 7 days ago   117MB
httpd      latest  a981c8992512 7 days ago   145MB
postgres   latest  f8dd270e5152 2 weeks ago  376MB
nginx      latest  b692a91e4e15 4 weeks ago  142MB

可以看到除了之前使用過的映像檔外,也多了一個剛剛拉下來的 redis:7.0 的映像檔,接著再試試看拉下 7.0.4 的版本會發生什麼事吧。

$ docker image pull redis:7.0.4
7.0.4: Pulling from library/redis
Digest: sha256:495732ba570db6a3626370a1fb949e98273a13d41eb3e26f7ecb1f6e31ad4041
Status: Downloaded newer image for redis:7.0.4
docker.io/library/redis:7.0.4

會發現整個拉下來的速度和第一次差非常多,這是怎麼一回事呢?打開映像檔列表看看先。

$ docker image list
REPOSITORY TAG     IMAGE ID     CREATED      SIZE
redis      7.0.4   dc7b40a0b05d 2 mins ago   117MB
redis      7.0     dc7b40a0b05d 2 mins ago   117MB
httpd      latest  a981c8992512 7 days ago   145MB
postgres   latest  f8dd270e5152 2 weeks ago  376MB
nginx      latest  b692a91e4e15 4 weeks ago  142MB

意外的發現 7.0 以及 7.0.4 的 IMAGE ID 是完全相同的,是因為其實這兩個是同一份映像檔,只是用不同的標籤標示而已,這才導致 Docker 本身的快取機制導致根本沒有下載的感覺,是因為本機已經有一份一樣的映像檔了。

至於映像檔的大小,雖然都是 117 MB,但實際上在電腦上佔據的容量並不是 234 MB,而是 117 MB,是因為這兩份映像檔的標籤都指向同一個映像檔,所以不會額外的佔據本機磁碟空間。

有趣的是,若是將滑鼠移動至 DockerHub redis 頁面的標籤,會發現同一份映像檔但不同標籤的會一起套上底線的效果。

screen shot

而標籤最大的作用就是穩定版本,如果今天只有 latest 一種標籤可以選擇時,對於正式環境是非常不可靠的,我們永遠都要擔心版本更迭會不會造成非預期性的崩壞,所以在正式服務中,使用的映像檔都會指定標籤,這一方面也保證了應用程式的穩定性。

怎麼到處都有 alpine?

如果你是剛開始學習 Docker 的新手,可能會常常聽到 alpine 這個名詞,這其實就是 Linux 作業系統的一個分支,像是 Ubuntu、CentOS 是一樣的,那為什麼在 Docker 的世界中,alpine 會這麼的紅呢?

最大的原因就在於它非常的小, 讓我們拉看看 redis 的 alpine 版本試試看。

$ docker image pull redis:7-alpine
7-alpine: Pulling from library/redis
213ec9aee27d: Already exists
c99be1b28c7f: Pull complete
8ff0bb7e55e3: Pull complete
6d80de393db7: Pull complete
8dbffc478db1: Pull complete
7402bc4c98a0: Pull complete
Digest: sha256:dc1b954f5a1db78e31b8870966294d2f93fa8a7fba5c1337a1ce4ec55f311bc3
Status: Downloaded newer image for redis:7-alpine
docker.io/library/redis:7-alpine

接著打開列表看看大小的差異:

$ docker image list
REPOSITORY TAG      IMAGE ID     CREATED      SIZE
redis      7-alpine 9192ed4e4955 1 mins ago   28.5MB
redis      7.0.4    dc7b40a0b05d 5 mins ago   117MB
redis      7.0      dc7b40a0b05d 5 mins ago   117MB
httpd      latest   a981c8992512 7 days ago   145MB
postgres   latest   f8dd270e5152 2 weeks ago  376MB
nginx      latest   b692a91e4e15 4 weeks ago  142MB

竟然足足少了 90 MB,但卻可以提供一樣的服務,但在瘦身這麼多的情況下勢必會做出一些犧牲,某些基礎的套件在 alpine 內沒有提供,若是有需要都要自己做安裝的動作。

結語

今天說了關於映像檔的標籤,明天則會把映像檔拆開來看,到底是如何組成的呢?

上一篇文章Docker - 什麼是映像檔( Image )?

下一篇文章Docker - 映像檔快取的秘密