Join our Discord Server
Ajeet Raina Docker Captain, ARM Innovator & Docker Bangalore Community Leader.

Getting Started with Wasm and Docker Desktop

2 min read

WebAssembly, also known as Wasm, is a low-level binary instruction format designed for web browsers that enables the execution of code at near-native speeds in a safe, sandboxed environment. Wasm was created to address the limitations of JavaScript as the only language that can be executed in web browsers. It allows web developers to use a wide range of programming languages, including C++, Rust, and Go, to write code that can run in the browser with near-native performance.

Wasm code is executed in a virtual machine within the browser and is designed to be platform-independent. This means that the same Wasm binary can be executed on any device or platform that supports WebAssembly, including desktops, smartphones, and even IoT devices. Wasm can also interact with JavaScript, allowing developers to easily integrate Wasm code into existing web applications.

Wasm is being adopted by major web browser vendors, including Google, Mozilla, Microsoft, and Apple, and is rapidly gaining popularity as a powerful tool for web developers. It is being used for a wide range of applications, from games and simulations to machine learning and blockchain.


Docker Desktop Support Wasm

 Docker Desktop 4.15 added WebAssembly capabilities for the first time. It means that now you can run Wasm applications alongside your Linux containers.


Switch-On Docker+Wasm integration

To use the Docker+Wasm integration, you must turn on the containerd image store feature. The Docker+Wasm integration requires the containerd image store feature. 

Verify if you have the latest version of Docker Desktop installed on your Mac system.

 docker version
 Cloud integration: v1.0.29
 Version:           20.10.22
 API version:       1.41
 Go version:        go1.18.9
 Git commit:        3a2c30b
 Built:             Thu Dec 15 22:28:41 2022
 OS/Arch:           darwin/arm64
 Context:           desktop-linux
 Experimental:      true

Server: Docker Desktop 4.16.2 (95914)
  Version:          22.06.0-beta.0-917-gf888bd4531.m
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.18.4
  Git commit:       f888bd4531
  Built:            Wed Jan 18 09:46:59 2023
  OS/Arch:          linux/arm64
  Experimental:     false
  Version:          1.6.14
  GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
  Version:          0.19.0
  GitCommit:        de40ad0

Installing Rust

curl --proto '=https' --tlsv1.2 -sSf | sh
source "$HOME/.cargo/env"

 Adding a target for Rust can compile it into a Wasm binary

$ rustup target add wasm32-wasi

info: downloading component 'rust-std' for 'wasm32-wasi'
info: installing component 'rust-std' for 'wasm32-wasi'

Creating a Rust Project using Cargo


cargo new wasm-container 
     Created binary (application) `wasm-container` package

The project structure look something like this:

└── wasm-container
    ├── Cargo.toml
    └── src

2 directories, 2 files

Change directory to Wasm

If the build succeeds, a wasm file will be created under the release directory.

cargo build --target wasm32-wasi --release
   Compiling wasm-container v0.1.0 (/Users/ajeetraina/feb/wasm/wasm-container)
    Finished release [optimized] target(s) in 1.85s
ajeetraina@Docker-Ajeet-Singh-Rainas-MacBook-Pro wasm-container % 

The project structure look something like this:

wasm-container % tree
├── Cargo.lock
├── Cargo.toml
├── src
│   └──
└── target
    ├── release
    │   ├── build
    │   ├── deps
    │   ├── examples
    │   └── incremental
    └── wasm32-wasi
        ├── CACHEDIR.TAG
        └── release
            ├── build
            ├── deps
            │   ├── wasm_container-f66b7ddf90b70b18.d
            │   └── wasm_container-f66b7ddf90b70b18.wasm
            ├── examples
            ├── incremental
            ├── wasm-container.d
            └── wasm-container.wasm

13 directories, 9 files

Creating a Dockerfile

Create a New Dockerfile under wasm-container directory


cat Dockerfile 
FROM scratch
COPY ./target/wasm32-wasi/release/wasm-container.wasm /wasm-container.wasm
ENTRYPOINT [ "wasm-container.wasm" ]
ajeetraina@Docker-Ajeet-Singh-Rainas-MacBook-Pro wasm-container % 

Using Docker Buildx


% docker buildx build --platform wasi/wasm32 -t ajeetraina/wasm-container:1.0 .

Verifying the Docker Image


$ docker images

ajeetraina/wasm-container                                            1.0                                                                                       796bd53ad35d   19 seconds ago   514kB

Running the Docker Container


docker run --platform wasi/wasm32 --runtime=io.containerd.wasmedge.v1  ajeetraina/hello-wasm-container:1.0
Hello, world!
Please follow and like us:

Have Queries? Join

Ajeet Raina Docker Captain, ARM Innovator & Docker Bangalore Community Leader.

Exploring the Cloud-Native Ecosystem: A Beginner’s Guide to the…

The Cloud Native Computing Foundation (CNCF) is a non-profit organization founded in 2015 with the goal of advancing the development and adoption of cloud-native technologies. The...
Ajeet Raina
3 min read
Join our Discord Server