2021年12月16日

Docker image 版本差在哪?alpine, buster, bullseye 怎麼選?

大家一開始在學習使用 Docker 時,會學著撰寫 Dockerfile,也會從 DockerHub 上挑選適合的 Image。

但不知道大家有沒有發現,有時候明明都是同一個東西,卻有很多種不同的選擇?比如說,我自己最近常用 PostgreSQL postgres,一樣都是 14 版,卻有 postgres:14postgres:14-bullseyepostgres:14-alpine 等,各種不一樣標籤的 Image 。

這些不一樣的 Image 對初學者來說蠻令人困惑的,會不曉得有什麼差別,也不知道該選哪一個。但理解後發現其實沒有那麼複雜,簡單來說,後面那些字,指的是背後的作業系統。

版本比較

最新穩定版本

一樣以 PostgreSQL 為例子,當我們使用 postgres:14,沒有其他後綴,那通常用的就是 Debian 的最新穩定版本作為底層的作業系統。

這種是沒有特殊需求,預設可以挑選的版本。一般人如果想要開啟某個專案,可以先從沒有後綴的版本開始。

有興趣的人可以進到 Container 裡面執行 cat /etc/os-release 指令看看。

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

bullseye/buster

bullseye、buster 這些看起來比較不知所以然的標籤,其實也跟 Debian 有關,他們指的是 Debian 的版本代號 Code Name。

大家可以參考這裡: DebianReleases 的 Production Releases。在這邊,我們可以發現 Bullseye 指的就是 Debian 11,Buster 就是 Debian 10。

如果你的應用程式有相依於特定的 Debian 版本,就可以該版本的 Image 來使用。

而在此篇文章撰寫的當下,最新穩定版本是代號 Bullseye 的 11 版,所以前一段例子執行 cat /etc/os-release 印出的版本就是 bullseye。因此在撰寫文章的當下,postgres:14 就是 postgres:14-bullseye 的別名,是同一個 Image(但這個非絕對,取決於維護者有沒有更新對應關係)。

alpine

那 alpine 呢? 眼尖的朋友應該會發現,這個不在剛剛的 Debian Releases 裡面,因為它其實是另一套作業系統 Alpine Linux。

Alpine Linux 是個非常輕量的作業系統,如果應用環境有容量大小限制的話,就可以考慮選擇 alpine。

它的缺點是,它可能少了一些常用的套件,所以可能要自己另外安裝。另一方面來說,這很適合全部都想要自己來的人。

/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.15.0
PRETTY_NAME="Alpine Linux v3.15"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

同場加映 - alpine 有多小?

我實際把 postgres:14postgres:14-bullseyepostgres:14-alpine 都 pull 下來,比較他們的大小。

可以發現,postgres:14 跟 postgres:14-bullseye 都是 374.04 MB,而 postgres:14-alpine 卻只有 208.96 MB,足足少了165 MB。

 

參考文章

Alpine, Slim, Stretch, Buster, Jessie, Bullseye — What are the Differences in Docker Images?