Wasm 工作负载 (Beta 版)

试用版

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

Wasm(WebAssembly 的缩写)是 Linux 和 您目前在 Docker 中使用的 Windows 容器(有一些权衡)。

本页提供了有关运行 Wasm 应用程序的新功能的信息 以及 Docker 中的 Linux 容器。

开启 Wasm 工作负载

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

  1. 导航到 Docker Desktop 中的设置
  2. General 选项卡中,选中 Use containerd for pull and store images
  3. 转到开发中的功能并选中 启用 Wasm 选项。
  4. 选择应用并重新启动以保存设置。
  5. 在确认对话框中,选择 Install (安装) 以安装 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

以下内容docker runcommand 在您的系统上启动一个 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 Binaries转换为机器指令的最后一步。

使用 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. 创建一个 Dockerfile 来构建您的 Wasm 应用程序。

    具体如何执行此作因您使用的编程语言而异。

  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建筑。构建 使此作在单个命令中轻松完成。

    $ 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 容器 store 中,则会显示类似于以下内容的错误:

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

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

Failed to start shim: 无法解析运行时路径

如果您使用不支持运行 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).
  • 推送到 Hub 可能会显示错误,指出server message: insufficient_scope: authorization failed,即使在记录后 使用 Docker Desktop
    • 解决方法:运行docker login在 CLI 中

反馈

感谢您使用 Docker 试用 Wasm 工作负载。提供反馈或举报任何 您可以通过 Public Roadmap 项上的 Issues Tracker 找到的 bug。