WebAssembly + Docker
WebAssembly konteinerid on üks kõige uuemaid trende pilvetehnoloogias. Järgnevas õpetuses katsetame uut laadi konteineri püstitada ning ise ehitada, seletades järk-järgult erinevusi ja eeliseid.
Paigaldus
Ettevalmistus
-
Paigalda ja tee lahti Docker Desktop
-
Lülita sisse uue WebAssembly konteineri toetused (vt pildid)
NB! Tehnoloogia uudsuse tõttu võib teine samm olla ebavajalik, kuna siin me lülitame sisse Beta funktsiooni, mis tulevikus on suure tõenäosusega avaldatud kõigile.
Docker on nüüd valmis käsitlema WebAssembly konteinerid. Arvuti restart ei ole vajalik.
Kiire katsetus
Paigaldame läbi käsurea ametliku WebAssembly konteineri näidise.
- Terminalis sisesta järgmise käsu:
docker run -dp 8080:8080 \
--name=wasm-example \
--runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm32 \
michaelirwin244/wasm-example
Antud käsk koostab ja käivitab uue veebiteenuse, mis hakkab elama arvutis 8080 portis.
--name=wasm-example
kirjeldab konteineri nime.--runtime=io.containerd.wasmedge.v1
ütleb Dockerile, et tahetakse kasutada WebAssembly käivituskeskkonna. Vaikimisi kaustatakse Linux konteineri.--platform=wasi/wasm32
ütleb, mis platformi väljastatud teenus sihib.michaelirwin244/wasm-example
on ametlik WASM konteineri näidis, mida tõmmatakse Docker Hubist.
- Lähme brauseris
localhost:8080
aadressile.
Kõik on õige, kui saab aadressilt vastuse!
Teenuse taga jookseb Rustis kirjutatud veebiserver, mida kompileeriti WebAssemblisse. Serveeritud lehekülg on järgneva veebiserveri vastus. Nii saab tekitada lihtsad ja skaleerituvad mikroteenused WebAssembly konteineritena.
Teenuse lõpetamiseks käivita järgmise käsu käsurealt:
docker stop wasm-example
Ehitame ise konteineri
Järgnevas peatükis ehitame täiesti eraldiseisva WebAssembly konteineri, mis käivitab lihtsa Rustis kirjutatud WebAssembly mooduli.
Koodi kirjutamiseks saab kasutada oma soovitud koodiredaktoriks. Kui seda ei ole, siis soovitusena saab kasutada Visual Studio Code koos rust-analyzer laiendiga.
Rusti paigaldus
Rusti on võimalik paigaldada Linuxil, Windowsil ja Macil. Windowsil on võimalik
Windows, Linuxi ja Maci kõige värskemad paigaldusjuhendid asuvad siin.
Linux või Windows (WSL)
Linuxiga või WSL-iga saab paigaldada järgmise terminali käsuga (Windows Subsystem for Linux):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Uuenda süsteemi $PATH
muutuja, et Rusti tööriistad töötaksid olevas terminalis.
source "$HOME/.cargo/env"
Seejärel veendu, et Rust on paigaldatud:
rustc --version
Installeerime WebAssembly käivituskeskkonna sihi (runtime target), et saaks rakenduse hiljem kompileerida WebAssembly koodiks.
rustup target add wasm32-wasi
WebAssembly rakendus Dockeris
Koostame uue Rust projekti
- Tekitame uue Rusti projekti
Projekti tekitamiseks jaoks kasutame cargo
pakettihaldajat.
cargo new docker-wasm
- Lähme tekitatud kataloogi sisse
cd docker-wasm
- Muudame src/main.rs faili.
Siin väga palju ei muuda - kirjutame väljundiks soovitud teksti:
fn main() {
println!("Tere läbi Dockeri!");
}
- Kompileerime ja käivitame
cargo build && ./target/debug/docker-wasm
- Kompileerime WebAssembliks
cargo build --target wasm32-wasi
Docker konteiner
Siin me koostame Docker konteineri, mis jooksutab meie näidisrakenduse. Siin toimub kõik standardselt ja sarnaselt tavalise Docker konteineri koostamisel.
- Tekitame Dockerfile-i
FROM scratch
COPY ./target/wasm32-wasi/debug/docker-wasm.wasm /docker-wasm.wasm
ENTRYPOINT [ "docker-wasm.wasm" ]
Seletus:
FROM scratch
- scratch on reserveeritud Dockeri võtmesõna, mis ütleb, et alustame konteineri nullist. Traditsiooniliselt siin oleks võimalik kasutada näiteks ubuntu või openjdk Java rakenduste jaoks, kuid siin me teeme täiesti minimaalse WebAssembly konteineri.
COPY ./target/wasm32-wasi/debug/docker-wasm.wasm /docker-wasm.wasm
- kopeerime meie kompileeritud .wasm failid konteinerisse.
ENTRYPOINT [ "docker-wasm.wasm" ]
- see ütleb, et konteineri käivitamisel pannakse käima meie .wasm faili.
Siin nüüd leidub esimene erinevus tavaliste Docker konteineritega võrreldes - tavaliselt selle .wasm faili ei oleks võimalik niisama käivitada.
- Ehitame konteineri
docker build -name docker-wasm --platform wasi/wasm32 -t hello-wasm .
Siin leidub teine erinevus: Me ütleme Dockerile, et selle konteineri käivitusplatform on WebAssembly.
- Jooksutame konteineri
docker run --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 docker-wasm
Lõpuks tuleb välja ka kolmas erinevus: Siin määrame nii käivituskeskkonna kui ka käivitusplatformi. Selle eelis on see, et iga platformi jaoks (x86, arm jne) ei ole vaja eraldi ehitada eraldiseisva konteineri. See tähendab, et jagatud konteineri saab jooksutada nii traditsioonilise x86 protsessoriga Windowsis, Linuxis ja Macis, uutes Apple Silicon Mac masinates ja ka näiteks Raspberry Pi mikromasinates.
Väljundiks peaks tulema eelnevas peatükkis kirjutatud sõnum. Õpetuse juhul:
Tere läbi Dockeri!
Kokkuvõte
See oli lihtne näide, kuid ideaalis on WebAssembly konteinerid väiksed mikroteenused, mis ka päriselt teevad midagi - kasvõi veebiteenusena. Selleks peaks kasutusele võtma Rustis kirjuattud reaalse HTTP serveri sõltuvusi (või ise kirjutama), et seda ka saavutada.
Kui käivitad järgmise käsu:
docker image ls
Siin võib märgata meie konteineri väikse suuruse. Paigalduse käigul katsetatud ametlik näide on ainult poolteist megabaiti. Enda ehitatud väike näide on natuke üle megabaiti. Kui juhuslikult juba olid mõned Dockeri teenused paigaldatud, siis enamus neist on üle 100 megabaiti. Võrdluseks võib tuua node-alpine
konteineri, mis on minifitseeritud NodeJs-iga konteiner - ta on ikkagi üle 100 megabaiti.
Kuna tegemist on Dockeriga, siis mängu saab tulla ka docker compose, et kombineerida mitu teenust kokku.
Näiteks, samalaadne ametlik konteineri näide docker-compose.yaml
failina, kuhu on võimalik panna kõrvale näiteks andmebaasi teenuse:
services:
app:
image: michaelirwin244/wasm-example
platform: wasi/wasm32
runtime: io.containerd.wasmedge.v1
ports:
- 8080:8080
Huvilistele
Uuri lähtekoodi, kuidas püstitati Rusti baasil lihtsa HTTP serveri ja serveeriti masinõppe mudeli:
Allikad
Materjal loodud järgnevate allikate põhjal: