WebAssembly:没有容器的 Docker!


最近 Docker 宣布与WasmEdge合作支持WebAssembly
本文将解释什么是 WebAssembly,为什么它与 Docker 生态系统相关,并提供一些实践示例供您尝试。我们假设您熟悉 Docker 工具。我们将使用我们在PHP 的 WebAssembly 端口上的工作来演示如何构建 PHP 解释器,将其打包为 OCI 图像的一部分并使用 Docker 运行它。
请注意,本文侧重于获得一些实践经验,而不是讨论技术细节。您可以重现下面的示例,也可以通读它们直到最后,因为我们还将提供输出。

WebAssembly(或 Wasm)是一种定义二进制指令格式的开放标准,它允许从不同的源语言创建可移植的二进制可执行文件。

Wasm 如何在浏览器中工作?
浏览器引擎集成了一个 Wasm 虚拟机,通常称为 Wasm 运行时,可以运行 Wasm 二进制指令。有编译器工具链(如 Emscripten)可以将源代码编译为 Wasm 目标。这允许将遗留应用程序移植到浏览器并直接与在客户端 Web 应用程序中运行的 JS 代码通信。

这些技术允许传统的桌面应用程序在浏览器中运行。现在它们可以在任何装有浏览器的设备上运行。一些著名的例子是Google Earth和用于计算机视觉的Open CV库。

Wasm 如何在服务器上运行?
有可以在浏览器之外运行的 Wasm 运行时,包括 Linux、Windows 和 macOS 等传统操作系统。因为他们不能依赖可用的 JavaScript 引擎,所以他们使用不同的接口与外界通信,例如 WASI,即WebAssembly 系统接口。这些运行时允许 Wasm 应用程序以与 POSIX 类似(但不完全相同)的方式与其主机系统交互。WASI SDK 和 wasi-libc 等项目帮助人们将现有的 POSIX 兼容应用程序编译为 WebAssembly。
您只需将应用程序编译成 Wasm 模块,然后就可以在任何地方运行完全相同的二进制文件。

服务器平台发展的下一步是什么?
您可能已经看到Solomon Hykes(Docker 的联合创始人之一)的这句话:
如果 WASM+WASI 存在于 2008 年,我们就不需要创建 Docker。这就是它的重要性。服务器上的 WebAssembly 是计算的未来。
事实上,WASM+WASI 似乎确实是服务器端软件基础设施发展的下一步。

  • 过去,我们有物理硬件可以使用。我们会在每个盒子上精心安装操作系统和应用程序,并一一维护。
  • 然后随着 VMware 开创的 VM 的采用,事情变得更容易了。人们可以跨硬件盒复制、克隆和移动虚拟机。但这仍然需要在 VM 中安装操作系统和应用程序。
  • 然后出现了由 Docker 推广的容器,它使得在简约的包装上下文中运行应用程序配置变得更加容易,而不会影响主机操作系统上的任何其他应用程序。但是,这仍然需要分发与其运行时和必要的库捆绑在一起的应用程序。安全边界由 Linux 内核提供
  • 我们现在有了 WebAssembly。它的技术特性和可移植性使得分发应用程序成为可能,无需运送操作系统级别的依赖项,并且可以在严格的安全约束下运行。

然而,另一种看待 WebAssembly 的方式是将其作为 Docker 工具的替代“后端”。您可以使用相同的命令行工具和工作流,但不是使用 Linux 容器,而是使用基于 WebAssembly 的容器等效项来实现。

本文的其余部分探讨了这个概念,这就是我们所说的“没有容器的 Docker”。

Wasm 如何与 Docker 协同工作?
Docker Desktop 现在包括对 WebAssembly 的支持。它是通过一个 containerd shim 实现的,该 shim 可以使用一个名为WasmEdge的 Wasm 运行时来运行 Wasm 应用程序。这意味着,您现在可以在 WasmEdge 运行时中运行 Wasm 应用程序,而不是典型的 Windows 或 Linux 容器,它们会运行容器映像中二进制文件的单独进程,模拟容器。
因此,容器镜像不需要包含正在运行的应用程序的操作系统或运行时上下文——单个 Wasm 二进制文件就足够了。
这在 Docker 的Wasm 技术预览文章中有详细解释。

什么是 WasmEdge?
WasmEdge是一个高性能的 WebAssembly 运行时,它:

  • 是开源的,是CNCF的一部分。
  • 支持所有主要的 CPU 架构(x86、ARM、RISC-V)。
  • 支持所有主要操作系统(Linux、Windows、macOS)以及其他操作系统,例如 seL4 RTOS、Android。
  • 针对云原生和边缘应用程序进行了优化。
  • 可扩展并支持标准和新兴技术
    • 使用 Tensorflow、OpenVINO、PyTorch 进行人工智能推理
    • 与 Tokio 异步联网。支持微服务、数据库客户端、消息队列等。
    • 与容器生态系统、Docker 和 Kubernetes 无缝集成(如本文所示!)

解释性语言呢?
到目前为止,我们只提到了 C 和 Rust 等编译语言可以针对 WebAssembly。对于 Python、Ruby 和 PHP 等解释型语言,方法有所不同:它们的解释器是用 C 编写的,可以编译为 WebAssembly。然后这个解释编译成 Wasm 可以用来执行源代码文件,通常以 .py、.rb、.php 等结尾。一旦编译为 Wasm,任何具有 Wasm 运行时的平台都将能够运行这些解释语言,即使实际的解释器从未为该平台本地编译过。

实际操作示例
让我们开始吧!在动手示例中,我们将使用编译为 Wasm 的 PHP 解释器。我们会:


先决条件
如果您想在本地重现这些示例,您需要使用以下部分或全部内容来准备您的环境:

  • WASI SDK - 从遗留 C 代码构建 WebAssembly 应用程序
  • PHP - 为了比较而运行本机 PHP 二进制文件
  • WasmEdge 运行时 - 运行 WebAssembly 应用程序
  • Docker Desktop + Wasm(在撰写本文时,在4.15 版中作为稳定测试版提供)能够运行 Wasm 容器

我们还利用“Wasm Language Runtimes”存储库,它提供了将 PHP 解释器构建为 WebAssembly 应用程序的方法。
您可以像这样检查演示分支:
git clone --depth=1 -b php-wasmedge-demo \ https://github.com/vmware-labs/webassembly-language-runtimes.git wlr-demo cd wlr-demo

详细点击标题