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

執行此命令後,您可以訪問 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. 建立一個 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 體系結構。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 程序。
  • 推送至 Hub 可能會顯示錯誤 server message: insufficient_scope: authorization failed,即使在使用 Docker Desktop 登入後也是如此
    • 解決方法:在 CLI 中執行 docker login

反饋

感謝您嘗試使用 Docker 執行 Wasm 工作負載。透過 公共路線圖專案 上的 issue 跟蹤器提供反饋或報告您可能遇到的任何錯誤。