Join our Discord Server
Ajeet Raina Ajeet Singh Raina is a former Docker Captain, Community Leader and Arm Ambassador. He is a founder of Collabnix blogging site and has authored more than 570+ blogs on Docker, Kubernetes and Cloud-Native Technology. He runs a community Slack of 8900+ members and discord server close to 2200+ members. You can follow him on Twitter(@ajeetsraina).

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
Client:
 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)
 Engine:
  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
 containerd:
  Version:          1.6.14
  GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Installing Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | 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:

tree
.
└── wasm-container
    ├── Cargo.toml
    └── src
        └── main.rs

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
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    ├── 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!

Have Queries? Join https://launchpass.com/collabnix

Ajeet Raina Ajeet Singh Raina is a former Docker Captain, Community Leader and Arm Ambassador. He is a founder of Collabnix blogging site and has authored more than 570+ blogs on Docker, Kubernetes and Cloud-Native Technology. He runs a community Slack of 8900+ members and discord server close to 2200+ members. You can follow him on Twitter(@ajeetsraina).
Join our Discord Server
Index