Cursus
Docker Buildx : Comment créer des images de conteneurs multiplateformes ?
Construire des conteneurs pour plusieurs plateformes peut sembler intimidant et chronophage, mais vous allez voir que ce n'est pas du tout le cas.
La commande docker buildx
résout ce problème en étendant les capacités de construction de Docker avec des fonctionnalités avancées telles que la création d'images multiplateformes, la mise en cache améliorée et le traitement de construction parallèle. Il intègre le moteur de construction de nouvelle génération BuildKit directement dans le CLI de Docker. Avec la commande buildx
, vous créerez des images de conteneurs plus petites, plus rapides et plus sûres sans avoir à apprendre un ensemble d'outils entièrement nouveau.
Ces dernières années, Buildx est devenu plus ou moins indispensable aux meilleures pratiques DevOps et au développement d'applications cloud-natives. Elle rationalise les pipelines CI/CD et vous aide, vous et votre équipe, à fournir des applications de manière cohérente sur diverses cibles de déploiement, des appareils IoT basés sur ARM aux fermes de serveurs cloud.
> Nouveau sur Docker ? Notre guide pratique pour les débutants complets vous permettra de démarrer en un rien de temps.
Dans cet article, je vous guiderai à travers les techniques débutantes et avancées de docker buildx
.
Comprendre Docker Buildx
Vous utilisez probablement déjà Docker, vous connaissez donc la commande standard docker build
. Tôt ou tard, cependant, il commencera à vous sembler limitatif, en particulier lorsque vos projets deviendront plus complexes.
> Docker Buildx suppose que Docker est installé sur votre ordinateur. Si ce n'est pas le cas et que vous utilisez gLinux, suivez ce guide pour une installation facile.
Docker Buildx vous offre une expérience de construction améliorée qui fonctionne avec vos connaissances existantes. Il ne s'agit pas d'un outil distinct que vous devez installer : il est déjà intégré à Docker Desktop et Engine depuis la version 19.03. Buildx utilise BuildKit sous le capot, qui est le constructeur de nouvelle génération de Docker qui réécrit la façon dont les images sont créées. Vous remarquerez des constructions plus rapides, des images plus petites et la prise en charge de fonctionnalités supplémentaires.
Le passage de docker build
à docker buildx build
peut sembler minime - il ne s'agit après tout que d'un seul mot - mais les capacités que vous gagnez sont énormes.
Voyons comment Buildx fonctionne et ce qui le différencie des constructeurs traditionnels.
Les fondements architecturaux de Buildx
La magie de Buildx vient de sa conception client-serveur intelligente.
Lorsque vous exécutez une commande Buildx, vous utilisez le CLI de Docker en tant que client qui communique avec le démon BuildKit, le composant serveur qui s'occupe des tâches les plus lourdes. Cette séparation permet à BuildKit de faire des choses que l'ancien constructeur ne peut pas faire, comme en exécutant les étapes de construction en parallèle plutôt que séquentiellement. Les instructions de votre Dockerfile n'ont plus à s'exécuter les unes après les autres, ce qui réduit considérablement les temps de construction lorsque vous avez des étapes indépendantes.
Le modèle client-serveur permet également l'exécution à distance de la compilation. Vous pouvez pointer votre CLI Docker locale vers une instance BuildKit distante fonctionnant n'importe où - sur un serveur de construction musclé, dans le cloud ou même dans un cluster Kubernetes. Cette flexibilité signifie que vous n'avez pas besoin de mobiliser les ressources de votre ordinateur portable pour des constructions massives ou de vous soucier des problèmes de compatibilité de l'architecture.
La conception modulaire de BuildKit vous permet également d'ajouter différents analyseurs frontaux. La syntaxe Dockerfile est la syntaxe par défaut, mais vous pouvez utiliser d'autres formats de définition de construction s'ils conviennent mieux à votre flux de travail.
Construire le flux de processus
Lorsque vous exécutez docker buildx build
, l'interface de programmation sélectionne d'abord une instance de constructeur, qui est soit celle par défaut, soit celle que vous avez spécifiée. Votre contexte de construction et votre fichier Docker sont envoyés au démon BuildKit, qui analyse les instructions et crée un graphe acyclique dirigé (DAG) des étapes de construction. Contrairement au constructeur traditionnel qui traite chaque instruction de manière séquentielle, BuildKit analyse ce graphique pour déterminer quelles étapes peuvent être exécutées en parallèle.
Le constructeur exécute ensuite ces étapes à l'aide d'algorithmes de mise en cache efficaces qui sont beaucoup plus intelligents que l'ancien cache basé sur les couches. BuildKit cursus les entrées et sorties exactes de chaque étape, ce qui évite les reconstructions inutiles lorsque rien de pertinent n'a changé. Il permet également de répartir la construction sur plusieurs nœuds de travail pour un traitement encore plus rapide.
Après la construction, Buildx peut exporter les résultats dans différents formats, et pas seulement sous forme d'images Docker. Vous pouvez produire des images aux formats OCI, dans des répertoires locaux ou des archives, ou même ignorer complètement la création d'images si vous souhaitez simplement tester le processus de construction.
Vous avez raison - cette section pourrait certainement bénéficier de plus d'exemples pratiques et de visuels pour démontrer comment Buildx fonctionne dans des scénarios réels. Voici comment je l'améliorerais avec plus d'exemples de code et des suggestions d'images :
Fonctionnalité de base et caractéristiques
Docker Buildx n'a pas pour seul objectif de construire des images plus rapidement, même si c'est indéniablement le cas. Il s'agit d'élargir les possibilités de vos pipelines de construction.
Examinons les principales caractéristiques qui font que Buildx mérite d'être pris en considération pour votre prochain projet.
> Vous cherchez un projet Docker surdeas ? Ces 10 exemples vous permettront d'aligner votre portefeuille DevOps.
Application Python utilisée
Pour les besoins de cet article, j'ai créé une simple application Python Flask. Pour suivre, créez 3 fichiers - app.py
, requirements.txt
, et Dockerfile
.
Voici le contenu de chacun d'entre eux :
app.py
from flask import Flask, render_template_string
import platform
import socket
import psutil
import datetime
app = Flask(__name__)
@app.route("/")
def home():
html = """
<!DOCTYPE html>
<html>
<head>
<title>Docker Buildx Python Demo</title>
<style>
body {
max-width: 800px;
}
.container {
border: 1px solid #ddd;
border-radius: 5px;
background-
}
.info {
}
.platform {
font-weight: bold;
}
</style>
</head>
<body>
<h1>Docker Buildx Multi-Platform Demo (Python)</h1>
<div class="container">
<div class="info">Hostname: {{ hostname }}</div>
<div class="info">Platform: <span class="platform">{{ os_platform }} ({{ architecture }})</span></div>
<div class="info">CPUs: {{ cpu_count }}</div>
<div class="info">Total Memory: {{ memory_mb }} MB</div>
<div class="info">Server Time: {{ server_time }}</div>
</div>
</body>
</html>
"""
return render_template_string(
html,
hostname=socket.gethostname(),
os_platform=platform.system(),
architecture=platform.machine(),
cpu_count=psutil.cpu_count(),
memory_mb=round(psutil.virtual_memory().total / (1024 * 1024)),
server_time=datetime.datetime.now().isoformat(),
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
exigences.txt
flask==3.1.0
psutil==7.0.0
Fichier Docker
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Une fois cela fait, ouvrez une nouvelle fenêtre de Terminal et naviguez jusqu'au dossier du projet.
Construction d'images multiplateformes
Construire des images qui fonctionnent sur différentes architectures de CPU semble être un cauchemar, mais Buildx rend les choses étonnamment simples.
Examinez cette commande :
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .
Image 1 - Utilisation de Docker Buildx
En bref, il vous permet de créer des images pour plusieurs architectures simultanément. Buildx gère cela grâce à trois approches intelligentes : il peut utiliser QEMU pour l'émulation d'architecture (vous permettant de construire des images ARM sur une machine x86), se connecter à des nœuds de construction natifs pour chaque plateforme cible, ou combiner les deux méthodes pour des performances optimales. Le résultat est une liste de manifestes multi-architectures - parfois appelée "fat manifest" - qui contient des variantes de votre image pour chaque plateforme.
Si vous déployez dans divers environnements tels que des instances AWS Graviton, des clusters Raspberry Pi ou des infrastructures mixtes, cette prise en charge multiplateforme est cruciale.
Stratégies de mise en cache améliorées
Buildx transforme complètement le fonctionnement de la mise en cache des builds et rend vos builds plus rapides.
Le système met en œuvre une stratégie de mise en cache à trois niveaux qui va au-delà de la simple mise en cache des couches des constructions Docker traditionnelles :
- Intégration du cache en ligne : Tout d'abord, Buildx utilise un cache en ligne intégré à vos images, ce qui vous permet d'exploiter les couches mises en cache lors de constructions précédentes, même dans de nouveaux environnements.
- Cache de construction locale : Deuxièmement, il prend en charge un cache de construction local qui est géré de manière intelligente en fonction des instructions de construction et non pas seulement de leur ordre.
- Mise en cache basée sur le registre : Troisièmement, il offre une mise en cache basée sur le registre qui vous permet de partager le cache de construction entre les machines, ce qui est parfait pour les pipelines CI/CD ou les équipes distribuées.
Avec notre application Python, voyons comment nous pouvons utiliser des stratégies de mise en cache locale :
# Create a directory for local cache
mkdir -p buildx-cache
# First build - export cache to local directory
docker buildx build --cache-to type=local,dest=./buildx-cache -t myapp:latest .
# Make a small change to app.py
echo "# Small comment change" >> app.py
# Second build - use the local cache
docker buildx build --cache-from type=local,src=./buildx-cache -t myapp:latest .
La deuxième construction sera beaucoup plus rapide car elle réutilisera les couches mises en cache lors de la première construction.
Image 2 - Stratégies de mise en cache locale
Vous pouvez également utiliser la mise en cache en ligne, qui intègre des métadonnées de mise en cache dans l'image elle-même :
docker buildx build --cache-to type=inline -t myapp:latest .
Vous pouvez configurer ces backends de cache avec de simples drapeaux comme --cache-to
et --cache-from
, qui pointent vers des répertoires locaux, des référentiels de registre ou même des services de cache spécialisés. Cette flexibilité signifie que vos constructions restent rapides dans différents environnements sans sacrifier la reproductibilité.
Caractéristiques de sécurité
Buildx comprend des outils qui vous permettront de ne plus penser à la sécurité.
Imaginons que votre application Python ait besoin d'accéder à une API météorologique au cours du processus de construction. Au lieu de coder en dur votre clé d'API dans le fichier Docker, vous pouvez utiliser des secrets de construction :
# Store your API key in a local file
echo "abc123yourweatherapikey" > ./api_key.txt
# Build with the secret
docker buildx build --secret id=weather_api_key,src=./api_key.txt -t myapp:latest .
Ensuite, dans votre fichier Docker, vous ne pouvez accéder au secret qu'en cas de besoin :
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
# Create a config file using the secret at build time
RUN --mount=type=secret,id=weather_api_key \
echo "WEATHER_API_KEY=$(cat /run/secrets/weather_api_key)" > .env
EXPOSE 5000
CMD ["python", "app.py"]
Vous pouvez vérifier que la clé API ne se trouve pas dans l'image finale en consultant l'historique de l'image ou en exécutant le programme :
docker run --rm myapp:latest cat .env
Image 3 - Gestion des variables d'environnement
Dans votre app.py
, vous pourriez charger la clé API comme suit :
import os
from dotenv import load_dotenv
load_dotenv() # Load variables from .env file
api_key = os.getenv("WEATHER_API_KEY", "")
# ...
Cette approche signifie que votre clé d'API sensible n'est disponible que lors de l'étape de construction spécifique où elle est nécessaire, mais qu'elle n'est enregistrée dans aucune des couches d'image. Quiconque extrait votre image ne pourra pas extraire votre clé API, même s'il inspecte les couches de l'image.
Pour plus de sécurité, vous pouvez également utiliser des conteneurs de construction temporaires qui sont automatiquement supprimés après la construction :
docker buildx build --secret id=weather_api_key,src=./api_key.txt --rm -t myapp:latest .
L' option --rm
permet de s'assurer que tous les conteneurs intermédiaires créés au cours du processus de construction sont supprimés, ce qui réduit encore le risque de fuite d'informations d'identification.
Configuration opérationnelle
La configuration de Buildx pour votre flux de travail ne nécessite que quelques commandes, mais la compréhension des options vous permet d'en tirer le meilleur parti.
Voyons comment vous pouvez configurer et gérer Buildx dans un environnement local pour répondre à vos besoins spécifiques.
Gestion de l'instance du constructeur
Docker Buildx utilise le concept de "builders" - des instances BuildKit distinctes dotées de capacités et de configurations différentes. Vous pouvez créer plusieurs constructeurs à des fins différentes.
Tout d'abord, voyons quels sont les constructeurs dont vous disposez déjà :
docker buildx ls
Vous obtiendrez un résultat similaire à celui-ci :
Image 4 - Constructeurs disponibles
Pour créer une nouvelle instance de constructeur, exécutez les commandes suivantes :
# Create a new builder
docker buildx create --name mybuilder
# Switch to using that builder
docker buildx use mybuilder
# Bootstrap the builder (start it)
docker buildx inspect --bootstrap
Vous pouvez vérifier qu'il fonctionne :
# Check the status
docker buildx ls
Image 5 - Passer à un constructeur sur mesure
Si vous devez supprimer un constructeur, exécutez simplement la procédure suivante :
docker buildx rm mybuilder
Traitement des sorties
Buildx vous offre des options flexibles quant à l'utilisation des images que vous construisez. Vous pouvez les charger directement dans votre démon Docker local, les exporter sous forme de tarballs ou les enregistrer dans un répertoire local.
Voyons comment utiliser ces options avec notre application Python :
# Load the image directly into Docker (default behavior)
docker buildx build --load -t myapp:latest .
# Export the image as a tarball
docker buildx build --output type=docker,dest=myapp.tar -t myapp:latest .
# Save the image contents to a local directory
docker buildx build --output type=local,dest=./image-output -t myapp:latest .
Après avoir utilisé l'exportation de l'archive, vous pouvez la charger dans Docker avec :
docker load < myapp.tar
Image 6 - Chargement d'une image à partir d'un export tarball
La sortie du répertoire local est particulièrement utile pour l'inspection. Voyons ce qui est créé :
ls -la ./image-output
Vous verrez le système de fichiers de l'image brute :
Image 7 - Contenu de l'exportation du répertoire local
Vous pouvez même exécuter des étapes de construction spécifiques sans créer d'image finale. C'est pratique pour déboguer ou tester les étapes de construction :
# Create a multi-stage Dockerfile
cat > Dockerfile.multi << 'EOF'
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .
FROM base AS dev-deps
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install pytest
FROM base AS prod-deps
RUN pip install --no-cache-dir -r requirements.txt
FROM prod-deps AS final
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
# Build only the dev-deps stage and export its filesystem
docker buildx build --file Dockerfile.multi --target dev-deps --output type=local,dest=./dev-deps-output .
Vous pouvez maintenant vérifier quels paquets ont été installés dans l'environnement de développement :
cat ./dev-deps-output/usr/local/lib/python3.13/site-packages/pytest/__init__.py
Image 8 - Contenu des fichiers de l'étape "dev-deps
En résumé, ces options de sortie vous permettent de contrôler totalement la destination de vos images construites, que vous déboguiez localement ou que vous prépariez des images à partager avec votre équipe.
Maîtriser Docker et Kubernetes
Cas d'utilisation avancés
Jusqu'à présent, je vous ai montré les commandes de base de Buildx et les cas d'utilisation. Buildx peut faire beaucoup plus, certaines fonctionnalités étant impossibles à mettre en œuvre avec le constructeur classique.
Explorons quelques techniques avancées pour faire passer votre flux de travail de conteneurisation au niveau supérieur.
Optimisation de la construction en plusieurs étapes
Les constructions en plusieurs étapes sont l'une des fonctionnalités les plus puissantes de Docker pour créer des images efficaces, et Buildx les rend encore meilleures.
Pour le démontrer, créons une application Python optimisée avec plusieurs étapes :
# Dockerfile.optimized
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .
FROM base AS builder
RUN pip install --no-cache-dir --target=/install -r requirements.txt
FROM base AS linter
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
RUN pip install pylint && pylint app.py || exit 0
FROM base AS tester
COPY --from=builder /install /usr/local/lib/python3.9/site-packages
COPY app.py .
RUN pip install pytest && python -m pytest app.py -v || exit 0
FROM python:3.13-alpine AS final
WORKDIR /app
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Avec Buildx, vous pouvez construire cela plus efficacement :
docker buildx build --file Dockerfile.optimized -t myapp:optimized --load .
Image 9 - Constructions en plusieurs étapes
Qu'est-ce qui fait la particularité de ce produit ? Buildx traite en parallèle des étapes indépendantes. Alors que le constructeur traditionnel exécuterait chaque étape de manière séquentielle, Buildx identifie que les étapes linter
et tester
ne dépendent pas l'une de l'autre et les construit simultanément.
Un autre avantage de cette optimisation de la construction est la réduction de la taille du fichier. Vous pouvez vérifier la taille de l'image en procédant comme suit :
docker images myapp
Vous obtiendrez quelque chose comme ceci :
Image 10 - Taille des images Docker
L'image finale alpine est beaucoup plus petite.
Intégration du pipeline CI/CD
Lorsque vous travaillez localement, vous pouvez toujours mettre en place des configurations Buildx qui reflètent votre environnement CI/CD.
Pour commencer, créez un fichier .dockerignore
afin de garder les constructions propres :
.git
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
venv
*.so
.coverage
htmlcov
Créez ensuite un script de construction qui imite ce que votre pipeline de CI pourrait faire :
#!/bin/bash
# build.sh - Local CI/CD simulation
echo "Starting CI/CD build process..."
# Setup builder with emulation support
echo "Setting up builder..."
docker buildx create --name cibuilder --use || true
docker buildx inspect --bootstrap
# Run linting
echo "Running lint stage..."
docker buildx build --file Dockerfile.optimized --target linter .
# Run tests
echo "Running test stage..."
docker buildx build --file Dockerfile.optimized --target tester .
# Build for multiple platforms
echo "Building multi-platform image..."
docker buildx build --file Dockerfile.optimized \
--platform linux/amd64,linux/arm64 \
--tag myapp:$(date +%Y%m%d) \
--tag myapp:latest \
--load \
--progress=plain \
.
echo "Build process complete!"
En clair, ce script effectue les opérations suivantes :
- Crée un constructeur dédié à CI/CD.
- Exécute l'étape de mise en charpie.
- Exécute la phase de test.
- Construit l'image finale multiplateforme avec des balises versionnées.
Passons maintenant à la partie la plus amusante : rendez le script exécutable et exécutez-le :
chmod +x build.sh
./build.sh
Edition locale
L'un des problèmes les plus courants lorsque vous travaillez avec Docker est que chaque fois que vous modifiez le fichier source, vous devez reconstruire l'image et exécuter le conteneur. Cela prend trop de temps.
Voici la bonne nouvelle : pour un développement local avec des itérations plus rapides, vous pouvez créer une version de développement :
# Dockerfile.dev
FROM python:3.13-slim
WORKDIR /app
RUN pip install flask psutil python-dotenv
# Install development tools
RUN pip install pytest pylint watchdog
# Mount app code at runtime instead of copying
CMD ["python", "app.py"]
Exécutez-le avec un montage de volume pour recharger le code en direct :
docker buildx build -f Dockerfile.dev -t myapp:dev --load .
docker run -it --rm -p 5000:5000 -v $(pwd):/app myapp:dev
Vous pouvez maintenant éditer votre fichier app.py
localement, et les changements seront immédiatement reflétés dans le conteneur en cours d'exécution !
Passons maintenant à la question de la performance.
Considérations sur les performances
Personne n'aime un flux de travail de développement lent, et la puissance de la parallélisation avec Docker Buildx peut aider.
Voyons comment optimiser vos constructions et tirer parti des fonctions de performance de Buildx pour créer des images plus rapidement.
Construire des techniques de parallélisation
L'un des principaux avantages de Buildx est sa capacité à construire des étapes en parallèle. Le constructeur Docker traditionnel exécute chaque étape de manière séquentielle, mais Buildx analyse votre fichier Docker et identifie les étapes qui peuvent être exécutées en même temps.
Pour illustrer mon propos, j'utiliserai deux fichiers : Dockerfile.standard
et Dockerfile.parallel
. Voici le contenu des deux :
Dockerfile.standard
FROM python:3.13-slim
WORKDIR /app
# System dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Application code
COPY app.py .
# Linting
RUN pip install pylint && pylint app.py || true
EXPOSE 5000
CMD ["python", "app.py"]
Dockerfile.parallel
FROM python:3.13-slim AS python-base
WORKDIR /app
# Independent stage for installing system dependencies
FROM python-base AS system-deps
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Independent stage for installing Python dependencies
FROM python-base AS python-deps
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Independent stage for static code analysis
FROM python-deps AS linting
COPY app.py .
RUN pip install pylint && pylint app.py || true
# Final stage that combines dependencies
FROM python-base AS final
# Copy from system deps stage
COPY --from=system-deps /usr/bin/gcc /usr/bin/gcc
# Copy from Python deps stage
COPY --from=python-deps /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
Mesurons comment cette structure parallèle améliore les temps de construction :
# Time the standard sequential build
time docker build -t myapp:standard -f Dockerfile.standard .
# Time the parallel-optimized build with Buildx
time docker buildx build --load -t myapp:parallel -f Dockerfile.parallel .
À titre de référence, la construction standard a pris 18,48 secondes, tandis que la construction parallèle n'a pris que 1,17 seconde !
Pour améliorer encore les performances, vous pouvez essayer d'utiliser les drapeaux --cache-from
et --cache-to
pour tirer parti de la mise en cache des disques locaux:
# First build - create cache
docker buildx build --load -t myapp:latest --cache-to type=local,dest=./buildcache .
# Subsequent builds - use cache
docker buildx build --load -t myapp:latest --cache-from type=local,src=./buildcache .
Vous pouvez également limiter la taille du contexte en utilisant soigneusement les fichiers .dockerignore
:
# Create a comprehensive .dockerignore
cat > .dockerignore << 'EOF'
.git
.github
.dockerignore
.pytest_cache
__pycache__
*.pyc
*.pyo
*.pyd
.Python
venv
env
node_modules
.coverage
htmlcov
.DS_Store
EOF
En bref, en structurant vos fichiers Docker avec la parallélisation à l'esprit et en tirant parti de la mise en cache avancée de Buildx, vous passerez moins de temps à attendre les builds et plus de temps à développer des fonctionnalités.
Intégration de l'écosystème
Docker Buildx n'existe pas de manière isolée. Il est conçu pour s'intégrer de manière transparente aux autres outils de votre environnement de développement.
Voyons comment Buildx fonctionne avec les outils de développement locaux et rend votre flux de travail plus efficace.
Clusters de construction Kubernetes
Kubernetes offre de puissantes fonctionnalités pour l'exécution d'opérations Docker Buildx distribuées sur un cluster. En intégrant Buildx avec Kubernetes, vous pouvez obtenir des constructions plus rapides et plus résilientes qui évoluent avec les besoins de votre projet.
> Vous êtes novice en matière de Kubernetes ? Le site Kubernetes vs Docker : Differences Every Developer Should Know post is your next stop.
L'utilisation de Kubernetes pour votre infrastructure de construction présente plusieurs avantages :
- Mise à l'échelle automatique : Kubernetes peut faire évoluer vos nœuds de construction vers le haut ou vers le bas en fonction de la demande, en allouant les ressources de manière efficace dans votre cluster. Vous pouvez même définir des règles de mise à l'échelle automatique basées sur l'utilisation du processeur.
- Optimisation des ressources : L'ordonnancement Kubernetes garantit que vos constructions obtiennent les ressources dont elles ont besoin sans surcharger les nœuds individuels. Vous pouvez définir des limites de ressources et des demandes pour garantir des performances constantes.
- Haute disponibilité : En distribuant les instances BuildKit sur plusieurs nœuds, votre infrastructure de construction reste disponible même si des nœuds individuels tombent en panne.
- Des environnements cohérents : Chaque membre de l'équipe se connecte à la même infrastructure de construction, ce qui élimine les problèmes de "fonctionne sur ma machine".
- Exécution parallèle : Les constructions complexes comportant de nombreuses étapes peuvent être exécutées en parallèle sur plusieurs nœuds, ce qui permet de réduire considérablement les délais de construction. Un projet qui peut prendre 15 minutes à réaliser localement peut être achevé en 3-4 minutes lorsqu'il est distribué.
Considérez cette section comme plus "théorique", car plonger plus profondément dans Kubernetes est un sujet avancé en soi.
Pour commencer, créez un fichier nommé buildkit-deployment.yaml
avec le contenu suivant :
apiVersion: apps/v1
kind: Deployment
metadata:
name: buildkit
namespace: buildkit
spec:
replicas: 3
selector:
matchLabels:
app: buildkit
template:
metadata:
labels:
app: buildkit
spec:
containers:
- name: buildkit
image: moby/buildkit:latest
args:
- --addr
- tcp://0.0.0.0:1234
ports:
- containerPort: 1234
securityContext:
privileged: true
---
apiVersion: v1
kind: Service
metadata:
name: buildkit
namespace: buildkit
spec:
type: ClusterIP
ports:
- port: 1234
targetPort: 1234
selector:
app: buildkit
L'étape suivante consiste à appliquer ce fichier à votre cluster Kubernetes :
kubectl create namespace buildkit
kubectl apply -f buildkit-deployment.yaml
Enfin, connectez-vous à ce déploiement à partir de votre machine locale :
docker buildx create --name k8s-builder \
--driver remote \
--driver-opt endpoint=tcp://<cluster-ip>:1234 \
--use
Et voilà, vous êtes prêt à partir !
Support des plugins IDE
Les IDE comme Visual Studio Code offrent une excellente intégration avec Docker Buildx grâce à son extension Docker. Cette intégration facilite la gestion de vos flux de travail Buildx directement depuis votre environnement de développement.
Pour commencer à utiliser Docker Buildx dans VS Code, installez l'extension "Docker" à partir de la place de marché VS Code.
Une fois installé, vous bénéficierez de plusieurs fonctionnalités propres à Buildx :
- Cliquez avec le bouton droit de la souris sur n'importe quel fichier Docker pour afficher un menu contextuel avec une option "Build Image..." qui prend en charge Buildx.
- Accès aux arguments de construction, aux cibles de plate-forme et aux options de sortie via l'interface utilisateur.
- Capacité à gérer et à passer d'une instance de constructeur à l'autre.
- Intégration avec le terminal VS Code pour l'exécution de commandes Buildx complexes.
Image 11 - Extension Docker pour VSCode
Voici un exemple de personnalisation des tâches VS Code pour utiliser Buildx en créant un fichier .vscode/tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"label": "Docker: Buildx Build",
"type": "shell",
"command": "docker buildx build --load -t ${input:imageName} .",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Docker: Buildx Multi-Platform",
"type": "shell",
"command": "docker buildx build --platform linux/amd64,linux/arm64 -t ${input:imageName} ."
}
],
"inputs": [
{
"id": "imageName",
"description": "Image name (with tag):",
"default": "myapp:latest",
"type": "promptString"
}
]
}
Avec cette configuration, vous pouvez accéder rapidement aux commandes Buildx courantes à partir du menu Tâches de VS Code(Terminal > Exécuter une tâche). L'extension fournit également une coloration syntaxique utile pour les Dockerfiles et une autocomplétion pour les commandes Docker courantes, ce qui rend votre flux de travail Buildx plus productif.
Dépannage et débogage
Chaque outil de développement nécessite parfois (trop souvent) un dépannage, et Docker Buildx ne fait pas exception. Dans cette section, je vais vous présenter quelques problèmes courants afin que vous puissiez les diagnostiquer vous-même rapidement et reprendre le cursus.
Problèmes courants et solutions
Lorsque vous travaillez avec Buildx, vous pouvez rencontrer quelques défis communs. Voici les problèmes les plus fréquents et leurs solutions :
- La création d'un constructeur échoue. Si vous rencontrez des erreurs lors de la création d'un constructeur avec
docker buildx create
, vérifiez votre version de Docker :
docker version
Buildx nécessite Docker 19.03 ou une version plus récente. Si vous utilisez une version plus ancienne, mettez à jour Docker pour accéder aux fonctionnalités de Buildx.
Pour les erreurs "no such plugin", assurez-vous que Buildx est correctement installé en exécutant :
docker buildx version
- Échecs de la compilation multiplateforme. Lorsque vous construisez pour plusieurs plateformes et que vous obtenez des erreurs telles que "exec format error" ou "no matching manifest", vérifiez si QEMU est installé :
docker buildx inspect --bootstrap
Si nécessaire, installez des émulateurs de plate-forme :
docker run --privileged --rm tonistiigi/binfmt --install all
- Problèmes liés au cache. Pour les problèmes de mise en cache, essayez de vider votre cache de compilation local :
# Remove specific builder's cache
docker buildx prune -b mybuilder
# Remove all build cache
docker buildx prune --all
> Qu'est-ce que la commande Docker prune ? Apprenez à l'aide d'une multitude d'exemples pratiques.
- Problèmes de connexion du démon BuildKit. Si vous voyez "failed to solve" ou des erreurs de connexion, redémarrez le constructeur :
docker buildx rm mybuilder
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap
- Questions liées aux performances. Pour les constructions lentes, essayez la sortie de débogage pour identifier les goulots d'étranglement :
docker buildx build --progress=plain --no-cache .
Cette sortie verbale permet d'identifier les étapes de construction qui prennent le plus de temps, ce qui vous permet d'optimiser votre fichier Docker en conséquence.
- Échecs de la commande "Load". Si vous rencontrez "error : docker exporter does not currently support exporting manifest lists" lorsque vous utilisez
--load
avec des constructions multiplateformes, rappelez-vous que le chargement simultané de plusieurs plateformes dans le démon Docker n'est pas pris en charge. Au lieu de cela :
# Build for your current platform and load it
docker buildx build --platform linux/amd64 --load -t myapp:latest .
- Pratiques de débogage. Pour les problèmes plus complexes, ces méthodes de débogage vous aideront :
# Enable BuildKit debug logs
BUILDKIT_DEBUG=1 docker buildx build .
# Inspect the builder's internal state
docker buildx inspect
# Check system requirements
docker info
# For specific stage failures, build only up to that stage
docker buildx build --target problem-stage .
# Verify your Docker context
docker context ls
En suivant systématiquement ces étapes de dépannage, vous pouvez résoudre la plupart des problèmes liés à Buildx et maintenir un flux de construction de conteneurs efficace.
Résumé du guide Docker Buildx
Nous avons couvert beaucoup de terrain dans cet article de Docker Buildx ! Vous avez vu comment ce puissant outil peut rendre vos constructions de conteneurs plus rapides et plus flexibles.
Rappelez-vous les principaux avantages : Vous pouvez créer des images pour plusieurs plateformes à l'aide d'une seule commande, accélérer vos créations grâce à la mise en cache avancée et sécuriser vos images grâce à une gestion appropriée des secrets. Les améliorations de performance sont réelles, en particulier lorsque vous structurez vos fichiers Docker pour tirer parti de la construction parallèle.
Je l'utilise tout le temps sur mon Macbook à puce M, car toutes les images ne sont pas disponibles pour ARM.
Que vous soyez un développeur solitaire ou que vous fassiez partie d'une grande équipe, Buildx vous offre des outils qui s'adaptent à votre flux de travail. Vous pouvez exécuter des builds localement, les distribuer dans des conteneurs ou même les faire évoluer vers des clusters Kubernetes au fur et à mesure que vos besoins augmentent.
Pour en savoir plus sur Docker et Docker Buildx, je vous recommande de vous inscrire aux cours DataCamp suivants :
Maîtriser Docker et Kubernetes
Apprenez-en plus sur Docker avec ces cours !
Cours
Introduction to Docker
Cours