距離上次重度探討「極簡化容器」已經快六年多了1。這議題,以前可能只是某些人技術上的興趣,現在則可能是必要。
原因是:Docker Inc 的一些措施,讓人不得不慎重考慮替代方案。
搬家的必要
這陣子容器世界起了不少變化,除了眾所周知的「Docker Desktop 要收費了」規定 2,另一個較少被提及影響是 Docker Hub 的緊縮政策:
於是,未付費的人,不僅在使用 Docker Hub 時會受到管制,還會波及產製 image 的 CI pipeline,不時會遇到這樣的 “toomanyrequests” 限流警告:
要避開這限制,治標方法是:
- 架設 image proxy。 5
- 註冊 Docker Hub 帳號,將帳密寫進 CI pipeline 裡,以獲得稍微寬鬆一點點的 rate limit 門檻。
治本方法,則得從兩方面著手:
- Image 要從 Docker Hub 搬遷到 ghcr.io 之類的地方。
- 直接引用的 base image(s) 也必須從 Docker Hub 換成 gcr.io 或 ghcr.io 之類的地方。
其中 (1) 很簡單,只要會 CI pipeline 即可辦到,像 GitHub Action 就有許多現成的元件可用。
至於 (2) 則比較麻煩。當然啦,對於玩過「極簡化容器」技術的人來說,這也只是小事一樁。
Distroless image
以前玩 minimal image 的人,是以 alpine 系列為大宗,只要不介意背後用的是 musl libc,這可以產生非常 “minimal” 的 image。近來 Google 的 “distroless” images 則提供 glibc 偏好者的另一種選擇,儘管它不算是 “minimal”,但也稱得上是 “small-enough”。
曾經我也是追求 minimal docker image 的一族 1,現在我只求 small-enough 就好。畢竟對大多數應用場景來說,像以下這兩個 image,一個約 8 MB,一個約 29 MB,差異其實是可以忽略不計的:
Image | Size (MB) | Base |
---|---|---|
docker.io/williamyeh/wrk:4.0.2 | 8.347 | alpine3 |
ghcr.io/william-yeh/wrk:4.2.0 | 28.76 | gcr.io/distroless/cc-debian11 |
可是,若以資安角度來看,8.347 MB 的 image 被挑出許多漏洞,這很顛覆「alpine 又小又安全」的既定印象:
反觀 28.76 MB 的 image 卻比較安全,這也很顛覆「glibc 系列不安全」的既定印象:
因此,我會建議,對大多數應用程式來說,選擇 Google 的 distroless 路線,可以省下許多與 alpine 相容性搏鬥的精力,又可以享受到許多好處:
- 有 Google 在維護。
- Base image 的所在地 gcr.io 沒有限流問題。
- 透過 multi-stage builds 機制,沿用既有工具鏈即可輕鬆製作。
對於 distroless 感興趣的,請參考 “What’s Inside Of a Distroless Container Image: Taking a Deeper Look” 這篇文章。
-
詳見〈為什麼要追求極簡化的 Docker image?〉一文。 ↩︎ ↩︎
-
Docker Desktop 新規定:只要公司超過 250 人,或是年營收超過美金千萬,就必須付費。根據 Docker FAQs 文件所載:“Docker Desktop requires a paid, per-user subscription for organizations with more than 250 employees or more than $10 million in annual revenue per our terms of service. [..] The updated terms for Docker Desktop were effective August 31, 2021, with a grace period until January 31, 2022.” ↩︎
-
根據 Docker Hub “Set up Automated Builds” 文件所載:“The Automated Builds feature is available for Docker Pro, Team, and Business users. Upgrade now to automatically build and push your images.” ↩︎
-
根據 Docker Hub “Download rate limit” 文件所載:“For anonymous users, the rate limit is set to 100 pulls per 6 hours per IP address. For authenticated users, it’s 200 pulls per 6 hour period. Users with a paid Docker subscription get up to 5000 pulls per day.” ↩︎
-
其實有規模的組織,本來就應該自行架設 image proxy,以做好 artifact management。對這主題感興趣的,請參考 “Mitigate the Docker Dilemma with a Proxy Cache” 一文。 ↩︎