Run Wasm on Docker in 5 Minutes
With just Docker Desktop (v4.15+), you can run WebAssembly (Wasm) applications faster than Ubuntu or Node.js containers. Don’t worry too much about the theory; try running this command in your terminal right now:
docker run --rm --runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm \
secondstate/rust-learning:hello
The result appears almost instantly. With traditional containers, Docker has to pull images weighing tens of MBs, initialize namespaces, and mount filesystems, which takes several seconds. In contrast, Wasm starts in a heartbeat, typically in under 10ms.
To make the command above work, go to Docker Desktop Settings -> Features in development. There, check Use containerd for pulling and storing images and Enable Wasm.
Why Does Docker Need WebAssembly?
Many people ask me: “Docker is working fine, why bother adding Wasm into the mix?”
The answer lies in resource optimization. I once worked on a Node.js Microservices system for an e-commerce platform. Even a simple tax calculation container consumed 200MB of RAM. When traffic spiked, servers ran out of RAM and crashed repeatedly, even though CPU usage remained low. Traditional containers are heavy because they carry a slimmed-down operating system (OS primitives).
WebAssembly solves this problem completely:
- Ultra-compact size: A
.wasmfile is usually only a few dozen KB to 2MB. Compared to a 400MB Node.js image, this is a massive leap. - Lightning speed: Wasm doesn’t need to boot an OS; it executes directly on the runtime. Startup speeds are 10-100x faster than standard containers.
- Secure Sandboxing: By default, Wasm is completely isolated. It cannot access the file system or network unless you explicitly grant permissions via the WASI interface.
WasmEdge: The Ultra-Lightweight Execution Engine
If Wasm is the compiled code, WasmEdge is the virtual machine that runs it. Within the Docker ecosystem, WasmEdge acts as a runtime replacing the traditional runc.
Thanks to the collaboration between Docker and CNCF, we can now manage both Linux containers and Wasm containers side-by-side. You can still use familiar commands like docker ps or docker build without having to relearn everything from scratch.
Hands-on: Building and Deploying Your First Wasm App
Let’s build an application using Rust, compile it to Wasm, and package it into Docker. Don’t worry if you don’t know Rust yet; the steps below are very straightforward.
Step 1: Initialize a Rust Project
cargo new hello-wasm
cd hello-wasm
Open src/main.rs and modify it to:
fn main() {
println!("Hello everyone, Wasm is running smoothly in Docker!");
}
Step 2: Compile to WASI Target
We need to add the wasm32-wasi target so Rust can compile into the standard format for servers:
rustup target add wasm32-wasi
cargo build --target wasm32-wasi --release
After running this, you’ll have a hello-wasm.wasm file in the target directory. This is everything you need for deployment.
Step 3: A “Weightless” Dockerfile
A Wasm Dockerfile doesn’t need FROM python or FROM node. We start from an empty image (scratch) to optimize size:
FROM scratch
COPY target/wasm32-wasi/release/hello-wasm.wasm /hello-wasm.wasm
ENTRYPOINT ["/hello-wasm.wasm"]
Step 4: Build and Run
When building, you must specify the platform as wasi/wasm:
docker buildx build --platform wasi/wasm -t my-wasm-app .
And enjoy the results:
docker run --rm --runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm my-wasm-app
Practical Experience: Avoiding Common Pitfalls
While powerful, there are 3 key points to keep in mind when putting this into practice:
1. Wasm is Not a “Silver Bullet”
Don’t try to move every app to Wasm. It’s excellent for image/video processing, heavy computation, or small microservices. However, if your app requires deep Linux Kernel access or complex C-system libraries, traditional Docker remains the top choice.
2. Networking Barriers
Network communication in the WASI environment is still limited. Not every HTTP library works out of the box. You should prioritize libraries optimized for WasmEdge, such as hyper-wasi, to avoid unfortunate runtime errors.
3. New Debugging Skills
Forget about the docker exec -it bin/bash command, as Wasm containers don’t have an operating system for you to access. Debugging relies entirely on stdout/stderr. Get into the habit of writing more accurate and detailed logs.
Conclusion
Wasm on Docker is mature enough for real-world use; it’s no longer just theory. This combination thoroughly addresses resource cost challenges for Cloud Native and Edge Computing.
Try applying Wasm to the smallest services in your system. Who knows, instead of high RAM costs, you might save up to 90% on your infrastructure bill thanks to Wasm’s superior optimization.
Good luck mastering these ultra-lightweight containers!

