翻譯自科技紅人 Nigel Poulton 的博文 https://nigelpoulton。com/getting-started-with-docker-and-wasm/
輕鬆體驗 Docker + Wasm ——編寫一個應用,將其編譯為 Wasm,將其打包為 OCI 映象,將之儲存在 Docker Hub 中,再使用 Docker 執行。
Docker 最近釋出了支援 WebAssembly 的
Docker Desktop 技術預覽版[1]
。他們還宣佈了
Docker Hub 對 WebAssembly artifacts[2]
的支援。
因為我覺得 WebAssembly 非常有意思,所以我想我應該把它們都試一試,然後寫一篇文章來幫助其他同樣想體驗 Docker + Wasm 的人。
宏觀視角
WebAssembly (又稱 Wasm) 建立非常小、非常快的二進位制檔案,這些二進位制檔案在任何地方的安全沙箱中執行,只要有一個 WebAssembly Runtime。說實話……它們比容器
更小、更快、更安全,而且更加跨平臺—— 這話是我說的,我承認我是容器的超級粉絲。
關於體積大小的例子……Michael Yuan 最近
分享了有著完整的 HTTP 伺服器 + MySQL 客戶端“app伺服器”[3]
,只有 2MB!其他人也分享了 Size 更小的 Example。
無論如何,WebAssembly 正成為
雲原生領域的一件大事[4]
,而 Docker 也想在此有一席之地。
體驗 Docker 和 Wasm
我將一步一步帶領你編寫一個 hello world Wasm 應用,將其打包為 OCI 映象以及推送到 Docker Hub,並使用 Docker 執行它。如果你想跟我一起做,你需要做下面兩個準備,但如果你只是想閱讀,那也沒關係。
Docker Desktop
Rust 程式語言
可以從
此頁面[5]
上的連結安裝 Docker Desktop 技術預覽版,並從
這裡[6]
安裝 Rust。Docker Desktop 和 Rust 安裝後,我們將完成以下步驟:
配置 Rust 將程式碼編譯成 Wasm
編寫 app
將 app 編譯成 Wasm 二進位制檔案
將 app 打包成 OCI 映象
將映象推送到 Docker Hub
使用 Docker 執行 Wasm app
下文的所有任務都將使用命令列執行。你會需要 Docker Desktop 和 Rust 。
配置 Rust 將程式碼編譯成 Wasm
執行下面的
rustup
命令,安裝
wasm32-wasi target
。這樣 Rust 就可以將原始碼編譯成 Wasm 二進位制檔案。
rustup target add wasm32-wasi
如果你執行
rustup target list
,發現
wasm32-wasi (installed) 出現在列表裡,
Rust 就配置好了,你就可以建立這個app了。
寫 app
執行以下命令來構建一個簡單的 Rust app。它將建立一個簡單的 Hello World 應用
hello-docker/src/main。rs
。
cargo new hello-docker
檢查
hello-docker/src/main。rs
檔案並更改列印到螢幕上的文字。我更改為列印“Hello, Docker Hub!” 了。如下。
fn main() { println!(“Hello, Docker Hub!”);}
此時,Rust app 已編寫好,並可以編譯為 Wasm 二進位制檔案了。
將 app 編譯為一個 Wasm 二進位制碼
執行以下
cargo
命令將 Rust app 為
wasm32-wasi
二進位制檔案。這將建立一個 Wasm 位元組碼二進位制檔案,它可以在任何有 WebAssembly 執行時的系統上執行。
cargo
命令作為 Rust 的一部分已經安裝。它還知道在哪裡可以找到原始碼以及如何將其編譯為 Wasm 二進位制檔案。
cargo build ——target wasm32-wasi ——release
該命令將
hello-docker。wasm
Wasm 二進位制檔案輸出到
hello-docker/target/wasm32-wasi/release
資料夾中。
我們將在接下來的步驟中藉助 Docker 執行它。然而,在此之前,我們會將其構建到 OCI 映象中,以便它可以儲存在 Docker Hub 中並由 Docker 執行。
將 Wasm app 構建到 OCI 映象中
Docker 可以將 Wasm 模組打包到 OCI 映象中( Docker 映象的別名)。
現在執行此操作的方式感覺有點過時,我希望將來會有所改變。但是,你從一個臨時基礎映象開始,複製 Wasm 模組,並將程式設定為作為 Wasm 二進位制檔案執行。
以下的
Dockerfile
對此進行了描述。在你的當前目錄中建立它(你應該在你的
hello-docker
目錄中)。
FROM scratchCOPY 。/target/wasm32-wasi/release/hello-docker。wasm /hello-docker。wasmENTRYPOINT [ “hello-docker。wasm” ]
建立
Dockerfile[7]
後,執行以下命令來構建映象。該命令假定你與 Dockerfile 位於同一目錄中。
docker buildx build ——platform wasi/wasm32 -t docker-wasm:0。1 。
——platform wasi/wasm32
flag 將映象的目標作業系統設定為
wasi
並將目標架構設定為
wasm32
。
-t docker-wasm:0。1
標記/命名映象“docker-wasm:0。1”,最後的句點告訴 Docker 使用當前目錄中的 Dockerfile。
執行以下命令以驗證新映象是否存在。
docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEdocker-wasm 0。1 6b43e0bdf164 2 mins 501kB
此時 Wasm app 被打包在了一個 OCI 映象。
將 Wasm 應用推送到 Docker Hub
這是一個可選步驟。如果你不打算使用 Docker Hub,請跳過。但是,如果執行此步驟,則需要一個
Docker ID[8]
。它們是免費的,如果想認真學習和使用 Docker,它們就很重要。
執行以下命令以使用你自己的 Docker ID 標記映象,以便你可以將其推送到自己的 Docker Hub 儲存庫。我的 Docker ID 是 nigelpoulton,所以我將執行下面的命令。
docker image tag docker-wasm:0。1 nigelpoulton/docker-wasm:0。1
使用標記有你的 Docker ID 的映象,執行以下命令將其推送到 Docker Hub。請記住替換成自己的 Docker ID。我第一次嘗試時失敗了,我不得不執行手動
docker login
並再次執行命令。
docker image push nigelpoulton/docker-wasm:0。16b43e0bdf164: Pushed33b9d7fa88a0: Pushed4c601df9af6e: Pushed0。1: digest: sha256:6b43。。。31f8, size: 526
此時 Wasm 應用被打包為 OCI 映象並託管在 Docker Hub 上。注意
OS/ARCH
和
SIZE
欄位。
使用 Docker 執行 Wasm app
在撰寫本文時,你需要 Docker Desktop 的技術預覽版才能完成此步驟。你可以在
這篇文章[9]
中找到下載連結。
執行以下命令告訴 Docker 執行打包在 OCI 映象中的 Wasm app。為了可讀性,它是一個打包在多行上的單個命令。
docker container run ——rm ——name=dockerwasm \ ——runtime=io。containerd。wasmedge。v1 \ ——platform=wasi/wasm32 \ nigelpoulton/docker-wasm:0。1
flag 是 Docker 如何告訴
containerd[10]
使用
runwasi containerd shim[11]
,它使用
WasmEdge[12]
執行打包在映象中 Wasm 模組。
輸出如下。
Hello, Docker Hub!
恭喜。你成功使用 Docker 構建、共享和運行了 Wasm app!
總結
現在還是非常早期的階段,寫作本文時(2022 年 11 月),有些內容也許會過時。實現細節會有變化,一些 CLI flag 也會改變。例如,
——platform=wasi/wasm32
已經計劃更改為
wasi/wasm
。
然而,
方向很明確,並且能夠使用熟悉的 Docker 工具和技能去建立 WebAssembly app 是意義重大的
。
我也確信這只是 Docker 和 Wasm 的宏偉前景的很小一步!
參考資料
[1]
Docker Desktop 技術預覽版:
https://www。docker。com/blog/docker-wasm-technical-preview/
[2]
Docker Hub 對 WebAssembly artifacts:
https://www。docker。com/blog/announcing-docker-hub-oci-artifacts-support/
[3]
分享了有著完整的 HTTP 伺服器 + MySQL 客戶端“app伺服器”:
https://github。com/second-state/microservice-rust-mysql
[4]
雲原生領域的一件大事:
https://nigelpoulton。com/webassembly-the-future-of-cloud-computing/
[5]
此頁面:
https://www。docker。com/blog/docker-wasm-technical-preview/
[6]
這裡:
https://www。rust-lang。org/tools/install
[7]
Dockerfile:
https://docs。docker。com/engine/reference/builder/
[8]
Docker ID:
https://hub。docker。com/signup
[9]
這篇文章:
https://www。docker。com/blog/docker-wasm-technical-preview/
[10]
containerd:
https://containerd。io/
[11]
runwasi containerd shim:
https://github。com/second-state/runwasi
[12]
WasmEdge:
https://wasmedge。org/
猜你喜歡
- 2023-02-07“套路貸”涉黑組織終覆滅 曾致20餘名年輕被害人自殺、自殘、抑鬱、退學...
- 2023-02-04全球雲通訊平臺Infobip英富必首席商務官Ivan Ostojic:品牌自建app或已過時
- 2023-01-11卷瘋機圈,降噪45db,同軸雙動圈,金標 96K LDAC,三麥抗風噪,漫步者Lolli Pro2
- 2023-01-06河池警方萬里追擊,將這14人繩之以法
- 2022-12-31512G的手機儲存到底有多能裝?實測資料一看便知。