新聞中心
docker + WebAssembly 集成簡(jiǎn)介
作者:k8s技術(shù)圈 2022-10-28 16:57:18
云計(jì)算
云原生 WebAssembly,通常簡(jiǎn)稱為 Wasm,是一種相對(duì)較新的技術(shù),它允許你編譯用 40 多種語(yǔ)言(包括 Rust、C、C++、JavaScript 和 Golang)編寫的應(yīng)用程序代碼,并在沙盒環(huán)境中運(yùn)行它。

Docker+Wasm 的技術(shù)預(yù)覽版現(xiàn)在已經(jīng)發(fā)布了,Wasm 最近引起了很多轟動(dòng),該功能將使你更容易快速構(gòu)建針對(duì) Wasm 運(yùn)行時(shí)的應(yīng)用程序。
作為本次發(fā)布的一部分,我們也很高興地宣布 Docker 將作為投票成員加入字節(jié)碼聯(lián)盟[1],字節(jié)碼聯(lián)盟是一個(gè)非營(yíng)利組織,致力于在 WebAssembly 和 WebAssembly 系統(tǒng)接口(WASI)等標(biāo)準(zhǔn)的基礎(chǔ)上,創(chuàng)建安全的新軟件基礎(chǔ)。
什么是 Wasm?
WebAssembly[2],通常簡(jiǎn)稱為 Wasm,是一種相對(duì)較新的技術(shù),它允許你編譯用 40 多種語(yǔ)言(包括 Rust、C、C++、JavaScript 和 Golang)編寫的應(yīng)用程序代碼,并在沙盒環(huán)境中運(yùn)行它。
最初的用例主要是在 Web 瀏覽器中運(yùn)行本地代碼,例如 Figma、AutoCAD 和 Photoshop。而實(shí)際上,fastq.bio 將其基于 Web 的 DNA 序列質(zhì)量分析儀轉(zhuǎn)換為 Wasm 時(shí),速度提高了 20 倍。迪士尼在 Wasm 之上構(gòu)建了他們的 Disney+ 應(yīng)用程序開發(fā)工具包。瀏覽器的好處是顯而易見的。
但是由于 WebAssembly 系統(tǒng)接口(WASI)的存在,Wasm 正在迅速向?yàn)g覽器之外擴(kuò)展,Vercel、Fastly、Shopify 和 Cloudflare 等公司支持使用 Wasm 在邊緣運(yùn)行代碼,而 Fermyon 正在構(gòu)建一個(gè)平臺(tái),以在云上運(yùn)行 Wasm 微服務(wù)。
為什么是 Docker?
在 Docker,我們的目標(biāo)是通過(guò)克服應(yīng)用程序開發(fā)的復(fù)雜性,來(lái)幫助開發(fā)人員將他們的想法變?yōu)楝F(xiàn)實(shí)。無(wú)論底層技術(shù)如何,我們都努力使構(gòu)建、共享和運(yùn)行你的應(yīng)用程序變得更容易。通過(guò)讓所有人都可以使用容器,我們證明了我們有能力讓開發(fā)者的生活更輕松,并被公認(rèn)為是第一大最受喜愛的開發(fā)者工具。
我們將 Wasm 視為 Linux 容器的補(bǔ)充技術(shù)[3],開發(fā)人員可以根據(jù)使用情況選擇使用哪種技術(shù)(或兩者都使用?。kS著社區(qū)探索 Wasm 的可能性,我們希望幫助使 Wasm 應(yīng)用程序更容易開發(fā)、構(gòu)建和運(yùn)行,使用你所熟悉和喜愛的經(jīng)驗(yàn)和工具。
如何獲取預(yù)覽版?
你是否已經(jīng)準(zhǔn)備好開始來(lái)親自嘗試了嗎?很好!但在此之前,你需要記住幾個(gè)注意事項(xiàng):
- 重要事項(xiàng) #1:這是 Docker Desktop 的技術(shù)預(yù)覽版本,可能無(wú)法按預(yù)期工作,請(qǐng)務(wù)必在繼續(xù)之前備份你的容器和鏡像。
- 重要事項(xiàng) #2:該預(yù)覽版啟用了 containerd 鏡像存儲(chǔ),并且不能被禁用。如果您當(dāng)前未使用 containerd 鏡像存儲(chǔ),則將無(wú)法訪問(wèn)預(yù)先存在的鏡像和容器。
你可以在下面下載 Docker Desktop 的技術(shù)預(yù)覽版本:
- macOS Apple Silicon[4]
- macOS Intel[5]
- Windows AMD64[6]
- Linux Arm64 (deb[7])
- Linux AMD64 (deb[8], rpm[9], tar[10])
是否有一些限制?
是的!這是一個(gè)早期的技術(shù)預(yù)覽版本,我們?nèi)栽谂κ贵w驗(yàn)盡可能流暢,但這里有一些你應(yīng)該注意的事情:
- 當(dāng)中斷時(shí),Docker Compose 可能無(wú)法干凈退出。
- 解決方法:通過(guò)向 docker-compose 進(jìn)程發(fā)送SIGKILL(killall -9 docker-compose)來(lái)清理它們。
- 推送到 Hub 可能會(huì)出現(xiàn)錯(cuò)誤,類似于這樣的錯(cuò)誤信息server message: insufficient_scope: authorization failed,即使在使用 Docker Desktop 登錄后也是如此。
-
解決方法:在 CLI 中運(yùn)行 docker login。
使用
首先,我們需要提醒你,由于這是一個(gè)技術(shù)預(yù)覽,事情可能會(huì)很快發(fā)生變化,但這是它目前的工作方式。
- 我們正在利用我們最近的工作,將鏡像管理遷移到 containerd,因?yàn)樗峁┝耸褂门c OCI 兼容的工件和 containerd shims 的能力。
- 我們與WasmEdge[11] 合作創(chuàng)建了一個(gè) containerd shim。此 shim 從 OCI 工件中提取 Wasm 模塊并使用 WasmEdge 運(yùn)行時(shí)運(yùn)行它。
- 我們添加了對(duì)聲明 Wasm 運(yùn)行時(shí)的支持,這將允許使用這個(gè)新的 shim。
使用 docker run 啟動(dòng) Wasm 應(yīng)用
安裝預(yù)覽版后,我們可以運(yùn)行以下命令來(lái)啟動(dòng)一個(gè) Wasm 示例應(yīng)用程序:
$ docker run -dp 8080:8080 --name=wasm-example --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 michaelirwin244/wasm-example
可以看到有一些參數(shù)可能不是很熟悉,讓我們來(lái)解釋下它們的作用。
- --runtime=io.containerd.wasmedge.v1 - 這會(huì)通知 Docker 引擎,我們要使用 Wasm containerd shim,而不是標(biāo)準(zhǔn)的 Linux 容器運(yùn)行時(shí)
- --platform=wasi/wasm32 – 這指定了我們要使用的鏡像的架構(gòu),通過(guò)利用 Wasm 架構(gòu),我們不需要為不同的架構(gòu)構(gòu)建單獨(dú)的鏡像,Wasm 運(yùn)行時(shí)將做最后一步,將 Wasm 二進(jìn)制文件轉(zhuǎn)換為機(jī)器指令。
拉取鏡像后,運(yùn)行時(shí)讀取鏡像的 ENTRYPOINT 來(lái)定位并提取 Wasm 模塊。然后該模塊被加載到 Wasm 運(yùn)行時(shí)中,啟動(dòng)并配置網(wǎng)絡(luò)?,F(xiàn)在我們的機(jī)器上運(yùn)行了一個(gè) Wasm 應(yīng)用程序!
該示例應(yīng)用是一個(gè)簡(jiǎn)單的 Web 服務(wù)器,它會(huì)顯示 Hello world! 并將數(shù)據(jù)回顯給我們,為了驗(yàn)證它是否正常工作,讓我們首先查看日志。
$ docker logs wasm-example
Server is now running
我們可以通過(guò)打開 http://localhost:8080 或使用 curl 來(lái)獲取 Hello world 消息。
$ curl localhost:8080
Hello world from Rust running with Wasm! Send POST data to /echo to have it echoed back to you
將數(shù)據(jù)發(fā)送到 echo 端點(diǎn),我們可以使用 curl 命令:
$ curl localhost:8080/echo -d '{"message":"Hi there"}' -H "Content-type: application/json"
{"message":"Hi there"}要?jiǎng)h除應(yīng)用程序,可以像執(zhí)行任何其他 Docker 服務(wù)一樣刪除它:
$ docker rm -f wasm-example
新的集成意味著你可以在 Linux 容器旁邊運(yùn)行 Wasm 應(yīng)用程序(甚至使用 Compose)。
使用 Compose 啟動(dòng) Wasm 應(yīng)用
同樣的我們也可以使用 Docker Compose 來(lái)運(yùn)行 Wasm 應(yīng)用,如下所示的 Compose 文件:
services:
app:
image: michaelirwin244/wasm-example
platform: wasi/wasm32
runtime: io.container.wasmedge.v1
ports:
- 8080:8080
然后使用如下所示的命令即可啟動(dòng)該應(yīng)用:
$ docker compose up
使用 Wasm 運(yùn)行多服務(wù)應(yīng)用程序
網(wǎng)絡(luò)的工作方式與你對(duì) Linux 容器的預(yù)期相同,讓你可以靈活地將 Wasm 應(yīng)用與其他容器化工作負(fù)載(例如數(shù)據(jù)庫(kù))組合在單個(gè)應(yīng)用程序堆棧中。
在以下示例中,Wasm 應(yīng)用程序利用了在容器中運(yùn)行的 MariaDB 數(shù)據(jù)庫(kù)。
- Clone 示例倉(cāng)
$ 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.
- 導(dǎo)航到項(xiàng)目根目錄并使用 Docker Compose 啟動(dòng)項(xiàng)目。
$ 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
在另一個(gè)終端中,我們可以看到創(chuàng)建的 Wasm 鏡像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
server latest 2c798ddecfa1 2 minutes ago 3MB
檢查鏡像顯示鏡像是否具有 wasi/wasm32 平臺(tái),操作系統(tǒng)和架構(gòu)的組合。
$ docker image inspect server | grep -A 3 "Architecture"
"Architecture": "wasm32",
"Os": "wasi",
"Size": 3001146,
"VirtualSize": 3001146,
- 在http://localhost:8090 打開網(wǎng)站并創(chuàng)建一些示例訂單,所有這些都是與 Wasm 服務(wù)器交互。
- 完成后,在你啟動(dòng)應(yīng)用程序的終端中按 Ctrl+C 將所有內(nèi)容刪除。
構(gòu)建和推送 Wasm 模塊
- 創(chuàng)建一個(gè)構(gòu)建 Wasm 應(yīng)用程序的 Dockerfile,當(dāng)然這取決于你使用的語(yǔ)言。
- 在 Dockerfile 的單獨(dú)階段中,提取模塊并將其設(shè)置為ENTRYPOINT。
FROM scratch
COPY --from=build /build/hello_world.wasm /hello_world.wasm
ENTRYPOINT [ "hello_world.wasm" ]
- 構(gòu)建并推送指定wasi/wasm32 架構(gòu)的鏡像,Buildx 使這在單個(gè)命令中變得容易。
$ docker buildx build --platform wasi/wasm32 -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
Wasm 和 Docker 的下一步
Wasm 正在快速成長(zhǎng)和發(fā)展,包括探索如何支持多線程、垃圾收集等。還有許多仍待解決的問(wèn)題,包括縮短開發(fā)人員反饋循環(huán)和可能的生產(chǎn)路徑。
參考鏈接
- https://www.docker.com/blog/docker-wasm-technical-preview/。
- https://docs.docker.com/desktop/wasm/。
參考資料
[1]字節(jié)碼聯(lián)盟: https://bytecodealliance.org/。
[2]WebAssembly: https://webassembly.org/。
[3]Linux 容器的補(bǔ)充技術(shù): https://www.docker.com/blog/why-containers-and-webassembly-work-well-together/。
[4]macOS Apple Silicon: https://dockr.ly/3sf56vH。
[5]macOS Intel: https://dockr.ly/3VF6uFB。
[6]Windows AMD64: https://dockr.ly/3ShlsP0。
[7]Linux Arm64 deb: https://dockr.ly/3TDcjRV。
[8]Linux AMD64 deb: https://dockr.ly/3TgpWH8。
[9]Linux AMD64 rpm: https://dockr.ly/3eG6Mvp。
[10]Linux AMD64 tar: https://dockr.ly/3yUhdCk
[11]WasmEdge: https://wasmedge.org/。
[12]路線圖: https://github.com/docker/roadmap/issues/426。
本文題目:Docker+WebAssembly集成簡(jiǎn)介
新聞來(lái)源:http://fisionsoft.com.cn/article/dpicess.html


咨詢
建站咨詢
