Docker + WebAssembly 集成简介

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

Docker+Wasm 的技术预览版现在已经发布了,Wasm 最近引起了很多轰动,该功能将使你更容易快速构建针对 Wasm 运行时的应用程序。

作为本次发布的一部分,我们也很高兴地宣布 Docker 将作为投票成员加入字节码联盟[1],字节码联盟是一个非营利组织,致力于在 WebAssembly 和 WebAssembly 系统接口(WASI)等标准的基础上,创建安全的新软件基础。

什么是 Wasm?

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

最初的用例主要是在 Web 浏览器中运行本地代码,例如 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 容器的补充技术[3],开发人员可以根据使用情况选择使用哪种技术(或两者都使用!)。随着社区探索 Wasm 的可能性,我们希望帮助使 Wasm 应用程序更容易开发、构建和运行,使用你所熟悉和喜爱的经验和工具。

如何获取预览版?

你是否已经准备好开始来亲自尝试了吗?很好!但在此之前,你需要记住几个注意事项:

  • 重要事项 #1:这是 Docker Desktop 的技术预览版本,可能无法按预期工作,请务必在继续之前备份你的容器和镜像。
  • 重要事项 #2:该预览版启用了 containerd 镜像存储,并且不能被禁用。如果您当前未使用 containerd 镜像存储,则将无法访问预先存在的镜像和容器。

你可以在下面下载 Docker Desktop 的技术预览版本:

  • macOS Apple Silicon[4]
  • macOS Intel[5]
  • Windows AMD64[6]
  • Linux Arm64 (deb[7])
  • Linux AMD64 (deb[8]rpm[9]tar[10])

是否有一些限制?

是的!这是一个早期的技术预览版本,我们仍在努力使体验尽可能流畅,但这里有一些你应该注意的事情:

  1. 当中断时,Docker Compose 可能无法干净退出。
  • 解决方法:通过向 docker-compose 进程发送SIGKILL(killall -9 docker-compose)来清理它们。
  1. 推送到 Hub 可能会出现错误,类似于这样的错误信息server message: insufficient_scope: authorization failed,即使在使用 Docker Desktop 登录后也是如此。
  • 解决方法:在 CLI 中运行 docker login。

使用

首先,我们需要提醒你,由于这是一个技术预览,事情可能会很快发生变化,但这是它目前的工作方式。

  1. 我们正在利用我们最近的工作,将镜像管理迁移到 containerd,因为它提供了使用与 OCI 兼容的工件和 containerd shims 的能力。
  2. 我们与WasmEdge[11] 合作创建了一个 containerd shim。此 shim 从 OCI 工件中提取 Wasm 模块并使用 WasmEdge 运行时运行它。
  3. 我们添加了对声明 Wasm 运行时的支持,这将允许使用这个新的 shim。

图片

使用 docker run 启动 Wasm 应用

安装预览版后,我们可以运行以下命令来启动一个 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 二进制文件转换为机器指令。

拉取镜像后,运行时读取镜像的 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 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)。

使用 Compose 启动 Wasm 应用

同样的我们也可以使用 Docker Compose 来运行 Wasm 应用,如下所示的 Compose 文件:

services:
app:
image: michaelirwin244/wasm-example
platform: wasi/wasm32
runtime: io.container.wasmedge.v1
ports:
- 8080:8080

然后使用如下所示的命令即可启动该应用:

$ docker compose up

使用 Wasm 运行多服务应用程序

网络的工作方式与你对 Linux 容器的预期相同,让你可以灵活地将 Wasm 应用与其他容器化工作负载(例如数据库)组合在单个应用程序堆栈中。

在以下示例中,Wasm 应用程序利用了在容器中运行的 MariaDB 数据库。

  1. Clone 示例仓
$ git clone https://github.com/second-state/microservice-rust-mysql.git
Cloning into 'microservice-rust-mysql'...
remote: Enumerating objects: 75, done.
remote: Counting objects: 100% (75/75), done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 75 (delta 29), reused 48 (delta 14), pack-reused 0
Receiving objects: 100% (75/75), 19.09 KiB | 1.74 MiB/s, done.
Resolving deltas: 100% (29/29), done.
  1. 导航到项目根目录并使用 Docker Compose 启动项目。
$ cd microservice-rust-mysql
$ docker compose up
[+] Running 0/1
⠿ server Warning 0.4s
[+] Building 4.8s (13/15)
...
microservice-rust-mysql-db-1 | 2022-10-19 19:54:45 0 [Note] mariadbd: ready for connections.
microservice-rust-mysql-db-1 | Version: '10.9.3-MariaDB-1:10.9.3+maria~ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution

在另一个终端中,我们可以看到创建的 Wasm 镜像。

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
server latest 2c798ddecfa1 2 minutes ago 3MB

检查镜像显示镜像是否具有 wasi/wasm32 平台,操作系统和架构的组合。

$ docker image inspect server | grep -A 3 "Architecture"
"Architecture": "wasm32",
"Os": "wasi",
"Size": 3001146,
"VirtualSize": 3001146,
  1. 在http://localhost:8090 打开网站并创建一些示例订单,所有这些都是与 Wasm 服务器交互。
  2. 完成后,在你启动应用程序的终端中按 Ctrl+C 将所有内容删除。

构建和推送 Wasm 模块

  1. 创建一个构建 Wasm 应用程序的 Dockerfile,当然这取决于你使用的语言。
  2. 在 Dockerfile 的单独阶段中,提取模块并将其设置为ENTRYPOINT。
FROM scratch
COPY --from=build /build/hello_world.wasm /hello_world.wasm
ENTRYPOINT [ "hello_world.wasm" ]
  1. 构建并推送指定wasi/wasm32 架构的镜像,Buildx 使这在单个命令中变得容易。
$ docker buildx build --platform wasi/wasm32 -t username/hello-world .
...
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => exporting manifest sha256:2ca02b5be86607511da8dc688234a5a00ab4d58294ab9f6beaba48ab3ba8de56 0.0s
=> => exporting config sha256:a45b465c3b6760a1a9fd2eda9112bc7e3169c9722bf9e77cf8c20b37295f954b 0.0s
=> => naming to docker.io/username/hello-world:latest 0.0s
=> => unpacking to docker.io/username/hello-world:latest 0.0s
docker push username/hello-world

Wasm 和 Docker 的下一步

Wasm 正在快速成长和发展,包括探索如何支持多线程、垃圾收集等。还有许多仍待解决的问题,包括缩短开发人员反馈循环和可能的生产路径。

参考链接

  • https://www.docker.com/blog/docker-wasm-technical-preview/。
  • https://docs.docker.com/desktop/wasm/。

参考资料

[1]字节码联盟: https://bytecodealliance.org/。

[2]WebAssembly: https://webassembly.org/。

[3]Linux 容器的补充技术: https://www.docker.com/blog/why-containers-and-webassembly-work-well-together/。

[4]macOS Apple Silicon: https://dockr.ly/3sf56vH。

[5]macOS Intel: https://dockr.ly/3VF6uFB。

[6]Windows AMD64: https://dockr.ly/3ShlsP0。

[7]Linux Arm64 deb: https://dockr.ly/3TDcjRV。

[8]Linux AMD64 deb: https://dockr.ly/3TgpWH8。

[9]Linux AMD64 rpm: https://dockr.ly/3eG6Mvp。

[10]Linux AMD64 tar: https://dockr.ly/3yUhdCk

[11]WasmEdge: https://wasmedge.org/。

[12]路线图: https://github.com/docker/roadmap/issues/426。

责任编辑:姜华 来源: k8s技术圈
相关推荐

2022-06-15 12:48:14

WebAssemblDockerKubernetes

2014-11-17 09:54:35

云计算Docker

2021-06-11 07:49:01

Docker容器安全 应用程序

2023-10-11 06:50:32

Oracle数据库系统

2017-03-19 22:13:10

WebAssemblyJavaScript编程

2023-01-31 09:02:24

JSVMVR

2022-08-15 06:00:00

二进制编程语言

2023-05-05 17:20:04

2017-03-19 22:43:12

WebAssemblyJavaScript编程

2017-03-19 20:41:57

WebAssemblyJavaScript编程

2022-06-02 08:01:11

云原生工具

2023-12-10 16:48:00

Wasm浏览器

2009-04-16 16:31:04

数据转化数据集成SQL Server

2023-03-27 09:40:01

GoWebAssembl集成

2023-10-10 00:09:14

2023-03-27 13:25:18

WebAssembl语言Scheme

2021-06-11 09:00:00

语言WebWebAssembly

2022-06-22 10:04:29

JavaScriptRust语言

2023-10-27 08:00:00

Wasm开发操作系统

2021-03-30 13:48:47

WebAssemblyWeb浏览器编程语言
点赞
收藏

51CTO技术栈公众号