Construction d'images multi-architectures avec Docker Buildx
L'une des fonctionnalités les plus puissantes de Docker Buildx est sa capacité à construire des images pour plusieurs architectures simultanément. Dans cette étape, nous allons apprendre à créer des images multi-architectures.
Comprendre les images multi-architectures
Les images multi-architectures permettent au même nom d'image de fonctionner sur différentes plateformes (comme AMD64, ARM64, etc.). Docker sélectionne automatiquement la version appropriée pour l'architecture de l'hôte lorsque l'image est extraite.
Ceci est particulièrement utile pour :
- Prendre en charge les appareils x86 et ARM
- S'assurer que vos applications s'exécutent sur divers fournisseurs de cloud
- Construire pour les appareils IoT avec différentes architectures
Configuration pour les constructions multi-architectures
Docker Buildx doit être configuré pour les constructions multi-architectures. Tout d'abord, assurons-nous que notre builder prend en charge cette fonctionnalité :
docker buildx inspect --bootstrap mybuilder
Si vous voyez une erreur concernant l'indisponibilité du builder, recréons-le avec la bonne configuration :
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Création d'une image multi-architecture
Construisons maintenant notre image Nginx pour plusieurs architectures :
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Vous pourriez voir un message d'erreur similaire à :
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Cela se produit car le pilote Docker par défaut ne prend pas en charge les constructions multi-architectures. Modifions notre approche.
À des fins de démonstration, nous allons construire pour des plateformes spécifiques séparément :
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Cela construit l'image spécifiquement pour l'architecture AMD64 et la charge dans le magasin d'images local de Docker.
Utilisation des arguments de construction
Docker Buildx nous permet d'utiliser des arguments de construction pour personnaliser nos constructions. Modifions notre Dockerfile pour utiliser un argument de construction :
nano Dockerfile
Mettez à jour le contenu du Dockerfile avec :
FROM ubuntu:22.04
ARG PACKAGE=nginx
RUN apt-get update && apt-get install -y \
curl \
${PACKAGE} \
&& rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Appuyez sur Ctrl+O
suivi de Entrée
pour enregistrer, puis Ctrl+X
pour quitter nano.
Maintenant, nous pouvons construire l'image avec un paquet personnalisé :
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Pousser vers un registre (facultatif)
Pour utiliser pleinement les images multi-architectures, vous les pousseriez généralement vers un registre. Cela nécessite des identifiants Docker Hub ou un registre privé. Dans un scénario réel, la commande ressemblerait à :
## Exemple uniquement - non requis pour ce lab
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Inspection des images
Examinons les images que nous avons créées :
docker images | grep nginx
Vous devriez voir une sortie similaire à :
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Test de notre image
Enfin, exécutons un conteneur en utilisant notre image pour vérifier qu'elle fonctionne :
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Vérifiez si le conteneur est en cours d'exécution :
docker ps
Vous devriez voir une sortie indiquant que votre conteneur est en cours d'exécution :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdef123456 nginx-test:latest "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp test-nginx
Faisons un curl
sur le serveur nginx pour nous assurer qu'il répond :
curl http://localhost:8080
Vous devriez voir la page d'accueil HTML par défaut de Nginx.
Lorsque vous avez terminé, nettoyez le conteneur :
docker stop test-nginx
docker rm test-nginx
Félicitations ! Vous avez réussi à travailler avec Docker Buildx, à comprendre et à résoudre l'erreur "requires exactly 1 argument", et à apprendre à créer des constructions spécialisées pour différentes architectures.