用 Docker 构建、共享和运行 WebAssembly 应用

毫无疑问,WebAssembly(Wasm)最近在技术圈风头正劲。尽管在一些人看来这可能是一时热度,但我们相信 Wasm 在持续的容器化开发中发挥着关键作用。Docker 和 Wasm 可以是互补的技术。

过去,我们探索了 Docker 如何成功运行 Wasm 模块[2]以及 Linux 或 Windows 容器。近五个月后,我们通过 Docker+Wasm 技术预览[3] 又向前迈出了一大步。开发者比以往任何时候都更需要卓越的性能、可移植性和运行时隔离。

Docker 工程总监 Chris Crone 和 Second State CEO、创始人 Michael Yuan 在 CNCF Cloud Native Wasm Day 2022 上解答了这些难题[4]。这是大会演讲的完整视频(完整视频为生肉。字幕版见下文两个demo),但请留意我们之后的详细拆解:

无需学习新流程,开发者即可使用 Docker 和 Wasm 顺利地开发。普遍使用的 Docker CLI 命令可以解决这个问题。有了与 WasmEdge[5] 的合作,Docker 甚至可以管理 WebAssembly Runtime。我们将深入探讨我们处理这个新项目的原因以及使之成为可能的技术机制。

WebAssembly + Docker 为什么结合?

工作负载和代码的隔离方式对我们向用户交付软件的速度有重大影响。Chris 通过解释开发者的价值来强调这一点:

  • 跨项目轻松重复使用组件和定义的接口,有助于更快地创造价值
  • 最大化共享计算资源,同时保持工作负载之间安全、牢固的边界——降低应用程序交付成本
  • 通过容器镜像等便捷的打包机制,在几秒钟内将应用程序无缝交付给用户,让用户更快地看到价值
  • 我们知道工作负载隔离在这些事情中发挥了作用,但是有很多方法可以实现它——比如隔离 闸(air gapping)、硬件虚拟化、堆栈虚拟化(Wasm 或 JVM)、容器化等等。由于每个都有独特的优点和缺点,因此选择最佳解决方案可能很棘手。

    找到合适的工具也非常困难。仅 CNCF 工具全景图中就百花齐放不一而足,虽然我们很感激这些工具的存在,但对于许多开发者来说,种类繁多到让人眼花缭乱。

    Chris 相信专用工具可以解决手头的任务。指导这些工具决策也是我们 Docker 的责任。这建立在我们持续的使命之上,即帮助开发者尽快构建、共享和运行他们的应用程序。

    这就轮到 WasmEdge 和 Michael Yuan 大展身手啦。

    Docker 和 WasmEdge 的机会激动人心

    Michael 展示了容器和 WebAssembly 应用场景之间存在一些重叠。例如,两个阵营的开发者可能都想发布微服务应用程序。Wasm 可以实现更快的启动时间和代码级安全性,这在许多场景下都很有优势。

    然而,由于线程、垃圾收集和二进制打包的限制,WebAssembly 并不适合所有应用场景。目前,使用 Wasm 运行应用程序还需要额外的工具。

    WasmEdge 实际操作:TensorFlow 接口

    Michael 随后进行了一个 TensorFlow 机器学习应用的 demo,来展示 WasmEdge 可以做什么。此应用程序无法与其他兼容 WASI 的运行时一起使用:

    下面几点确保了这个 demo 成为可能:

  • Rust:一种安全快速的编程语言,对 Wasm 编译目标具有一等公民的支持。
  • Tokio:一种流行的异步运行时,无需多线程即可处理多个并行 HTTP 请求。
  • WasmEdge 的 **TensorFlow**[6]:与 WASI-NN 规范兼容的插件。除了 Tensorflow,WasmEdge 还支持 PyTorch 和 OpenVINO。
  • 注意: Tokio 和 TensorFlow 支持是 WasmEdge 的特性,其他符合 WASI 的运行时目前还不支持。

    使用 Rust 的 cargo build 命令,我们可以使用 wasm32-wasi 目标平台将程序编译成 Wasm 模块。WasmEdge Runtime 可以执行生成的 .wasm 文件。应用程序运行后,我们可以执行 HTTP 查询来运行一些非常酷的图像识别任务。

    此示例展示了 WasmEdge 为兼容 WASI 的运行时。根据 WasmEdge 维护者的说法[7],“WasmEdge 是一个轻量级、高性能和可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中心化应用程序。它为 Serverless 应用程序、嵌入式函数、微服务、智能合约和物联 设备提供支持。”

    使 Wasm 可通过 Docker 使用

    Docker 有两个神奇的特性。首先,Docker 和容器可以在生产环境在任何机器和任何地方上运行。其次,Docker 使构建、共享和重用来自任何项目的组件变得容易。容器镜像和其他 OCI 工件易于使用(和共享)。隔离是默认的。数以百万计的开发者也非常熟悉许多 Docker 工作流程,例如 docker compose up

    Chris 表示,标准化和开放生态系统如何使 Docker 和容器工具随处可用。OCI 规范在这里至关重要,让我们形成适用于几乎任何人和任何受支持技术(如 Wasm)的新解决方案。

    另一方面,设置跨平台 Wasm 开发者环境很棘手。你还必须学习新的工具和工作流程——让人抓狂的同时阻碍生产力。我们深信可以帮助开发者克服这些挑战,我们很高兴能够利用自己的平台让 Wasm 更易于使用。

    演示 Docker+WasmEdge

    Wasm 支持在实践中的表现如何?Chris 使用 Docker Desktop 的预览启动了一个演示,并提供了 WASI 支持。他创建了一个包含三个服务的 Docker Compose 文件:

  • 使用 NGINX Docker 官方镜像[8]的前端静态 JavaScript 客户端
  • 编译为 wasi/wasm32 的 Rust 服务器
  • MariaDB 数据库
  • 该 Rust 服务器作为 Wasm 模块运行,而 NGINX 和 MariaDB 服务器在 Linux 容器中运行。Chris 用一个 Dockerfile 构建了此 Rust 服务器,该 Dockerfile 是从他的本地平台编译成为了一个 wasm32-wasi 目标。他还运行 WasmEdge 专有的 AOT 编译器来优化内置的 Wasm 模块。但是,此步骤是可选的,优化的模块需要 WasmEdge Runtime。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年10月7日
    下一篇 2022年10月7日

    相关推荐