⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Charges de travail Wasm

Availability: Beta

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.

Tip

Apprenez-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.

  1. Naviguez vers Paramètres dans Docker Desktop.
  2. Dans l'onglet Général, cochez Utiliser containerd pour tirer et stocker les images.
  3. Allez dans Fonctionnalités en développement et cochez l'option Activer Wasm.
  4. Sélectionnez Appliquer et redémarrer pour sauvegarder les paramètres.
  5. 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.

  1. 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.
    
  2. 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,
    
  3. Ouvrez l'URL http://localhost:8090 dans un navigateur et créez quelques commandes d'exemple. Toutes celles-ci interagissent avec le serveur Wasm.

  4. 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

  1. 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.

  2. Dans une étape séparée de votre Dockerfile, extrayez le module et définissez-le comme ENTRYPOINT.

    # syntax=docker/dockerfile:1
    FROM scratch
    COPY --from=build /build/hello_world.wasm /hello_world.wasm
    ENTRYPOINT [ "/hello_world.wasm" ]
  3. 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écutez docker login dans la CLI