Wasm 工作負載
WebAssembly (Wasm) 是一種比 Linux 和 Windows 容器更輕量、更快速的替代方案。透過 Docker Desktop,您現在可以讓 Wasm 工作負載與傳統容器並行執行。
本頁提供關於如何在 Docker 中與 Linux 容器並行執行 Wasm 應用程式的相關資訊。
提示深入了解 Wasm 的使用案例與權衡考量,請參閱 Docker Wasm 技術預覽部落格文章。
啟用 Wasm 工作負載
Wasm 工作負載需要開啟 containerd 映像檔儲存庫功能。如果您尚未啟用該功能,則無法存取現有的映像檔與容器。
- 前往 Docker Desktop 中的設定 (Settings)。
- 在一般 (General) 分頁中,勾選使用 containerd 來拉取與儲存映像檔 (Use containerd for pulling and storing images)。
- 前往開發中功能 (Features in development) 並勾選啟用 Wasm (Enable Wasm) 選項。
- 選擇套用 (Apply) 以儲存設定。
- 在確認對話框中,選擇安裝 (Install) 來安裝 Wasm 執行階段。
Docker Desktop 將下載並安裝以下執行階段:
io.containerd.slight.v1io.containerd.spin.v2io.containerd.wasmedge.v1io.containerd.wasmtime.v1io.containerd.lunatic.v1io.containerd.wws.v1io.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
疑難排解
本節包含關於如何解決常見問題的說明。
指定的執行階段未知 (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。