Docker build multiarch image
24. Februar 2025Wenn Sie Docker auf einem RaspberryPi oder Mac verwenden, werden Sie feststellen, dass nicht alle Docker-Images dort immer laufen. In diesem Artikel beschreibe ich, wie Sie dieses Problem mit einem Multi-Plattform-Image lösen können.
Der Grund, warum man den Container nicht auf einem Raspberry PI oder Mack laufen lassen kann, ist, dass diese Geräte einen Prozessor mit ARM-Architektur haben, was eine andere Architektur als der x86-64 auf normalen PCs ist.
Eine Möglichkeit, dies zu umgehen, ist, ein Build-Image lokal auf dem Gerät zu erstellen.
Aber dann müsste man den Build jedes Mal auf jedem Gerät durchführen.
Besser ist es, ein sogenanntes Multiarch-Build zu erstellen, bei dem Sie ein Docker-Image für mehrere CPU-Architekturen erstellen.
Ein solches Image erstellt man nur einmal und lädt es in die image registry auf Docker Hub oder GitLab hoch.
Und alle anderen mit PC, RaspberryPI und Mac laden dann das fertige Image für ihre CPU-Architektur herunter und starten den Container bei Bedarf daraus.
So müssen sie das Build-Image nicht lokal auf ihrem Rechner erstellen.
Vorausgesetzt natürlich, dass der Build auch für ihre CPU erstellt wird.
Heutzutage ist es üblich, dass alle Basis-Images für x86-64 und ARM gebaut werden.
Was ist ein Docker-Image vom technischen Standpunkt aus gesehen?
In der Regel handelt es sich dabei um Open-Source-Software. Dadurch läuft solche Software auf vielen verschiedenen Architekturen.
Solche Software läuft auch auf vielen Betriebssystemen.
Wir sprechen über Docker und das sind Linux-Container. Und die können nur auf Linux laufen, auch wenn es eine virtuelle Linux-Maschine ist, die auf Windows oder einem Mac läuft.
Ihr privates Docker-Image enthält natürlich das, was Sie dort hineinlegen. Also z.B. auch proprietäre Software und da ist die Unabhängigkeit vom Betriebssystem, der Linux-Distribution und der CPU-Architektur rein dir überlassen.
Wenn Sie das also nicht berücksichtigt haben, kann es passieren, dass Ihre Software ohne weitere Anpassungen nicht auf einem Rechner mit einer ARM-CPU läuft.
Die Docker-Dokumentation verwendet den Begriff Multiplattform-Build, ich bevorzuge den Begriff Multiarchen-Build.
Heutzutage werden Image/Container des OCI-Standards verwendet, die Multiplattform-Build-Unterstützung bieten. Früher hat Docker diesen Standard nicht verwendet. Erwarten Sie also nicht, dass Sie auf alten Systemen plattformübergreifende Builds verwenden können.
Wo Sie ARM-CPUs sehen werden
Wenn Sie typischerweise mit einem Multiplattform-Build arbeiten müssen:
- Ihre Entwickler verwenden Apple Macs, die in neuen Versionen eine ARM-CPU haben.
- Sie wollen die Kosten für AWS optimieren und haben sich daher für einen VPS mit ARM-CPU entschieden.
- Sie wollen neue moderne Server mit ARM CPUs z.B. HP proliant kaufen.
Zwei Wege
Die Build-Konfiguration, also das Dockerfile, bleibt unverändert.
Es gibt zwei Möglichkeiten, ein Multi-Plattform-Build-Docker-Image zu erstellen:
- Verwenden Sie BuildX und machen Sie etwas wie cross build.
- Erstelle einen Build auf einer bestimmten Plattform und kombiniere ihn dann in einem Multi-Arch-Image.
BuildX
Buildx ist eine Docker-Erweiterung, die erweiterte Funktionen zum Erstellen von Containern bietet. Sie ist Teil der Docker-CLI und ermöglicht das Erstellen von Images mit BuildKit, einem modernen Docker-Build-System mit verbesserter Leistung und Flexibilität.
Eine der wichtigsten Funktionen von buildx ist die Unterstützung für Multiplattform-Builds. Es kann also Images für verschiedene Architekturen bauen (z.B. linux/amd64, linux/arm64). In einigen Fällen kann ein solcher Build für eine andere Architektur jedoch aufgrund der Emulation sehr langsam sein.
Standardmäßig verwenden die Linux-Distributionen Mageia oder Debian kein buildX, so dass sie standardmäßig keine plattformübergreifenden Builds unterstützen.
Building von BuildX
Überprüfen Sie die Docker-Version - Die Unterstützung für mehrere Plattformen wurde erst in Docker Version 19.03 und später eingeführt. Überprüfen Sie Ihre Version mit dem Befehl:
docker --version docker buildx versionInstallation von buildX auf einer Mageia-Distribution
urpmi docker-buildx
Installation von buildX auf einer Debian-Linux-Distribution, einschließlich des Docker selbst:
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Konfigurieren Sie Docker so, dass es buildX verwendet und in der Lage ist, für amd64- und arm64-Architekturen zu bauen.
docker buildx create --use
Um die verfügbaren Builder aufzulisten, verwenden Sie den Befehl:
docker buildx lsSetzen Sie buildx als Standardbuilder für Docker:
docker buildx use defaultMit dem folgenden Befehl wird der angegebene buildx-Builder entfernt.
docker buildx rm builder_name
Builder-Bild
Um das Build-Image für arm64 auszuführen, verwenden Sie zum Beispiel diesen Befehl:
docker buildx build --platform linux/arm64 .
Build für zwei Architekturen zur gleichen Zeit:
docker buildx build --platform=linux/amd64,linux/arm64 .
Standardaufbau und nachträgliche Anschlüsse
Wenn Sie ein Build-Image für eine andere Architektur lösen müssen, haben Sie normalerweise eine solche Architektur zur Verfügung.
Dann besteht eine schnelle und einfache Implementierung darin, einen Build auf jeder Architektur durchzuführen, um ein Push-Image zu erstellen und dieses dann zu einem Multiplattform-Image zusammenzuführen.
Bei diesem Prozess müssen Sie die Docker-Konfiguration in keiner Weise ändern und der Build ist sehr schnell.
Er ist auch deshalb so schnell, weil der Build nativ erfolgt, ohne eine andere Prozessorarchitektur zu emulieren.
Build-Image für AMD64 auf einem x86-PC:
docker build ./ -t josefjebavy/debian-apache-php-test:amd64 docker push josefjebavy/debian-apache-php-test:amd64
Build-Image für ARM64 z.B. auf RaspberryPI:
docker build ./ -t josefjebavy/debian-apache-php-test:arm64 docker push josefjebavy/debian-apache-php-test:arm64
Erstellen eines Manivests für AMD64-Imge und für ARM64-Imge:
docker manifest annotate josefjebavy/debian-apache-php-test:latest josefjebavy/debian-apache-php-test:amd64 --os linux --arch amd64 docker manifest annotate josefjebavy/debian-apache-php-test:latest josefjebavy/debian-apache-php-test:arm64 --os linux --arch arm64
Erstellung eines Manifests für das Master-Image, das das Image mit bestimmten Architekturen verknüpft:
docker manifest create josefjebavy/debian-apache-php-test:latest \ --amend josefjebavy/debian-apache-php-test:amd64 --amend josefjebavy/debian-apache-php-test:arm64
Pushen des Manifests in die Docker-Registry:
docker manifest push josefjebavy/debian-apache-php-test:latestDas resultierende Multi-Paltform-Image kann hier angesehen werden: https://hub.docker.com/r/josefjebavy/debian-apache-php-test und sogar herunterladen und testen. Zum Beispiel, indem man es in Docker mit dem Befehl
docker run -p 80:80 -it --rm --name www --env="VAR=loremimpus" josefjebavy/webapp-test:latestoder Kuberteness. Mit diesem Image können Sie den Container sowohl auf x86_64 PCs als auch auf ARM ausführen.
Videobeispiel
Video-Demonstration, wie man ein Image in Dockerhub erstellt, das für x86_64 und für ARM ist.
Links
Artikel zu einem ähnlichen Thema
VMware vs. Proxmox: Leistungsvergleich
GitLab CI/CD: Testautomatisierung und Anwendungsbereitstellung
VPS von VMware zu Proxmox migrieren
VMware-Lizenzierungsänderung
Ausführen von Microsoft SQL Server unter Linux
Sicherung: der Proxmox Backup Server
Linux als Router und Firewall
Hochladen eines Docker-Images in die Docker-Registry
Linux: Verwaltung logischer Datenträger
Linux-Software-RAID
Ausführen einer Webanwendung hinter einem Proxy
Migration von Postfächern
Mehrstufige Docker-Erstellung
Sichern Ihrer Daten durch Einschalten des Computers
Podman
Importieren von Windows in die Proxmox-Virtualisierung
Docker und PHP-Mail
Proxmox-Virtualisierung
Docker und Cron
Lenovo ThinkPad X1 Carbon: Inbetriebnahme des LTE-Modems EM7544
Yocto-Projekt: Erstellen eines eigenen Betriebssystems für eingebettete Geräte
Vorbereiten eines Linux-Servers für die Ausführung einer Webanwendung in Python
Wie man eine schlechte Dateifreigabeleistung in Docker behebt
Wie man Docker richtig einsetzt
Installation von Linux auf einem dedizierten HPE ProLiant DL320e Server
Wie man eine Webanwendung einem Belastungstest unterzieht
Warum das JFS-Dateisystem verwenden
Booten von einer 4TB-Festplatte mit GTP unter UEFI
Btrfs-Dateisystem
Raspberry PI
WINE - Ausführen von Windous Programmen unter Linux
GNU/Linux-Betriebssystem
Newsletter
Wenn Sie daran interessiert sind, gelegentlich Neuigkeiten per E-Mail zu erhalten.
Sie können sich registrieren, indem Sie Ihre E-Mail-Adresse eingeben
News-Abonnement.
+