Wasm 工作負載(測試版)
測試版
Wasm 功能目前處於 測試版。建議您不要在生產環境中使用此功能,因為此功能可能會在將來的版本中發生更改或被刪除。
Wasm(WebAssembly 的縮寫)是您今天在 Docker 中使用的 Linux 和 Windows 容器(帶有一些 權衡)的快速、輕量級替代方案。
本頁提供有關在 Docker 中與 Linux 容器一起執行 Wasm 應用程式的新功能的資訊。
啟用 Wasm 工作負載
Wasm 工作負載需要 containerd 映象儲存 功能處於啟用狀態。如果您尚未使用 containerd 映象儲存,則現有映象和容器將無法訪問。
- 在 Docker Desktop 中導航到“設定”。
- 在“常規”選項卡中,選中“使用 containerd 拉取和儲存映象”。
- 轉到“開發中的功能”並選中“啟用 Wasm”選項。
- 選擇“應用並重啟”以儲存設定。
- 在確認對話方塊中,選擇“安裝”以安裝 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 資料庫。
克隆儲存庫。
$ 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 模組
建立一個 Dockerfile 來構建您的 Wasm 應用程式。
具體操作方法取決於您使用的程式語言。
在
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:無法解析執行時路徑
如果您使用的是不支援執行 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
程序。
- 解決方法:透過向它們傳送 SIGKILL(
- 推送至 Hub 可能會顯示錯誤
server message: insufficient_scope: authorization failed
,即使在使用 Docker Desktop 登入後也是如此- 解決方法:在 CLI 中執行
docker login
- 解決方法:在 CLI 中執行
反饋
感謝您嘗試使用 Docker 執行 Wasm 工作負載。透過 公共路線圖專案 上的 issue 跟蹤器提供反饋或報告您可能遇到的任何錯誤。