• Activar soporte multi arquitectura en Docker

    En Debian es bastante habitual encontrarnos con la necesidad de ejecutar o construir contenedores que no coinciden con la arquitectura de nuestro sistema. El caso más común es un host x86_64 desde el que queremos trabajar con imágenes ARM o ARM64, ya sea para routers, SBCs o entornos embebidos. Por defecto, un sistema Debian x86_64 no puede ejecutar binarios ARM. Esto implica que no podemos lanzar contenedores ARM ni construir imágenes multi-arquitectura directamente. Docker necesita que el kernel sepa cómo interpretar esos binarios y redirigir su ejecución a un emulador.  Aquí es donde entra el módulo binfmt_misc del kernel de Linux (que viene por defecto en Debian) y el registro automático de arquitecturas adicionales.

    La forma más directa y mantenible de habilitar binfmt en Debian es usando una imagen especializada que se encarga de registrar todas las arquitecturas soportadas en el kernel.

    sudo docker run --privileged --rm tonistiigi/binfmt --install all
    

    Este comando lanza un contenedor temporal con privilegios completos sobre el sistema. Dicho contenedor registra en binfmt_misc todas las arquitecturas conocidas y las asocia a los binarios QEMU correspondientes. El resultado es que el kernel de Debian aprende a reconocer binarios ARM, ARM64, RISC-V, PowerPC y otros, y los ejecuta automáticamente mediante emulación cuando Docker los necesita.

    Una vez ejecutado el comando, Debian queda preparado para:

    • Ejecutar contenedores ARM en un host x86_64
    • Usar Docker buildx para construir imágenes multi-arquitectura
    • Probar imágenes destinadas a dispositivos embebidos sin hardware real

    Tras habilitar binfmt, podemos lanzar directamente una imagen ARM desde un sistema x86 sin errores de arquitectura:

    docker run -it arm64v8/debian
    

    Docker descargará la imagen ARM64 y el kernel Debian se encargará de ejecutarla usando QEMU de forma transparente.

    Esta técnica se basa en emulación, no en virtualización. El rendimiento es inferior al de la arquitectura nativa y no está pensada para cargas pesadas de producción. Además, el uso del flag privileged implica que el contenedor tiene acceso completo al sistema. Por este motivo, este comando debe ejecutarse solo en sistemas de confianza y preferiblemente una única vez.


    Los comentarios están cerrados.