Rust:WASM-Docker
WebAssembly (WASM) 是一種用於基於堆棧的虛擬機的二進制指令格式,其設計宗旨是快速高效。它是一種底層的類似程序指令集的語言,運行在瀏覽器中,並提供了一種以接近本機速度執行代碼的方法。所有主要的 web 瀏覽器都支持 WASM,包括 Chrome、Firefox、Safari 和 Edge。
WebAssembly 系統接口 (WASI) 是一個允許 WebAssembly 代碼訪問底層操作系統和文件系統的接口。它爲 WebAssembly 模塊提供了一組標準化的系統調用,以便與宿主環境進行交互。這允許 WebAssembly 代碼在後端運行。
可以簡單類比爲,如果 WASM 是 JavaScript, WASI 就是 Node.js。
WASM 的另一個重要方面是它與語言無關,這意味着用各種編程語言 (如 Rust、C++ 或 C) 編寫的代碼可以編譯爲 WASM 並在瀏覽器中運行。這爲開發人員構建 web 應用程序提供了更多的選擇,並允許他們利用不同語言的優勢。
在這篇文章中,我們將使用 Rust 創建一個 Hello World 應用程序,將其編譯成 WASM 二進制文件,並使用 Docker Desktop 運行它。
創建項目
創建一個新的 Rust 項目:
cargo new hello-wasm
在 src/main.rs 中已經有了如下代碼:
fn main() {
println!("Hello, world!");
}
執行 cargo build,這將創建一個二進制文件並將其放在 target/debug 下。你可以直接執行:
./target/debug/hello-wasm
這個二進制文件是爲你的機器構建的,並且依賴於平臺。
構建 WASM 二進制文件
現在,要爲 WASM 運行時構建項目,我們需要添加一個新目標:
rustup target add wasm32-wasi
然後我們可以在 build 命令中使用這個目標:
cargo build --target wasm32-wasi
這個命令將創建 WASM 二進制文件,並將其放在 target/wasm32-wasi 目錄下:
target
├── CACHEDIR.TAG
├── debug
│ ├── build
│ ├── deps
│ ├── examples
│ ├── hello-wasm
│ ├── hello-wasm.d
│ └── incremental
└── wasm32-wasi
├── CACHEDIR.TAG
└── debug
├── build
├── deps
├── examples
├── hello-wasm.d
├── hello-wasm.wasm
└── incremental
創建 Docker Image
請注意,這目前是一個預覽功能,僅在 Docker Desktop 上可用。爲了能夠在 Docker Desktop 中構建或運行 WASM 容器,首先需要從設置中啓用 “容器提取和存儲功能”。
首先,創建一個 Dockerfile,內容如下:
# syntax=docker/dockerfile:1
FROM scratch
COPY ./target/wasm32-wasi/debug/hello-wasm.wasm /hello.wasm
ENTRYPOINT [ "hello.wasm" ]
現在使用以下命令構建它:
docker buildx build --platform wasi/wasm32 -t hello-wasm .
讓我們檢查一下當前可用的 Docker 映像:
$ docker image ls
hello-wasm latest e2f29c7ab88a 2 minutes ago 520kB
創建的映像大小爲半兆字節。我們使用以下命令來運行它:
docker run \
--runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm32 \
hello-wasm
執行結果:
Hello, world!
WebAssembly 提供了接近本地的性能,並且是平臺獨立的。Docker Desktop 帶有 WasmEdge 運行時,允許將 WASM 應用程序包裝到 Docker 容器中,並可能在 Docker Compose 設置中與非 WASM 容器一起運行。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ugYd1RMlEg424lc836dIMw