مقدمه
WebAssembly، که معمولاً بهاختصار Wasm نامیده میشود، اغلب بهعنوان موج سوم محاسبات ابری توصیف میشود که پس از ماشینهای مجازی و کانتینرها ظهور کرده است. اپلیکیشنهای Wasm در مقایسه با کانتینرهای سنتی لینوکسی، کوچکتر، سریعتر و قابلحملتر هستند، و داکر تکامل یافته تا از ساخت، اشتراکگذاری و اجرای آنها با همان ابزارهای آشنا پشتیبانی کند.
Wasm چیست
Wasm یک معماری ماشین مجازی است که زبانهای برنامهنویسی میتوانند به آن کامپایل شوند، بهجای هدف قرار دادن یک سیستمعامل و معماری CPU خاص مانند لینوکس روی ARM یا AMD. یک باینری Wasm در هر جایی که Wasm runtime در دسترس باشد قابل اجراست. Docker Desktop با چندین runtime از این نوع عرضه میشود، از جمله io.containerd.spin.v2، که به containerd امکان استقرار و مدیریت کانتینرهای Wasm — باینریهای Wasm در حال اجرا داخل کانتینرهای حداقلی scratch — را میدهد.
Wasm در حال حاضر در بارهای کاریای مانند inference هوش مصنوعی، توابع serverless، پلاگینها و محاسبات لبه (edge) عملکرد خوبی دارد، اما برای اپلیکیشنهایی با نیازهای سنگین I/O یا شبکهبندی پیچیده مناسب نیست — هرچند انتظار میرود این موضوع با بلوغ اکوسیستم بهبود یابد.
آمادهسازی محیط
کار با Wasm نیازمند Docker Desktop با فعال بودن ویژگی Wasm، Rust با نصب هدف کامپایل Wasm، و Spin، یک فریمورک برای ساخت و اجرای اپلیکیشنهای Wasm است. هدف Wasm برای Rust با دستور زیر اضافه میشود:
rustup target add wasm32-wasip1نوشتن یک اپلیکیشن Wasm
یک اپلیکیشن وب مبتنی بر Wasm جدید را میتوان با Spin ساخت:
spin new hello-world -t http-rustاین دستور یک اپلیکیشن ساده وب با Rust تولید میکند. پس از ویرایش متن پاسخ و کامپایل آن، Spin یک باینری .wasm تولید میکند:
spin buildباینری تولیدشده را میتوان پیش از کانتینری کردن، بهصورت محلی تست کرد:
spin upکانتینری کردن اپلیکیشن
بستهبندی یک اپلیکیشن Wasm بهعنوان ایمیج کانتینری همچنان از یک Dockerfile استفاده میکند، اما بر پایه ایمیج خالی scratch، زیرا اپلیکیشنهای Wasm به سیستمعامل لینوکس نیازی ندارند:
FROM scratch
COPY /target/wasm32-wasip1/release/hello_world.wasm .
COPY spin.toml .سپس ایمیج با فلگ پلتفرم مخصوص Wasm ساخته میشود:
docker build --platform wasi/wasm --provenance=false -t nigelpoulton/ddd-book:wasm .ایمیج حاصل ظاهر و رفتاری مانند یک ایمیج معمولی داکر دارد، فقط بهطور چشمگیری کوچکتر است — اغلب فقط چند صد کیلوبایت. این ایمیج را میتوان با دستور معمول docker push به Docker Hub یا هر رجیستری دیگر سازگار با OCI ارسال کرد.
اجرای یک کانتینر Wasm
اجرای اپلیکیشن کانتینریشده نیازمند مشخص کردن صریح runtime مخصوص Wasm است:
docker run -d --name wasm-ctr \
--runtime=io.containerd.spin.v2 \
--platform=wasi/wasm \
-p 5556:80 \
nigelpoulton/ddd-book:wasm /پس از اجرا، اپلیکیشن دقیقاً مانند هر سرویس وب کانتینریشده دیگری رفتار میکند و از طریق پورت نگاشتشده قابلدسترسی است.
نتیجهگیری
پشتیبانی داکر از Wasm به این معناست که توسعهدهندگان میتوانند دقیقاً از همان ابزارها — docker build، docker push، docker run و رجیستریهای استاندارد OCI — برای بستهبندی و توزیع اپلیکیشنهای Wasm استفاده کنند که پیشتر برای کانتینرهای سنتی به کار میبردند. با تداوم بلوغ اکوسیستم Wasm، این یکپارچگی داکر را در جایگاهی قرار میدهد که بتواند از هر دو مدل بهطور همزمان پشتیبانی کند و به تیمها اجازه دهد ابزار مناسب را برای هر بار کاری انتخاب کنند.