Wasm 工作負載

可用性: 測試版

WebAssembly (Wasm) 是 Linux 和 Windows 容器的快速、輕量級替代方案。藉助 Docker Desktop,您現在可以與傳統容器並行執行 Wasm 工作負載。

本頁提供了有關在 Docker 中與 Linux 容器並行執行 Wasm 應用程式的資訊。

提示

Docker Wasm 技術預覽版部落格文章 中瞭解有關 Wasm 用例和權衡的更多資訊。

開啟 Wasm 工作負載

Wasm 工作負載需要啟用 containerd 映象儲存 功能。如果您尚未使用 containerd 映象儲存,則無法訪問現有映象和容器。

  1. 導航到 Docker Desktop 中的 設定
  2. 通用 選項卡中,勾選 使用 containerd 拉取和儲存映象
  3. 轉到 開發中的功能 並勾選 啟用 Wasm 選項。
  4. 選擇 應用 儲存設定。
  5. 在確認對話方塊中,選擇 安裝 以安裝 Wasm 執行時。

Docker Desktop 下載並安裝以下執行時

  • 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

執行此命令後,您可以訪問 https://: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. 在瀏覽器中開啟 URL https://: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 功能並重試。

啟動 shim 失敗:無法解析執行時路徑

如果您使用的 Docker Desktop 版本較舊,不支援執行 Wasm 工作負載,您將看到類似以下錯誤訊息

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 在中斷時可能無法正常退出。作為變通方法,請透過傳送 SIGKILL (killall -9 docker-compose) 來清理 docker-compose 程序。
  • 即使在透過 Docker Desktop 登入後,推送到 Docker Hub 仍可能顯示錯誤 server message: insufficient_scope: authorization failed。作為變通方法,在 CLI 中執行 docker login