Construyendo Imágenes Multi-Arquitectura con Docker Buildx
Una de las características más poderosas de Docker Buildx es su capacidad para construir imágenes para múltiples arquitecturas simultáneamente. En este paso, aprenderemos a crear imágenes multi-arquitectura.
Comprensión de las Imágenes Multi-Arquitectura
Las imágenes multi-arquitectura permiten que el mismo nombre de imagen funcione en diferentes plataformas (como AMD64, ARM64, etc.). Docker selecciona automáticamente la versión apropiada para la arquitectura del host cuando se extrae la imagen.
Esto es especialmente útil para:
- Soportar dispositivos basados tanto en x86 como en ARM
- Asegurar que sus aplicaciones se ejecuten en varios proveedores de la nube
- Construir para dispositivos IoT con diferentes arquitecturas
Configuración para Construcciones Multi-Arquitectura
Docker Buildx necesita ser configurado para construcciones multi-arquitectura. Primero, asegurémonos de que nuestro constructor soporte esta característica:
docker buildx inspect --bootstrap mybuilder
Si ve un error sobre que el constructor no está disponible, recreémoslo con la configuración correcta:
docker buildx rm mybuilder
docker buildx create --name mybuilder --driver docker-container --bootstrap --use
Creación de una Imagen Multi-Arquitectura
Ahora, construyamos nuestra imagen Nginx para múltiples arquitecturas:
docker buildx build --platform linux/amd64,linux/arm64 -t nginx-test:multi .
Podría ver un mensaje de error similar a:
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Esto sucede porque el controlador Docker predeterminado no admite construcciones multi-arquitectura. Modifiquemos nuestro enfoque.
Para fines de demostración, construiremos para plataformas específicas por separado:
docker buildx build --platform linux/amd64 -t nginx-test:amd64 --load .
Esto construye la imagen específicamente para la arquitectura AMD64 y la carga en el almacén de imágenes local de Docker.
Uso de Argumentos de Construcción
Docker Buildx nos permite usar argumentos de construcción para personalizar nuestras construcciones. Modifiquemos nuestro Dockerfile para usar un argumento de construcción:
nano Dockerfile
Actualice el contenido del Dockerfile a:
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;"]
Presione Ctrl+O seguido de Enter para guardar, luego Ctrl+X para salir de nano.
Ahora podemos construir la imagen con un paquete personalizado:
docker buildx build --build-arg PACKAGE=nginx-extras -t nginx-extras:latest .
Empujando a un Registro (Opcional)
Para utilizar completamente las imágenes multi-arquitectura, normalmente las empujaría a un registro. Esto requiere credenciales de Docker Hub o un registro privado. En un escenario del mundo real, el comando se vería así:
## Ejemplo solamente - no requerido para este laboratorio
## docker buildx build --platform linux/amd64,linux/arm64 -t username/nginx-test:multi --push .
Inspeccionando Imágenes
Examinemos las imágenes que hemos creado:
docker images | grep nginx
Debería ver una salida similar a:
nginx-extras latest abcdef123456 1 minute ago 130MB
nginx-test amd64 123456abcdef 2 minutes ago 123MB
nginx-test latest fedcba654321 10 minutes ago 123MB
Probando Nuestra Imagen
Finalmente, ejecutemos un contenedor usando nuestra imagen para verificar que funcione:
docker run -d --name test-nginx -p 8080:80 nginx-test:latest
Verifique si el contenedor se está ejecutando:
docker ps
Debería ver una salida que indica que su contenedor se está ejecutando:
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
Hagamos un curl al servidor nginx para asegurarnos de que está respondiendo:
curl http://localhost:8080
Debería ver la página de bienvenida HTML predeterminada de Nginx.
Cuando termine, limpie el contenedor:
docker stop test-nginx
docker rm test-nginx
¡Felicidades! Ha trabajado con éxito con Docker Buildx, ha comprendido y resuelto el error "requires exactly 1 argument" (requiere exactamente 1 argumento), y ha aprendido a crear construcciones especializadas para diferentes arquitecturas.