Docker build multiarch image
24 de febrero de 2025Si utilizas Docker en una RaspberryPi o Mac, te darás cuenta de que no todas las imágenes Docker se ejecutan siempre allí. En este artículo describiré cómo solucionar esto con una imagen multiplataforma.
La razón por la que no puedes ejecutar el contenedor en una Raspberry PI o Mack es que estos dispositivos tienen un procesador con arquitectura ARM, que es una arquitectura diferente a la x86-64 de los PC normales.
Una forma de abordar esto es hacer una imagen de compilación localmente en el dispositivo.
Pero tendría que realizar la compilación cada vez en cada dispositivo.
Es mejor crear una compilación multiarquitectura, en la que se crea una imagen Docker para varias arquitecturas de CPU.
Creas dicha imagen una sola vez y la subes a image registry en Docker hub o GitLab.
Y todos los demás con un PC, RaspberryPI y Mac descargarán entonces la imagen terminada para su arquitectura de CPU y ejecutarán el contenedor desde ella si es necesario.
Así que no tendrán que hacer la imagen de construcción localmente en su máquina.
Suponiendo, por supuesto, que la construcción se hace para su CPU también.
Hoy en día es común que todas las imágenes base estén construidas para x86-64 y ARM.
Qué es una imagen Docker desde un punto de vista técnico?
Y típicamente es todo software de código abierto. Gracias a ello, dicho software se ejecuta en muchos tipos de arquitecturas.
Dicho software también se ejecuta en muchos sistemas operativos.
Estamos hablando de Docker y esos son contenedores Linux. Y esos sólo pueden ejecutarse en Linux, aunque sea una máquina virtual Linux ejecutándose en Windows o Mac.
Por supuesto tu imagen Docker privada contiene lo que tu pongas ahí. Así, por ejemplo, también el software propietario y su independencia del sistema operativo, la distribución de Linux y la arquitectura de la CPU depende exclusivamente de usted.
Así que si no has tenido esto en cuenta, puede ocurrir que sin más modificaciones tu software no funcione en un ordenador con una CPU ARM.
La documentación de Docker utiliza el término multi-platform build y yo prefiero utilizar el término multi-arch build.
Hoy en día se utilizan image/containers del estándar OCI y estos tienen soporte de build multiplataforma. Antaño docker no usaba este estándar, así que no esperes poder usar build multiplataforma en sistemas antiguos.
Dónde verás CPUs ARM
Cuando normalmente tienes que lidiar con el uso de una construcción multiplataforma:
- Sus desarrolladores están utilizando Macs de Apple, que en las nuevas versiones tienen una CPU ARM.
- Desea optimizar costes en AWS por lo que ha decidido utilizar un VPS con una CPU ARM.
- Quieres comprar nuevos servidores modernos con CPUsas ARM por ejemplo HP proliant.
Dos maneras
La configuración de compilación, el Dockerfile, permanece sin cambios.
Hay dos maneras de hacer una imagen Docker build multiplataforma:
- Utilizar BuildX y hacer algo como cross build.
- Hacer una build en una plataforma determinada y luego combinarla en una imagen multiarco.
ConstruirX
Buildx es una extensión de Docker que proporciona funcionalidad avanzada para construir contenedores. Forma parte de la CLI de Docker y permite construir imágenes utilizando BuildKit, que es un sistema de construcción de Docker moderno con un rendimiento y flexibilidad mejorados.
Una de las características clave de buildx es el soporte para construcciones multiplataforma. Así que puede construir imágenes para diferentes arquitecturas (por ejemplo, linux/amd64, linux/arm64). Sin embargo, en algunos casos, debido a la emulación, tal construcción para una arquitectura diferente puede ser muy lento.
Por defecto, la distribución Linux Mageia o Debian no utiliza buildX, por lo que por defecto no soporta compilaciones multiplataforma.
Construyendo BuildX
Verifica la versión de Docker - El soporte multiplataforma sólo llegó a la versión 19.03 y posteriores de Docker. Comprueba tu versión con el comando:
docker --version docker buildx versionInstalación de buildX en una distribución de Mageia
urpmi docker-buildx
Instalando buildX en una distribución Linux debian, incluyendo el propio docker:
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
Configurar docker para usar buildX y poder construir para arquitecturas amd64 y arm64.
docker buildx create --use
Para listar los constructores disponibles, utiliza el comando:
docker buildx lsEstablece buildx como el constructor por defecto para docker:
docker buildx use defaultEl siguiente comando elimina el constructor buildx especificado.
docker buildx rm nombre_constructor
Imagen build
Para ejecutar build image para arm64, por ejemplo, usa este comando:
docker buildx build --platform linux/arm64 .
Construir para dos arquitecturas al mismo tiempo:
docker buildx build --platform=linux/amd64,linux/arm64 .
Construcción estándar y conexiones posteriores
Si necesitas resolver una imagen build para alguna otra arquitectura, lo normal es que dispongas de dicha arquitectura.
Entonces una implementación rápida y fácil es realizar un build en cada arquitectura para realizar una imagen push y luego fusionar eso en una imagen multiplataforma.
Es un proceso en el que no tienes que modificar la configuración de docker de ninguna manera y la construcción es muy rápida.
También es rápido porque la build se realiza de forma nativa sin emular otra arquitectura de procesador.
Imagen de compilación para AMD64 en PC x86:
docker build ./ -t josefjebavy/debian-apache-php-test:amd64 docker push josefjebavy/debian-apache-php-test:amd64
Construir imagen para ARM64 por ejemplo en RaspberryPI:
docker build ./ -t josefjebavy/debian-apache-php-test:arm64 docker push josefjebavy/debian-apache-php-test:arm64
Creando un manivest para AMD64 imge y para 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
Crear un manifiesto para la imagen maestra que vincule la imagen a arquitecturas específicas:
docker manifest create josefjebavy/debian-apache-php-test:latest \ --amend josefjebavy/debian-apache-php-test:amd64 --amend josefjebavy/debian-apache-php-test:arm64
Pushing el manifiesto al registro docker:
docker manifest push josefjebavy/debian-apache-php-test:latestLa imagen multipalo resultante se puede ver aquí: https://hub.docker.com/r/josefjebavy/debian-apache-php-test e incluso descargarla y probarla. Por ejemplo, ejecutándola en Docker con el comando
docker run -p 80:80 -it --rm --name www --env="VAR=loremimpus" josefjebavy/webapp-test:latesto Kuberteness. A partir de esta imagen usted será capaz de ejecutar el contenedor en ambos x86_64 PC allí en ARM.
Vídeo de ejemplo
Vídeo demostración de cómo crear una imagen en dockerhub que será para x86_64 y para ARM.
Enlaces
Artículos sobre un tema similar
VMware frente a Proxmox: comparación de rendimiento
GitLab CI/CD: automatización de pruebas y despliegue de aplicaciones
Migración de VPS de VMware a Proxmox
Cambio en las licencias de VMware
Ejecución de Microsoft SQL Server en Linux
Copia de seguridad: el Proxmox Backup Server
Linux como router y cortafuegos
Cómo subir una imagen Docker al Registro Docker
Linux: gestión de volúmenes lógicos
Software RAID para Linux
Ejecutar una aplicación web detrás de un proxy
Migración de correo electrónico
Construcción multietapa Docker
Copia de seguridad de los datos al encender el ordenador
Podman
Importación de Windows a la virtualización Proxmox
Docker y correo PHP
Virtualización Proxmox
Docker y Cron
Lenovo ThinkPad X1 Carbon: puesta en servicio del módem LTE EM7544
Proyecto Yocto: Cree un sistema operativo personalizado para dispositivos integrados
Preparación de un servidor Linux para ejecutar una aplicación web en Python
Cómo solucionar el bajo rendimiento de los archivos compartidos en Docker
Cómo empezar a utilizar Docker correctamente
Instalación de Linux en un servidor HPE ProLiant DL320e dedicado
Cómo poner a prueba una aplicación web
Por qué utilizar el sistema de archivos JFS
Cómo arrancar desde un disco de 4TB con GTP usando UEFI
Sistema de archivos Btrfs
Raspberry PI
WINE - ejecución de programas Windous en Linux
Sistema operativo GNU/Linux
Boletin informativo
Si está interesado en recibir noticias puntuales por correo electrónico.
Puedes registrarte rellenando tu email
suscripción de noticias.
+