Wasm 工作負載

可用性: 測試版 (Beta)

WebAssembly (Wasm) 是一種比 Linux 和 Windows 容器更輕量、更快速的替代方案。透過 Docker Desktop,您現在可以讓 Wasm 工作負載與傳統容器並行執行。

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

提示

深入了解 Wasm 的使用案例與權衡考量,請參閱 Docker Wasm 技術預覽部落格文章

啟用 Wasm 工作負載

Wasm 工作負載需要開啟 containerd 映像檔儲存庫功能。如果您尚未啟用該功能,則無法存取現有的映像檔與容器。

  1. 前往 Docker Desktop 中的設定 (Settings)
  2. 一般 (General) 分頁中,勾選使用 containerd 來拉取與儲存映像檔 (Use containerd for pulling and storing images)
  3. 前往開發中功能 (Features in development) 並勾選啟用 Wasm (Enable Wasm) 選項。
  4. 選擇套用 (Apply) 以儲存設定。
  5. 在確認對話框中,選擇安裝 (Install) 來安裝 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
    

疑難排解

本節包含關於如何解決常見問題的說明。

指定的執行階段未知 (Unknown runtime specified)

如果您嘗試在未啟用 containerd 映像檔儲存庫的情況下執行 Wasm 容器,將會顯示類似以下的錯誤訊息:

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

開啟 containerd 功能於 Docker Desktop 設定中並重試。

啟動 shim 失敗:無法解析執行階段路徑 (Failed to start shim: failed to resolve runtime path)

如果您使用不支援執行 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 在中斷時可能無法正常退出。作為暫時解決方案,您可以透過發送 SIGKILL (killall -9 docker-compose) 來清除 docker-compose 程序。
  • 推送至 Docker Hub 時可能會出現 server message: insufficient_scope: authorization failed 錯誤,即使已透過 Docker Desktop 登入亦然。作為暫時解決方案,請在 CLI 中執行 docker login
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.