Chạy ngay Wasm trên Docker trong 5 phút
Chỉ cần Docker Desktop (v4.15+), anh em có thể chạy một ứng dụng WebAssembly (Wasm) nhanh hơn cả container Ubuntu hay Node.js. Đừng quá lo lắng về lý thuyết, hãy thử gõ ngay lệnh này vào terminal:
docker run --rm --runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm \
secondstate/rust-learning:hello
Kết quả hiện ra gần như tức thì. Với container truyền thống, Docker phải kéo image nặng hàng chục MB, khởi tạo namespace và mount filesystem mất vài giây. Ngược lại, Wasm khởi động trong tích tắc, thường chỉ dưới 10ms.
Để lệnh trên hoạt động, hãy vào Settings của Docker Desktop -> Features in development. Tại đây, anh em tích chọn Use containerd for pulling and storing images và Enable Wasm nhé.
Tại sao Docker lại cần WebAssembly?
Nhiều người hỏi mình: “Docker đang dùng tốt, tại sao phải nhét thêm Wasm vào làm gì cho rắc rối?”.
Câu trả lời nằm ở bài toán tối ưu tài nguyên. Mình từng làm hệ thống Microservices chạy Node.js cho một sàn e-commerce. Mỗi container tính thuế đơn giản cũng ngốn tới 200MB RAM. Khi traffic tăng vọt, server cạn kiệt RAM và sập hàng loạt dù CPU vẫn rảnh. Container truyền thống quá nặng nề vì phải vác theo cả một hệ điều hành rút gọn (OS primitives).
WebAssembly giải quyết triệt để vấn đề này:
- Kích thước cực gọn: Một file
.wasmthường chỉ từ vài chục KB đến 2MB. So với image Node.js 400MB, đây là một bước nhảy vọt. - Tốc độ thần tốc: Wasm không cần boot OS, nó thực thi trực tiếp trên runtime. Tốc độ khởi động nhanh gấp 10-100 lần container thông thường.
- Sandbox an toàn: Mặc định Wasm bị cô lập hoàn toàn. Nó không thể truy cập file hệ thống hay mạng trừ khi anh em cấp quyền qua giao diện WASI.
WasmEdge: “Động cơ” thực thi siêu nhẹ
Nếu Wasm là code đã biên dịch, thì WasmEdge chính là cái máy ảo để chạy đoạn code đó. Trong hệ sinh thái Docker, WasmEdge đóng vai trò là một runtime thay thế cho runc truyền thống.
Nhờ sự hợp tác giữa Docker và CNCF, giờ đây chúng ta có thể quản lý song song cả Linux container và Wasm container. Anh em vẫn dùng những câu lệnh quen thuộc như docker ps hay docker build mà không cần học lại từ đầu.
Thực hành: Build và Deploy app Wasm đầu tiên
Hãy cùng build một ứng dụng bằng Rust, biên dịch sang Wasm và đóng gói vào Docker. Đừng lo nếu anh em chưa biết Rust, các bước dưới đây rất dễ hiểu.
Bước 1: Khởi tạo project Rust
cargo new hello-wasm
cd hello-wasm
Mở file src/main.rs và sửa thành:
fn main() {
println!("Chào anh em, Wasm đang chạy trong Docker cực mượt!");
}
Bước 2: Biên dịch sang target WASI
Chúng ta cần thêm target wasm32-wasi để Rust biên dịch ra định dạng chuẩn cho server:
rustup target add wasm32-wasi
cargo build --target wasm32-wasi --release
Sau khi chạy, anh em sẽ có file hello-wasm.wasm tại thư mục target. Đây là tất cả những gì cần thiết để triển khai.
Bước 3: Dockerfile “không trọng lượng”
Dockerfile cho Wasm không cần FROM python hay FROM node. Chúng ta bắt đầu từ một image rỗng (scratch) để tối ưu dung lượng:
FROM scratch
COPY target/wasm32-wasi/release/hello-wasm.wasm /hello-wasm.wasm
ENTRYPOINT ["/hello-wasm.wasm"]
Bước 4: Build và Chạy
Khi build, anh em bắt buộc phải chỉ định platform là wasi/wasm:
docker buildx build --platform wasi/wasm -t my-wasm-app .
Và tận hưởng thành quả:
docker run --rm --runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm my-wasm-app
Kinh nghiệm thực tế: Đừng để “ăn hành”
Dù rất mạnh mẽ, nhưng khi đưa vào thực tế, anh em cần lưu ý 3 điểm mấu chốt sau:
1. Wasm không phải là “viên đạn bạc”
Đừng cố chuyển tất cả app sang Wasm. Nó cực tốt cho xử lý ảnh, video, tính toán nặng hoặc microservices nhỏ. Tuy nhiên, nếu app cần can thiệp sâu vào Kernel Linux hoặc dùng thư viện C-system phức tạp, Docker truyền thống vẫn là lựa chọn số một.
2. Rào cản Networking
Giao tiếp mạng trong môi trường WASI vẫn còn hạn chế. Không phải thư viện HTTP nào cũng chạy được ngay. Anh em nên ưu tiên các thư viện đã tối ưu cho WasmEdge như hyper-wasi để tránh lỗi runtime đáng tiếc.
3. Kỹ năng Debug mới
Quên lệnh docker exec -it bin/bash đi, vì Wasm container làm gì có hệ điều hành để anh em truy cập. Việc debug phụ thuộc hoàn toàn vào stdout/stderr. Hãy tập thói quen ghi log chuẩn xác và chi tiết hơn.
Lời kết
Wasm trên Docker đã đủ chín muồi để anh em đưa vào thực tế, không còn là lý thuyết suông. Sự kết hợp này giúp giải quyết triệt để bài toán chi phí tài nguyên cho Cloud Native và Edge Computing.
Hãy thử áp dụng Wasm cho các service nhỏ nhất trong hệ thống của anh em. Biết đâu, thay vì tốn 10 triệu tiền RAM mỗi tháng, anh em chỉ mất 1 triệu nhờ khả năng tối ưu vượt trội của Wasm?
Chúc anh em sớm làm chủ những container siêu nhẹ này!

