Docker build multiarch image

24. února 2025

Lang: cs en de es

Pokud používáte Docker na RaspberryPi nebo na počítači Mac, narazíte na to, že ne vždy tam jdou všechny docker image spustit. Jak to vyřešit pomocí multi-platform image, vám popíši v tomto článku.

Důvod toho proč vám nešel spustit kontejner na Raspberry PI nebo Macku je, že na těchto zařízení je procesor s architekturou ARM, což je jiná architektura než x86-64 na běžných PC. Jednou z možností, jak to řešit je provést build image lokálně na daném zařízení. Ale to by jste museli provádět build pokaždé na každém zařízení. Lepší vytvořit tzv. multiarch build, kdy vytvoříte docker image, který je pro více CPU architektur.
Takový image vytvoříte pouze jednou a nahrajete ho do image registry na Docker hub nebo GitLab. A všichni ostatní s PC, RaspberryPI a Mac pak v případě potřeby stáhnou hotový image pro jejich CPU architekturu a spustí z něj kontejner. nebudou tedy muset děla build image lokálně na své počítači. Samozřejmě za předpokladu, že je build proveden i pro jejich CPU.

Dneska je již běžné, že všechny základní image jsou buildovány pro x86-64 a ARM.

Co je z technického pohledu Docker image? Je to archiv nějaké linuxové distribuce typicky včetně nějaké aplikace. A typicky je to všechno opensource software. Díký tomu takový software beží na mnoha typech architekturách. Takový software běží i na mnoha operačních systémech.
My se tu bavíme o Dockeru a to jsou Linuxové kontejnery. A ty jdou provozovat pouze na Linuxu, byť to třeba bude virtuální stroj s Linuxem provozovaný ve Windows nebo Macku.
Samozřejmě váš privátní doker image obsahuje to co si tam dáte. Tedy například i proprietární software a tam už nezávislost na OS, linuxové distribuci a CPU architektuře je čistě na vás. Takže pokud jste na to nebrali zřetel, tak se může stát, že bez dalších úprav váš software nepoběží na počítači s CPU ARM.

V Docker dokumentaci se používá pojem multi-platform build a radši používám pojem multi-arch build.

Dneska se používají image/kontejnery standardu OCI a ty mají podporu multi-platform build. Kdysi dávno docker nepoužíval tento standard, takže na starých systémech neočekávejte možnost použití multi-platform buildu.

Kde se setkáte s CPU ARM

Kdy typicky se budete muset zabývat použitím multi-platform buildu?:

  • Vaši vývojáři používají Apple Mac, který v nových verzích má CPU ARM.
  • Chcete optimalizovat náklady v AWS a tak jste se rozhodli používat VPS s CPU ARM.
  • Chcete nakoupit nové moderní servery s ARM CPU např HP proliant.

Dvě cesty

Konfigurace pro build, tedy Dockerfile zůstává beze změny.
Jsou dvě cesty jak udělat multi platform build docker image:

  1. Použít BuildX a provést něco jako cross build.
  2. Udělat build na dané platformě a pak to spojit v multi arch image.

BuildX

Buildx je rozšíření Dockeru, které poskytuje pokročilé funkce pro buildování kontejnerů. Je součástí Docker CLI a umožňuje sestavovat obrazy pomocí BuildKit, což je moderní build systém Dockeru s lepším výkonem a flexibilitou.

Jednou z klíčových vlastnosti buildx je podpora multi-platformních buildů. Čili možňuje buildovat obrazy pro různé architektury např. linux/amd64, linux/arm64). Ovšem v některých případech díky emulaci mlže být takový build pro jinou architekturu i velmi pomalý.

By default linuxová distribuce Mageia ani Debian nepoužívá buildX, takže by default neumí multiplatformní buildy.

Zprovoznění BuildX

Ověřte verzi Dockeru – Multi-platformní podporu přinesla až Docker verze 19.03 a novější. Zkontrolujte svou verzi příkazem:

docker  --version
docker buildx version

Instalace buildX na distribuci Mageia
urpmi docker-buildx

Instalace buildX na linuxové distribuci debian, včetně samotného dockeru:

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

Konfigurace dockeru aby používal buildX a byl schopen buildit pro architektury amd64 a arm64

docker buildx create --use

K výpisu builderů, kterou jsou k dispozici slouží příkaz:

docker buildx ls
Nastevení buildx jako default builder pro docker:
docker buildx use default
Následující příkaz odstraní zadaný buildx builder.
docker buildx rm název_builderu

Build image

Spuštění buildu image pro arm64 provedete například takovým to příkazem:

docker  buildx build --platform linux/arm64 .

Build pro dvě architektury zároveň:

docker buildx build --platform=linux/amd64,linux/arm64 .

Standardní build a následné spojení

Pokud potřebujete řešit build image pro nějakou jinou architektu, tak typicky takovou architekturu máte k dispozici. Pak je rychlá a jednoduchá realizace provést build na jednotlivých architekturách provést push image a spojit to pak do multi-platform image.
Je to postup, kdy nijak nemusíte upravovat konfiguraci dockeru a build je velmi rychlý. Rychlý je i proto, že build probíhá nativně tedy bez emulace jiné procesorové archtektury.

Build image pro AMD64 na x86 PC:

docker build  ./ -t josefjebavy/debian-apache-php-test:amd64
docker push  josefjebavy/debian-apache-php-test:amd64

Build image pro ARM64 např na RaspberryPI:

docker build ./ -t josefjebavy/debian-apache-php-test:arm64
docker push josefjebavy/debian-apache-php-test:arm64

Vytvoření manivestu pro AMD64 imge a pro ARM64 image:

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

Vytvoření manifestu pro hlavní image, který spojuje image pro konkretní architektury:

docker manifest create josefjebavy/debian-apache-php-test:latest \
   --amend josefjebavy/debian-apache-php-test:amd64   --amend josefjebavy/debian-apache-php-test:arm64

Pushnutí manifestu do docker registry:

docker manifest push josefjebavy/debian-apache-php-test:latest
Výsledný multi-paltform image si můžete prohlédnou zde: https://hub.docker.com/r/josefjebavy/debian-apache-php-test a i si ho stáhnout a vyzkoušet. Například spuštením v Dockeru příkazem
docker run -p 80:80 -it --rm --name www --env="VAR=loremimpus" josefjebavy/webapp-test:latest
nebo Kuberteness. Z tohoto image se vám podaří spustit kontejner jak na x86_64 PC tam na ARMu.

Video ukázka

Video ukázka jak vytvořit image v dockerhubu, který bude pro x86_64 a pro ARM.

Odkazy

Články na podobné téma

VMware vs Proxmox: porovnání výkonu
GitLab CI/CD: automatizace testů a nasazení aplikace
Migrace VPS z VMware na Proxmox
Změna licencování VMware
Provoz Microsoft SQL serveru na Linuxu
Zálohování: Proxmox backup server
Linux jako router a firewall
Jak náhrát docker image do Docker Registry
Linux: Logical Volume Management
Linuxový softwarový RAID
Provoz webové aplikace za proxy
Migrace mail schránek
Docker multistage build
Zálohování dat zapnutím počítače
Podman
Import Windows do virtualizace Proxmox
Docker a PHP mail
Virtualizace Proxmox
Docker a Cron
Lenovo ThinkPad X1 Carbon: zprovoznění LTE modemu EM7544
Yocto Project: Build vlastního operačního sytému pro embedded zařízení
Příprava linuxového serveru pro běh webové aplikace v jazyce Python
Jak řešit špatný výkon sdílených souborů u Dockeru
Jak začít správně používat Docker
Instalace Linuxu na dedikovaný server HPE ProLiant DL320e
Jak provést zátěžový test webové aplikace
Proč používat filesystém JFS
Jak bootovat z 4TB disku s GTP pomocí UEFI
Jak nainstalovat operační systém Mageia Linux bez DVD mechaniky
Souborový systém Btrfs
Raspberry PI
Jak zprovoznit vzdálené přehrávání přes síť na televizi s DLNA
Upgrade Mandriva Linuxu za běhu
Poznámky ke GNU/Linux
WINE - spouštíme programy pro Windous pod Linuxem
Operační systém GNU/Linux

Odběr novinek

Pokud máte zájem dostávat příležitostně na email novinky.
Můžete se vyplněním emailu registrovat k odběru novinek.


+