作者:Asen Alexandrov,Wasm Labs 工程師
文中的我們均指作者或 Wasm Labs。由于文章內(nèi)容翔實(shí)、篇幅較長(zhǎng)我們將分成上下兩篇分享,上篇將注重在概念闡釋,如 Wasm 是什么,Wasm 與 Docker 的關(guān)系是什么。下篇文章將更具實(shí)踐性,將以 PHP 為例帶領(lǐng)大家實(shí)踐 Docker + Wasm。
最近,Docker 宣布與 WasmEdge[3] 合作支持 WebAssembly[4]。
本文將解釋什么是 WebAssembly(Wasm),為什么它與 Docker 生態(tài)相關(guān),并提供一些實(shí)踐示例供大家嘗試。我們假設(shè)你已經(jīng)熟悉 Docker 工具。我們將使用我們?cè)?PHP 的 WebAssembly 端口[5]上做的工作來(lái)演示如何構(gòu)建 PHP 解釋器,將其打包為 OCI 鏡像的一部分,并使用 Docker 運(yùn)行它。
請(qǐng)注意,本文專注動(dòng)手經(jīng)驗(yàn),而不是討論技術(shù)細(xì)節(jié)。
WebAssembly ?是什么?為什么選它?
本節(jié)是對(duì) WebAssembly 的基本介紹。已經(jīng)熟悉 Wasm 的小伙伴,可以快速重溫一下,下篇文章將介紹更多實(shí)踐。
什么是 WebAssembly?
WebAssembly 是一種定義二進(jìn)制指令格式的開(kāi)放標(biāo)準(zhǔn),它支持從不同的源語(yǔ)言創(chuàng)建可移植的二進(jìn)制可執(zhí)行文件。這些二進(jìn)制文件可以在各種環(huán)境中運(yùn)行。它起源于 Web,并得到各大主流瀏覽器的支持。
Wasm 如何在瀏覽器中工作?
瀏覽器引擎集成了一個(gè) Wasm 虛擬機(jī),通常稱為 Wasm 運(yùn)行時(shí),可以運(yùn)行 Wasm 二進(jìn)制指令。編譯器工具鏈(如 Emscripten)可以將源代碼編譯為 Wasm 目標(biāo)。這允許將現(xiàn)有的應(yīng)用程序移植到瀏覽器,并直接與在客戶端 Web 應(yīng)用程序中運(yùn)行的 JS 代碼通信。
這些技術(shù)能讓傳統(tǒng)的桌面應(yīng)用程序在瀏覽器中運(yùn)行?,F(xiàn)在它們可以在任何裝了瀏覽器的設(shè)備上運(yùn)行。一些著名的例子包括 Google Earth[6] 和用于計(jì)算機(jī)視覺(jué)的 Open CV[7]庫(kù)。
Wasm 如何在服務(wù)器上運(yùn)行?
除了瀏覽器,也有可以在瀏覽器之外運(yùn)行的 Wasm 運(yùn)行時(shí),包括 Linux、Windows 和 macOS 等傳統(tǒng)操作系統(tǒng)。因?yàn)闊o(wú)法依賴可用的 JavaScript 引擎,所以他們使用不同的接口與外界通信,例如 WASI(WebAssembly 系統(tǒng)接口[8])。這些運(yùn)行時(shí)允許 Wasm 應(yīng)用程序以與 POSIX 類似(但不完全相同)的方式與其 host 系統(tǒng)交互。WASI SDK 和 wasi-libc 等項(xiàng)目幫助人們將現(xiàn)有的兼容 POSIX 的應(yīng)用程序編譯為 WebAssembly。
你只需將應(yīng)用程序編譯成 Wasm 模塊一次,然后這個(gè)同樣的二進(jìn)制文件就可以在任何地方運(yùn)行。
Wasm 有什么了不起的地方?
下面這些特性讓 Wasm 在瀏覽器大放異彩,也使得它用在服務(wù)端開(kāi)發(fā)頗具優(yōu)勢(shì):
開(kāi)放——它是業(yè)界廣泛采用的標(biāo)準(zhǔn)。與過(guò)去的瀏覽器爭(zhēng)奪戰(zhàn)相反,各大公司正積極合作,實(shí)現(xiàn) WASI 和 WebAssembly 應(yīng)用程序的標(biāo)準(zhǔn)化。
快速——它可以通過(guò)大多數(shù)運(yùn)行時(shí)的 JIT/AOT 能力提供類似原生的速度。與啟動(dòng) VM 或啟動(dòng)容器不同的是,它沒(méi)有冷啟動(dòng)。
安全——默認(rèn)情況下,Wasm 運(yùn)行時(shí)是沙箱化的,允許安全訪問(wèn)內(nèi)存。基于能力的模型確保 Wasm 應(yīng)用程序只能訪問(wèn)得到明確允許的內(nèi)容。軟件供應(yīng)鏈更加安全。
可移植——幾個(gè)主要的 Wasm 運(yùn)行時(shí)支持大多數(shù) CPU(x86、ARM、RISC-V)和大多數(shù)操作系統(tǒng),包括 Linux、Windows、macOS、Android、ESXi,甚至非 Posix 操作系統(tǒng)。
高效——最小的內(nèi)存占用和最低的 CPU 門檻就能運(yùn)行 Wasm 應(yīng)用程序。
支持多語(yǔ)言——40 多種編程語(yǔ)言可以編譯成 Wasm,有現(xiàn)代的、不斷改進(jìn)的工具鏈。
服務(wù)器平臺(tái)發(fā)展的下一步是什么?
也許你已經(jīng)看過(guò) Solomon Hykes (Docker的創(chuàng)始人之一)這句話[9]:
如果在2008年已經(jīng)有了 WASM + WASI,我們根本不需要?jiǎng)?chuàng)建 Docker。Wasm 就有這么重要。服務(wù)端的 WebAssembly 是計(jì)算的未來(lái)。
事實(shí)上,WASM+WASI 似乎的確是服務(wù)端軟件基礎(chǔ)設(shè)施發(fā)展的下一步。
最早,我們有物理硬件可以使用。我們會(huì)給機(jī)房里每個(gè)服務(wù)器精心安裝操作系統(tǒng)和應(yīng)用程序,并一一維護(hù)。
然后隨著 VMware 開(kāi)創(chuàng)的 VM 的采用,一切變得更容易了。人們可以跨硬件機(jī)器復(fù)制、克隆和移動(dòng)虛擬機(jī)。但這仍然需要在 VM 中安裝操作系統(tǒng)和應(yīng)用程序。
隨后出現(xiàn)了由 Docker 推廣的容器,這使得在最小打包的上下文下運(yùn)行應(yīng)用程序配置變得更加容易,而不會(huì)影響主機(jī)操作系統(tǒng)上的任何其他應(yīng)用程序。但是,仍然需要分發(fā)與其運(yùn)行時(shí)和必要的庫(kù)捆綁在一起的應(yīng)用程序。安全邊界由 Linux 內(nèi)核提供。
現(xiàn)在有了 WebAssembly。它的技術(shù)特性和可移植性使得分發(fā)應(yīng)用程序成為可能,無(wú)需 ship 操作系統(tǒng)級(jí)別的依賴項(xiàng),并且可以在嚴(yán)格的安全約束下運(yùn)行。
鑒于所有這些,開(kāi)發(fā)者通常將 WebAssembly 視為容器的“繼承者”,以及基礎(chǔ)設(shè)施部署的自然而然的下一步。
然而,另一種看待 WebAssembly 的方式是將其作為 Docker 工具的另一個(gè)“后端”選擇??梢允褂孟嗤拿钚泄ぞ吆凸ぷ髁?,替代 Linux 容器,使用基于 WebAssembly 的容器等同等的東西來(lái)實(shí)現(xiàn)。本文的其余部分探討了這個(gè)概念,這就是標(biāo)題所說(shuō)的“沒(méi)有容器的 Docker”。
Wasm 如何結(jié)合 Docker 運(yùn)行?
Docker Desktop 現(xiàn)在加入了對(duì) WebAssembly 的支持。它是通過(guò) containerd shim 實(shí)現(xiàn)的,該 shim 可以使用名為 WasmEdge[10] ?的 Wasm 運(yùn)行時(shí)來(lái)運(yùn)行 Wasm 應(yīng)用程序。這意味著,現(xiàn)在可以在 WasmEdge 運(yùn)行時(shí)(模擬容器)中運(yùn)行 Wasm 應(yīng)用程序,而不是用典型的 Windows 或 Linux 容器運(yùn)行容器鏡像中二進(jìn)制文件的單獨(dú)進(jìn)程。
因此,容器鏡像不需要包含正在運(yùn)行的應(yīng)用程序的操作系統(tǒng)或運(yùn)行時(shí)上下文——單個(gè) Wasm 二進(jìn)制文件就足夠了。
這在 Docker 的 Wasm 技術(shù)預(yù)覽文章[11]中有詳細(xì)解釋。
WasmEdge 是什么?
WasmEdge[12] 是一個(gè)高性能的 WebAssembly 運(yùn)行時(shí):
是開(kāi)源的,屬于 CNCF[13]。
支持所有主要的 CPU 架構(gòu)(x86、ARM、RISC-V)。
支持所有主要操作系統(tǒng)(Linux、Windows、macOS)以及其他操作系統(tǒng),例如 seL4 RTOS、Android。
針對(duì)云原生和邊緣應(yīng)用程序進(jìn)行了優(yōu)化。
可擴(kuò)展并支持標(biāo)準(zhǔn)和新興技術(shù)
使用 Tensorflow、OpenVINO、PyTorch 進(jìn)行人工智能推理
Tokio 的異步網(wǎng)絡(luò)。支持微服務(wù)、數(shù)據(jù)庫(kù)客戶端、消息隊(duì)列等。
與容器生態(tài)、Docker 和 Kubernetes 無(wú)縫集成(如本文所示?。?/p>
解釋型語(yǔ)言呢?
到目前為止,我們只提到了 C 和 Rust 等編譯語(yǔ)言可以編譯為 WebAssembly。對(duì)于 Python、Ruby 和 PHP 等解釋型語(yǔ)言,方法有所不同:它們的解釋器是用 C 語(yǔ)言編寫(xiě)的,可以編譯為 WebAssembly。然后這個(gè)解釋器編譯成的 Wasm 可以用來(lái)執(zhí)行源代碼文件,通常以 .py、.rb、.php 等結(jié)尾。一旦編譯為 Wasm,任何帶有 Wasm 運(yùn)行時(shí)的平臺(tái)都將能夠運(yùn)行這些解釋型語(yǔ)言,即使實(shí)際的解釋器從未為該平臺(tái)原生編譯過(guò)。
明天我們將介紹,如何將 PHP 解釋器編譯 Wasm ,并打包成 OCI 鏡像,并使用內(nèi)置了 WasmEdge 的 Docker Desktop 運(yùn)行這個(gè) OCI 鏡像,我們也將介紹傳統(tǒng)容器與 Wasm 容器的不同之處。
[1]
Wasm Labs @ VMware OCTO: https://wasmlabs.dev/
[2]
Docker+WebAssembly 的演講: https://youtu.be/yo30oF1Gflo?t=7361
[3]
WasmEdge: https://wasmedge.org/
[4]
WebAssembly: https://docs.docker.com/desktop/wasm/
[5]
WebAssembly 端口: https://wasmlabs.dev/articles/php-wasm32-wasi-port/
[6]
Google Earth: https://earth.google.com/
[7]
Open CV: https://opencv.org/
[8]
WebAssembly 系統(tǒng)接口: https://wasi.dev/
[9]
這句話: https://twitter.com/solomonstre/status/1111004913222324225
[10]
WasmEdge: https://github.com/WasmEdge/Wasmedge
[11]
Wasm 技術(shù)預(yù)覽文章: https://www.docker.com/blog/docker-wasm-technical-preview/
[12]
WasmEdge: https://github.com/WasmEdge/Wasmedge
[13]
CNCF: https://cncf.io/
編輯:黃飛
?
評(píng)論
查看更多