Wasm 工作負載
WebAssembly (Wasm) 是 Linux 和 Windows 容器的快速、輕量級替代方案。藉助 Docker Desktop,您現在可以與傳統容器並行執行 Wasm 工作負載。
本頁提供了有關在 Docker 中與 Linux 容器並行執行 Wasm 應用程式的資訊。
提示在 Docker Wasm 技術預覽版部落格文章 中瞭解有關 Wasm 用例和權衡的更多資訊。
開啟 Wasm 工作負載
Wasm 工作負載需要啟用 containerd 映象儲存 功能。如果您尚未使用 containerd 映象儲存,則無法訪問現有映象和容器。
- 導航到 Docker Desktop 中的 設定。
- 在 通用 選項卡中,勾選 使用 containerd 拉取和儲存映象。
- 轉到 開發中的功能 並勾選 啟用 Wasm 選項。
- 選擇 應用 儲存設定。
- 在確認對話方塊中,選擇 安裝 以安裝 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 資料庫。
克隆倉庫。
$ 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.
導航到克隆的專案並使用 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,
在瀏覽器中開啟 URL
https://:8090
並建立一些示例訂單。所有這些都與 Wasm 伺服器進行互動。完成所有操作後,在啟動應用程式的終端中按
Ctrl+C
以關閉所有內容。
構建並推送 Wasm 模組
建立一個構建 Wasm 應用程式的 Dockerfile。
具體操作因您使用的程式語言而異。
在
Dockerfile
的單獨階段中,提取模組並將其設定為ENTRYPOINT
。# syntax=docker/dockerfile:1 FROM scratch COPY --from=build /build/hello_world.wasm /hello_world.wasm ENTRYPOINT [ "/hello_world.wasm" ]
構建並推送指定
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