多平臺 Docker 鏡像構建教程

多平臺 Docker 鏡像構建教程

Adrian Mouat 被譽為 Docker Captain,他是 Container Solutions 公司的首席科學家。目前,他正開發 Trow,這是一個容器鏡像註冊中心,用於安全管理 Kubernetes 集群中的鏡像流。

當前,Docker 鏡像已經成為測試和部署新的第三方軟件的標準工具。Adrian 是開源 Trow 註冊中心的主要開發者,而 Docker 鏡像則是人們安裝該工具的主要方式。如果他不提供鏡像,其他人最終也會推出他們自己的鏡像,這樣會導致重複工作,併產生維護問題。

默認情況下,我們創建的 Docker 鏡像運行在 linux/amd64 平臺上。它適用於大多數的開發機器和雲提供商,但卻忽略其他平臺的用戶。這個群體很龐大——想想基於樹莓派的家庭實驗室、生產物聯網設備的公司、運行在 IBM 大型機上的組織以及使用低功耗 arm64 芯片的雲。

一般來說,這些平臺的用戶通常會構建自己的鏡像或尋找其他解決方案。

那麼,你該如何為這些平臺構建鏡像?最明顯的方法是在目標平臺上構建鏡像。這適用於很多情況。但是如果你的目標是 s390x,我希望你有可以使用的 IBM 大型機。更常見的平臺,比如樹莓派、物聯網設備通常電量有限,速度慢或無法構建鏡像。

我們該怎麼做?有兩個選項:1. 目標平臺仿真,2. 交叉編譯。有趣的是,我發現有種方法可以將這兩個選項結合的效果最好。

仿真

讓我們從第一個選項——仿真開始。有一個很不錯的項目叫 QEMU ,它可以模擬很多平臺。隨著最近 buildx 的預覽,將 QEMU 用於 Docker 變得更加容易。

QEMU 集成依賴於一個 Linux 內核特性,該特性有個稍顯神秘的名字 binfmt_misc handler 。當 Linux 遇到其無法識別的可執行文件格式(例如,一個用於不同體系結構的文件格式)時,它將使用該處理程序檢查是否配置了什麼“用戶空間應用程序”來處理該格式(例如,模擬器或 VM)。如果有,它將把可執行文件傳遞給該應用程序。

為實現這一點,我們需要在內核中註冊我們關注的平臺。如果你正在使用 Docker Desktop,那麼對於大多數常見平臺,你就無需做這項工作。如果你正使用 Linux,你可以通過運行最新的docker/binfmt鏡像,以與 Docker Desktop 相同的方式註冊處理程序,例如:

查看更多


分享到:


相關文章: