Las imágenes multi-plataforma no son mas que una misma imagen que se puede ejecutar en distintos sistemas operativos y distintas arquitecturas.

Podemos crear imágenes para nuestros contenedores Docker con el sistema operativo LINUX:

  • linux/386 : Los i386 son la tercera generación de procesadores x86. Dejaron de fabricarse en 2007. Es compatible con los ordenadores cuyo procesador sea de 32 bits.
  • linux/amd64 : Puede correr tanto procesadores cuya versión sea de 32 bits (x84) como cuya versión sea de 64 bits (x64). AMD64 = x86-64.
  • linux/arm/v5 : No hay mucha información sobre esta versión pero parece que se utilizaba en las consolas Nintendo y en los iPod.
  • linux/arm/v7 : Es la versión que utilizan las Raspberry Pi y la mayoría de teléfonos.
  • linux/arm64 : Nueva versión que utilizan algunos teléfonos.
  • linux/mips64le : Compatible con el procesador MIPS de 1999.
  • linux/ppc64le :  Compatible con la familia de procesadores de los ordenadores PowerPC.
  • linux/s390x : Compatible con la familia de ordenadores IMB Z.

Podemos crear imágenes para nuestros contenedores Docker con el sistema operativo WINDOWS:

  • windows/amd64 : Puede correr tanto procesadores cuya versión sea de 32 bits (x84) como cuya versión sea de 64 bits (x64). AMD64 = x86-64.

También podemos crear imágenes para nuestros contenedores Docker con el sistema operativo MACOS, aunque no es muy utilizado:

  • darwin/amd64 : Puede correr tanto procesadores cuya versión sea de 32 bits (x84) como cuya versión sea de 64 bits (x64). AMD64 = x86-64.

Como hemos visto, hay muchas plataformas distintas. Incluso aunque ya no se utilicen de forma comercial o estén en desuso podemos crear contenedores para ellas.

Una pregunta usual es sobre si necesito hardware especializado o crear máquinas virtuales solo para estas tareas. La respuesta varia bastante ya que cada día salen nuevas herramientas. Sí que la mayoría de herramientas como Jenkins, GitHub Actions, CircleCI permiten crear agentes en hardware especializado. Luego ejecutamos cada docker build y por último unirlos en el mismo manifiesto. Pero poco a poco deja de ser utilizado ya que requiere gran cantidad de recursos aunque permite gestionar mayor cantidad de aspectos.

Construir imágenes DOCKER multi-plataforma (ARM, X64, etc) 0

Principalmente hay 2 formas para crear imágenes multi-plataforma. La primera forma es la más antigua, se basa en crear varias imágenes y luego unirlas. La segunda forma y más recomendada es utilizar Buildx, una herramienta de Docker que viene al instalar Docker Desktop en Windows y en MacOS y puede instalar en Linux (instrucciones de instalación).

Aunque lo más sencillo es no hacerlo en local, sino utilizar directamente herramientas para construir imágenes automatizadas como GitHub Actions o CircleCI. Ambos tienen una capa gratuita y utilizan su propia nube por lo que no nos consumen recursos.

GitHub Actions multi-arquitectura

Puedes ver más información sobre GitHub Actions en su página oficial. Pero para resumir, es ilimitado en repositorios públicos y limitados a entre 2.000 y 50.000 minutos por mes en repositorios privados. Tienen máquinas tanto Linux, Windows como MacOS.

Solo tenemos que crear un repositorio, privado o público. Podemos subir todo nuestro código en ese repositorio o si tenemos el código en otro repositorio externo podemos configurarlo para que lo descargue desde ahí, así no tenemos que mover todo.

Para crear las imágenes multi-plataforma vamos en nuestro repositorio a la pestaña de ACTIONS. Y pulsamos sobre NEW WORKFLOW. Luego pulsamos sobre Skip this and set up a workflow yourself.

Construir imágenes DOCKER multi-plataforma (ARM, X64, etc) 1

El código del workflow sería algo así (se puede usar como base). Para estar esta base necesitas configurar tu nombre de usuario y contraseña en el repositorio, pestaña SETTINGS y luego SECRETS. Puedes editar: el nombre que va a tener el workflow (name), cuando se va a ejecutar (on), el tipo de máquina que va a utilizar (runs-on), de donde va a coger el código (actions/checkout@v2), instala la herramienta buildx (crazy-max/ghaction-docker-buildx@v1), inicia sesión en DockerHub y por último puedes cambiar las plataformas que vimos al inicio, el nombre de la imagen y versión.

name: Nombre que va a aparecer de nuestro workflow

on:
  push:
    branches: master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install buildx
        id: buildx
        uses: crazy-max/ghaction-docker-buildx@v1
        with:
          version: latest
      - name: Login to Docker Hub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
      - name: Build the image
        run: |
          docker buildx build --push \
            --tag nombre-usuario/nombre-paquete:latest \
            --platform linux/amd64,linux/arm/v7 .

 

El resultado después de guardarlo y que se ejecute es el siguiente en nuestro DockerHub. Y por lo tanto en este ejemplo se puede ejecutar la imagen tanto en cualquier Linux con procesadores de 34 o 64 bits como en ARM con V7 como por ejemplo las Raspberry Pi.

Construir imágenes DOCKER multi-plataforma (ARM, X64, etc) 2

Más información:

  • Repositorio del plugin para GitHub Actions: https://github.com/crazy-max/ghaction-docker-buildx
  • Documentación oficial de Docker para Buildx: https://docs.docker.com/buildx/working-with-buildx
  • Otra forma de hacer imágenes multi-plataforma: https://www.docker.com/blog/multi-platform-docker-builds
  • Crear imágenes multi-plataforma en local: https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way