Wasm 工作負載(測試版)

測試版

Wasm 功能目前處於 測試版。我們建議您不要在生產環境中使用此功能,因為此功能可能會在未來的版本中變更或移除。

Wasm(WebAssembly 的縮寫)是您目前在 Docker 中使用的 Linux 和 Windows 容器的快速、輕量級替代方案(有一些取捨開啟 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/疑難排解章節 以尋求協助。

請注意此命令中使用的 --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. 在瀏覽器中開啟網址 http://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 功能,然後再試一次。

無法啟動 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 在中斷時可能無法完全退出
    • 解決方法:透過傳送 SIGKILL(`killall -9 docker-compose`)清除 `docker-compose` 程序。
  • 即使使用 Docker Desktop 登入後,推送至 Hub 可能仍會出現錯誤訊息 `server message: insufficient_scope: authorization failed`
    • 解決方法:在 CLI 中執行 `docker login`

意見回饋

感謝您試用 Docker 的 Wasm 工作負載。請透過公開路線圖項目 的問題追蹤器提供您的意見回饋或回報您可能發現的任何錯誤。