Erstellen von Multi-Architektur-Images mit Docker Buildx
Eine der leistungsstärksten Funktionen von Docker Buildx ist die Fähigkeit, Images für mehrere Architekturen gleichzeitig zu erstellen. In diesem Schritt lernen wir, wie man Multi-Architektur-Images erstellt.
Multi-Architektur-Images verstehen
Multi-Architektur-Images ermöglichen es, dass derselbe Imagename auf verschiedenen Plattformen (wie AMD64, ARM64 usw.) funktioniert. Docker wählt automatisch die passende Version für die Host-Architektur aus, wenn das Image abgerufen wird.
Dies ist besonders nützlich für:
- Unterstützung von x86- und ARM-basierten Geräten
- Sicherstellen, dass Ihre Anwendungen auf verschiedenen Cloud-Anbietern ausgeführt werden
- Erstellen für IoT-Geräte mit unterschiedlichen Architekturen
Einrichten für Multi-Architektur-Builds
Docker Buildx muss für Multi-Architektur-Builds konfiguriert werden. Stellen wir zunächst sicher, dass unser Builder diese Funktion unterstützt:
docker buildx inspect --bootstrap mybuilder
Wenn Sie eine Fehlermeldung sehen, dass der Builder nicht verfügbar ist, erstellen wir ihn mit der richtigen Konfiguration neu:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Erstellen eines Multi-Architektur-Images
Erstellen wir nun unser Nginx-Image für mehrere Architekturen:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Möglicherweise sehen Sie eine Fehlermeldung ähnlich der folgenden:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Dies geschieht, weil der Standard-Docker-Treiber keine Multi-Architektur-Builds unterstützt. Ändern wir unseren Ansatz.
Zu Demonstrationszwecken erstellen wir separat für bestimmte Plattformen:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Dies erstellt das Image speziell für die AMD64-Architektur und lädt es in den lokalen Image-Store von Docker.
Verwenden von Build-Argumenten
Docker Buildx ermöglicht es uns, Build-Argumente zu verwenden, um unsere Builds anzupassen. Ändern wir unser Dockerfile, um ein Build-Argument zu verwenden:
nano Dockerfile
Aktualisieren Sie den Dockerfile-Inhalt auf:
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;"]
Drücken Sie Ctrl+O gefolgt von Enter zum Speichern und dann Ctrl+X zum Beenden von nano.
Jetzt können wir das Image mit einem benutzerdefinierten Paket erstellen:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Pushen in eine Registry (Optional)
Um Multi-Architektur-Images vollständig zu nutzen, würden Sie diese typischerweise in eine Registry pushen. Dies erfordert Docker Hub-Anmeldeinformationen oder eine private Registry. In einem realen Szenario würde der Befehl wie folgt aussehen:
## Beispiel nur - nicht erforderlich für dieses Lab
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Untersuchen von Images
Untersuchen wir die Images, die wir erstellt haben:
docker images | grep nginx
Sie sollten eine ähnliche Ausgabe sehen:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Testen unseres Images
Lassen Sie uns abschließend einen Container mit unserem Image ausführen, um zu überprüfen, ob es funktioniert:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Überprüfen Sie, ob der Container läuft:
docker ps
Sie sollten eine Ausgabe sehen, die anzeigt, dass Ihr Container läuft:
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
Lassen Sie uns den Nginx-Server mit curl aufrufen, um sicherzustellen, dass er antwortet:
curl http://localhost:8080
Sie sollten die HTML-Willkommensseite von Nginx sehen.
Wenn Sie fertig sind, bereinigen Sie den Container:
docker stop test-nginx
docker rm test-nginx
Herzlichen Glückwunsch! Sie haben erfolgreich mit Docker Buildx gearbeitet, den Fehler "requires exactly 1 argument" verstanden und behoben und gelernt, wie man spezielle Builds für verschiedene Architekturen erstellt.