4.3 映像檔的標籤
在 Redis 的頁面中,會看到一個段落有著滿滿的版本以及作業系統的後綴。
從 Docker 容器篇 開始,我們就一直使用 latest 的標籤 ( tag ),以目前的使用慣例下可以代表最新版本的意思。
那是因為 Docker 在沒有指定標籤的情況下,都會預設拉 latest 的版本下來,那要如何指定版本呢?可以用以下指令 docker image pull 映像檔名稱
( 在映像檔的後方加上標籤號,下方的案例為 redis:7.0 )
$ 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
的指令來確認本地 端擁有的映像檔:
$ 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 頁面的標籤,會發現同一份映像檔但不同標籤的會一起套上底線的效果。
而標籤最大的作用就是穩定版本,如果今天只有 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 內沒有提供,若是有需要都要自己做安裝的動作。