Wasm 工作负载(测试版)

贝塔

Wasm 功能目前处于 测试阶段。我们建议您不要在生产环境中使用此功能,因为此功能可能会更改或从未来版本中删除。

Wasm(WebAssembly 的缩写)是您目前在 Docker 中使用的 Linux 和 Windows 容器的快速、轻型替代方案(需要进行 一些权衡)。

本页面提供了有关在 Docker 中与 Linux 容器一起运行 Wasm 应用程序的新功能的信息。

开启 Wasm 工作负载

Wasm 工作负载需要 打开containerd 镜像存储功能。如果您尚未使用 containerd 映像存储,则将无法访问预先存在的映像和容器。

  1. 导航到Docker Desktop 中的设置。
  2. “常规”选项卡中,选中“使用 containerd 来拉取和存储图像”
  3. 转到开发中的功能并选中启用Wasm选项。
  4. 选择应用并重新启动以保存设置。
  5. 在确认对话框中,选择安装以安装 Wasm 运行时。

Docker Desktop 下载并安装以下可用于运行 Wasm 工作负载的运行时:

  • io.containerd.slight.v1
  • io.containerd.spin.v2
  • io.containerd.wasmedge.v1
  • io.containerd.wasmtime.v1
  • io.containerd.lunatic.v1
  • io.containerd.wws.v1
  • io.containerd.wasmer.v1

使用示例

使用 docker run 运行 Wasm 应用程序

以下docker run命令在您的系统上启动 Wasm 容器:

$ docker run \
  --runtime=io.containerd.wasmedge.v1 \
  --platform=wasi/wasm \
  secondstate/rust-example-hello

运行此命令后,您可以访问 http://localhost:8080/以查看此示例模块的“Hello world”输出。

如果您收到错误消息,请参阅 故障排除部分以获取帮助。

请注意此命令中使用的--runtime和标志:--platform

  • --runtime=io.containerd.wasmedge.v1:通知 Docker 引擎您想要使用 Wasm containerd shim 而不是标准的 Linux 容器运行时
  • --platform=wasi/wasm:指定要使用的镜像的架构。通过利用 Wasm 架构,您无需为不同的机器架构构建单独的映像。 Wasm 运行时负责将 Wasm 二进制文件转换为机器指令的最后一步。

使用 Docker Compose 运行 Wasm 应用程序

可以使用以下 Docker Compose 文件运行相同的应用程序:

services:
  app:
    image: secondstate/rust-example-hello
    platform: wasi/wasm
    runtime: io.containerd.wasmedge.v1

使用普通的 Docker Compose 命令启动应用程序:

$ docker compose up

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

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

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

  1. 克隆存储库。

    $ 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.
    
  2. 导航到克隆的项目并使用 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
    

    如果您docker image ls从另一个终端窗口运行,您可以在镜像存储中看到 Wasm 镜像。

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

    检查图像显示图像有一个wasi/wasm平台,操作系统和架构的组合:

    $ docker image inspect server | grep -A 3 "Architecture"
            "Architecture": "wasm",
            "Os": "wasi",
            "Size": 3001146,
            "VirtualSize": 3001146,
    
  3. 在浏览器中打开 URLhttp://localhost:8090并创建一些示例订单。所有这些都与 Wasm 服务器交互。

  4. 完成后,通过点击Ctrl+C启动应用程序的终端来拆除所有内容。

构建并推送 Wasm 模块

  1. 创建一个用于构建 Wasm 应用程序的 Dockerfile。

    具体如何执行此操作取决于您使用的编程语言。

  2. 在您的单独阶段中Dockerfile,提取模块并将其设置为ENTRYPOINT.

    # syntax=docker/dockerfile:1
    FROM scratch
    COPY --from=build /build/hello_world.wasm /hello_world.wasm
    ENTRYPOINT [ "/hello_world.wasm" ]
  3. 构建并推送指定架构的镜像wasi/wasm。 Buildx 使这可以通过单个命令轻松完成。

    $ docker buildx build --platform wasi/wasm -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
    

故障排除

本节包含有关如何解决常见问题的说明。

指定的运行时未知

如果您在选择使用 containerd 映像存储之前尝试运行 Wasm 容器,则会显示类似于以下内容的错误:

docker: Error response from daemon: Unknown runtime specified io.containerd.wasmedge.v1.

在 Docker Desktop 设置中打开 containerd 功能 ,然后重试。

无法启动垫片:无法解析运行时路径

如果您使用不支持运行 Wasm 工作负载的旧版本 Docker Desktop,您将看到类似以下内容的错误消息:

docker: Error response from daemon: failed to start shim: failed to resolve runtime path: runtime "io.containerd.wasmedge.v1" binary not installed "containerd-shim-wasmedge-v1": file does not exist: unknown.

将您的 Docker Desktop 更新到最新版本,然后重试。

已知的问题

  • Docker Compose 在中断时可能无法干净退出
    • docker-compose解决方法:通过向进程发送 SIGKILL ( )来清理进程killall -9 docker-compose
  • server message: insufficient_scope: authorization failed即使使用 Docker Desktop 登录后,推送到 Hub 也可能会出现错误提示
    • 解决方法:docker login在 CLI 中运行

反馈

感谢您使用 Docker 尝试 Wasm 工作负载。通过公共路线图项目上的问题跟踪器提供反馈或报告您可能发现的任何错误 。