什么是 Wasm?
WebAssembly,通常简称为 Wasm,是一种相对较新的技术,允许您编译用 40 多种语言(包括 Rust、C、C++、JavaScript 和 Golang)编写的应用程序代码,并在沙盒环境中运行它。

最初的用例侧重于在网络浏览器中运行本机代码,例如Figma、AutoCAD和Photoshop。事实上,fastq.bio在将其基于 Web 的 DNA 序列质量分析器转换为 Wasm 时,速度提高了20 倍。迪士尼在 Wasm 之上构建了他们的Disney+ 应用程序开发工具包!浏览器中的好处显而易见。

但由于WebAssembly 系统接口(WASI),Wasm 正在迅速传播到浏览器之外。Vercel、Fastly、Shopify和Cloudflare等公司支持使用 Wasm 在边缘运行代码,而Fermyon正在构建一个平台以在云端运行 Wasm 微服务。


(资料图片)

为什么是Docker?
在 Docker,我们的目标是通过克服应用程序开发的复杂性来帮助开发人员将他们的想法变为现实。我们努力让构建、共享和运行您的应用程序变得容易,无论底层技术如何。通过让所有人都能使用容器,我们证明了我们有能力让开发人员的生活更轻松,并被公认为最受欢迎的开发人员工具第一名。

我们将 Wasm 视为 Linux 容器的补充技术,开发人员可以根据用例选择他们使用的技术(或两者!)。随着社区探索 Wasm 的可能性,我们希望使用您了解和喜爱的经验和工具帮助使 Wasm 应用程序更容易开发、构建和运行。

Wasm 集成实际上是如何工作

1.我们正在利用我们最近的工作将图像管理迁移到 containerd,因为它提供了使用与 OCI 兼容的工件和 containerd 垫片的能力。

2.我们与WasmEdge合作创建了一个 containerd shim。该 shim 从 OCI 工件中提取 Wasm 模块并使用 WasmEdge 运行时运行它。

3.我们添加了声明 Wasm 运行时的支持,这将允许使用这个新的 shim。

安装预览版后,我们可以运行以下命令来启动示例 Wasm 应用程序:

docker run -dp 8080:8080 --name=wasm-example --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 michaelirwin244/wasm-example

由于一些标志可能不熟悉,让我们解释一下它们在做什么:

--runtime=io.containerd.wasmedge.v1– 这会通知 Docker 引擎我们要使用 Wasm containerd shim 而不是标准的 Linux 容器运行时
--platform=wasi/wasm32– 这指定了我们要使用的图像的架构。通过利用 Wasm 架构,我们不需要为不同的架构构建单独的图像。Wasm 运行时将完成将 Wasm 二进制文件转换为机器指令的最后一步。
镜像拉取后,runtime 会读取ENTRYPOINT镜像的 来定位并提取 Wasm 模块。然后将该模块加载到 Wasm 运行时、启动并配置网络。现在我们的机器上运行了一个 Wasm 应用程序!

这个特定的应用程序是一个简单的 Web 服务器,上面写着“Hello world!” 并将数据回显给我们。为了验证它是否正常工作,让我们首先查看日志。

docker logs wasm-example

Server is now running
我们可以通过打开http://localhost:8080或使用 curl 来获取“Hello world”消息。

curl localhost:8080
我们的响应会给我们一条 Hello world 消息:

Hello world from Rust running with Wasm! Send POST data to /echo to have it echoed back to you
要将数据发送到 echo 端点,我们可以使用 curl:

curl localhost:8080/echo -d "{"message":"Hi there"}" -H "Content-type: application/json"
我们将看到发回以在响应中使用的数据:

{"message":"Hi there"}
要删除应用程序,您可以像删除任何其他 Docker 服务一样删除它:

docker rm -f wasm-example
新的集成意味着您可以与 Linux 容器一起运行 Wasm 应用程序(甚至使用 Compose)。

关键词: Wasm