Charges de travail Wasm
WebAssembly (Wasm) est une alternative rapide et légère aux conteneurs Linux et Windows. Avec Docker Desktop, vous pouvez maintenant exécuter des charges de travail Wasm côte à côte avec des conteneurs traditionnels.
Cette page fournit des informations sur la capacité d'exécuter des applications Wasm aux côtés de vos conteneurs Linux dans Docker.
TipApprenez-en plus sur les cas d'usage Wasm et les compromis dans le billet de blog aperçu technique Docker Wasm.
Activer les charges de travail Wasm
Les charges de travail Wasm nécessitent que la fonctionnalité stockage d'images containerd soit activée. Si vous n'utilisez pas déjà le stockage d'images containerd, alors les images et conteneurs pré-existants seront inaccessibles.
- Naviguez vers Paramètres dans Docker Desktop.
- Dans l'onglet Général, cochez Utiliser containerd pour tirer et stocker les images.
- Allez dans Fonctionnalités en développement et cochez l'option Activer Wasm.
- Sélectionnez Appliquer et redémarrer pour sauvegarder les paramètres.
- Dans la boîte de dialogue de confirmation, sélectionnez Installer pour installer les runtimes Wasm.
Docker Desktop télécharge et installe les runtimes suivants :
io.containerd.slight.v1
io.containerd.spin.v2
io.containerd.wasmedge.v1
io.containerd.wasmtime.v1
io.containerd.lunatic.v1
io.containerd.wws.v1
io.containerd.wasmer.v1
Exemples d'utilisation
Exécuter une application Wasm avec docker run
La commande docker run
suivante démarre un conteneur Wasm sur votre système :
$ docker run \
--runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm \
secondstate/rust-example-hello
Après avoir exécuté cette commande, vous pouvez visiter http://localhost:8080/ pour voir la sortie "Hello world" de ce module d'exemple.
Si vous recevez un message d'erreur, voir la section dépannage pour de l'aide.
Notez les flags --runtime
et --platform
utilisés dans cette commande :
--runtime=io.containerd.wasmedge.v1
: Informe le moteur Docker que vous voulez utiliser le shim containerd Wasm au lieu du runtime de conteneur Linux standard--platform=wasi/wasm
: Spécifie l'architecture de l'image que vous voulez utiliser. En tirant parti d'une architecture Wasm, vous n'avez pas besoin de construire des images séparées pour les différentes architectures machine. Le runtime Wasm prend en charge l'étape finale de conversion du binaire Wasm en instructions machine.
Exécuter une application Wasm avec Docker Compose
La même application peut être exécutée en utilisant le fichier Docker Compose suivant :
services:
app:
image: secondstate/rust-example-hello
platform: wasi/wasm
runtime: io.containerd.wasmedge.v1
Démarrez l'application en utilisant les commandes Docker Compose normales :
$ docker compose up
Exécuter une application multi-services avec Wasm
Le réseau fonctionne de la même façon que vous l'attendriez avec les conteneurs Linux, vous donnant la flexibilité de combiner des applications Wasm avec d'autres charges de travail conteneurisées, telles qu'une base de données, dans une seule pile d'application.
Dans l'exemple suivant, l'application Wasm tire parti d'une base de données MariaDB s'exécutant dans un conteneur.
-
Clonez le dépôt.
$ git clone https://github.com/second-state/microservice-rust-mysql.git Cloning into 'microservice-rust-mysql'... remote: Enumerating objects: 75, done. remote: Counting objects: 100% (75/75), done. remote: Compressing objects: 100% (42/42), done. remote: Total 75 (delta 29), reused 48 (delta 14), pack-reused 0 Receiving objects: 100% (75/75), 19.09 KiB | 1.74 MiB/s, done. Resolving deltas: 100% (29/29), done.
-
Naviguez dans le projet cloné et démarrez le projet en utilisant Docker Compose.
$ cd microservice-rust-mysql $ docker compose up [+] Running 0/1 ⠿ server Warning 0.4s [+] Building 4.8s (13/15) ... microservice-rust-mysql-db-1 | 2022-10-19 19:54:45 0 [Note] mariadbd: ready for connections. microservice-rust-mysql-db-1 | Version: '10.9.3-MariaDB-1:10.9.3+maria~ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
Si vous exécutez
docker image ls
depuis une autre fenêtre terminal, vous pouvez voir l'image Wasm dans votre stockage d'images.$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE server latest 2c798ddecfa1 2 minutes ago 3MB
Inspecter l'image montre que l'image a une plateforme
wasi/wasm
, une combinaison d'OS et d'architecture :$ docker image inspect server | grep -A 3 "Architecture" "Architecture": "wasm", "Os": "wasi", "Size": 3001146, "VirtualSize": 3001146,
-
Ouvrez l'URL
http://localhost:8090
dans un navigateur et créez quelques commandes d'exemple. Toutes celles-ci interagissent avec le serveur Wasm. -
Quand vous avez terminé, démontez tout en appuyant sur
Ctrl+C
dans le terminal où vous avez lancé l'application.
Construire et pousser un module Wasm
-
Créez un Dockerfile qui construit votre application Wasm.
La façon exacte de faire cela varie selon le langage de programmation que vous utilisez.
-
Dans une étape séparée de votre
Dockerfile
, extrayez le module et définissez-le commeENTRYPOINT
.# syntax=docker/dockerfile:1 FROM scratch COPY --from=build /build/hello_world.wasm /hello_world.wasm ENTRYPOINT [ "/hello_world.wasm" ]
-
Construisez et poussez l'image en spécifiant l'architecture
wasi/wasm
. Buildx rend cela facile à faire en une seule commande.$ docker buildx build --platform wasi/wasm -t username/hello-world . ... => exporting to image 0.0s => => exporting layers 0.0s => => exporting manifest sha256:2ca02b5be86607511da8dc688234a5a00ab4d58294ab9f6beaba48ab3ba8de56 0.0s => => exporting config sha256:a45b465c3b6760a1a9fd2eda9112bc7e3169c9722bf9e77cf8c20b37295f954b 0.0s => => naming to docker.io/username/hello-world:latest 0.0s => => unpacking to docker.io/username/hello-world:latest 0.0s $ docker push username/hello-world
Dépannage
Cette section contient des instructions sur comment résoudre les problèmes courants.
Runtime inconnu spécifié
Si vous essayez d'exécuter un conteneur Wasm sans le stockage d'images containerd, une erreur similaire à la suivante s'affiche :
docker: Error response from daemon: Unknown runtime specified io.containerd.wasmedge.v1.
Activez la fonctionnalité containerd dans les paramètres Docker Desktop et réessayez.
Échec de démarrage du shim : échec de résolution du chemin runtime
Si vous utilisez une version plus ancienne de Docker Desktop qui ne supporte pas l'exécution de charges de travail Wasm, vous verrez un message d'erreur similaire au suivant :
docker: Error response from daemon: failed to start shim: failed to resolve runtime path: runtime "io.containerd.wasmedge.v1" binary not installed "containerd-shim-wasmedge-v1": file does not exist: unknown.
Mettez à jour votre Docker Desktop vers la dernière version et réessayez.
Problèmes connus
- Docker Compose peut ne pas se fermer proprement lorsqu'interrompu. En contournement, nettoyez les processus
docker-compose
en leur envoyant un SIGKILL (killall -9 docker-compose
). - Les push vers Docker Hub peuvent donner une erreur indiquant
server message: insufficient_scope: authorization failed
, même après s'être connecté via Docker Desktop. En contournement, exécutezdocker login
dans la CLI