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