從微信雲託管容器映象的選擇-alpine 說起

語言: CN / TW / HK

微信雲託管 使用目前主流的容器平臺Docker以及容器編排技術Kubernetes(簡稱K8S),來管理你的專案。使用微信雲託管需要掌握對Docker的使用,但你無需掌握K8S的使用方法。微信雲託管將K8S的運維配置完全接手,你不需要關心K8S和容器服務如何配置和相互作用,只需要操作微信雲託管提供的簡單操作面板,就可以輕鬆的部署服務,大大降低了容器化技術的使用門檻。當你使用微信生態下的客戶端(小程式、公眾號),向部署在微信雲託管上的後端服務傳送請求時,會自動經過微信接入層(內網),並附帶微信校驗的權威使用者資訊。非微信生態下的客戶端(普通WEB網頁、APP),向部署在微信雲託管上的後端服務傳送請求時,會經過微信雲託管公網閘道器層(所有使用者共用,由微信雲託管團隊維護),並根據域名轉發到對應的使用者服務。微信雲託管提供預設公網域名,也可以接入自己備案好的自定義域名。

在微信雲託管提供的官方模板裡(PHP,Python,NodeJS,Golang,Java,.NET) 唯獨Java 用的不是alpine 映象,具體程式碼參見 https://github.com/WeixinCloud。

在 容器崛起之前, Alpine 還是個無名之輩,可能是因為大家並不是很關心作業系統本身的大小,畢竟大家只關心業務資料和文件,程式、庫檔案和系統本身的大小通常可以忽略不計。

容器技術席捲整個軟體產業之後,大家都注意到了一個問題,那就是容器的映象太大了,浪費磁碟空間,拉取映象的時間也很長。於是,人們開始尋求適用於容器的更小的映象。對於那些耳熟能詳的發行版(例如 Ubuntu、Debian、Fedora)來說,只能通過刪除某些工具(例如 ifconfig 和  netstat )將映象體積控制在  100M 以下。而對於 Alpine 而言,什麼都不用刪除,映象大小也就只有  5M 而已。

Alpine 映象的另一個優勢是包管理工具的執行速度非常快,安裝軟體體驗非常順滑。誠然,在傳統的虛擬機器上不需要太關心軟體包的安裝速度,同一個包只需要裝一次即可,無需不停重複安裝。容器就不一樣了,你可能會定期構建新映象,也可能會在執行的容器中臨時安裝某些除錯工具,如果軟體包的安裝速度很慢,會很快消磨掉我們的耐心。

Alpine作業系統是一個面向安全的輕型Linux發行版。它不同於通常的Linux發行版,Alpine採用了musl libc和BusyBox以減小系統的體積和執行時資源消耗,但功能上比BusyBox又完善得多。在保持瘦身的同時,Alpine還提供了自己的包管理工具apk,可以通過https://pkgs.alpinelinux.org/packages查詢包資訊,也可以通過apk命令直接查詢和安裝各種軟體。

Alpine Docker映象也繼承了Alpine Linux發行版的這些優勢。相比於其他Docker映象,它的容量非常小,僅僅只有5MB左右(Ubuntu系列映象接近200MB),且擁有非常友好的包管理機制。官方映象來自docker-alpine專案。

在製作docker映象時,使用 multi stage 構建各個不同階段的命令檔案,最終copy到busybox或alpilne中執行。這樣做得好處有二:

  1. 保持映象最小,busybox,alpine 是最小的作業系統映象

  2. 有各種linux工具使用,busybox本身是一個linux工具集

  3. 構建stage建議使用alpine和其它的官方包, 主要理由是此映象比busybox稍大,但是比其他的系統映象都小,有人就問了,為撒不用busybox呢,因為busybox沒有包管理工具,這帶來很多不便;這點也是busybox和alpine的主要區別

下面我們來看一看.NET 和 Java的 alpine 的映象情況:

當前Java 沒有針對Alpine的官方穩定的OpenJDK 11構建,雖然 https://adoptopenjdk.net/ 擁有Alpine對Java 11的官方支援:https://hub.docker.com/r/adoptopenjdk/openjdk11。

Alpine是為了響應客戶請求更安全的容器發行版而新增的,從.NET Core 2.0開始 .NET 就有針對Alpine 的官方穩定的.NET 構建,對Alpine 有非常好的支援,因為它包含的軟體包更少,並且由於其表面積的減少,似乎具有更有限的CVE暴露:https://hub.docker.com/_/microsoft-dotnet-runtime。

相關文章: