in Tutorial, Tutorial Docker

Progettare e distribuire applicazioni su Raspberry Pi con Docker – Immagini multi-architettura: docker buildx

Oggi vi parlo di docker buildx, uno strumento per costruire immagini multi-architettura tutte su un singolo computer.

Introduzione – Architettura di un Processore

Un problema in cui si incappa facilmente utilizzando Docker su diverse piattaforme è quello del dovere avere diverse architetture di riferimento per le proprie immagini. Questo è un problema in cui noi stessi, in questa serie di tutorial, incapperemmo se producessimo immagini partendo da un nostro pc verso un Raspberry Pi.

Perché? La maggior parte dei computer oggi in utilizzo ad uso personale contiene processsori 64-bit con architettura AMD64 (anche conosciuta come x86_64). I Raspberry Pi sono invece macchine con processori ARM ed utilizzano sistemi operativi specifici per questa architettura.

In particolare, a partire dalla versione 3, i Raspberry Pi montano una CPU ARM 64 bit, per cui sono disponibili due versioni ufficiali del Raspberry Pi OS (precedentemente noto come Raspbian): una a 32 bit ed una non stabile a 64 bit. Queste due versioni fanno riferimento, rispettivamente, alle architetture armv7l e arm64 (anche conosciuta come armv8, arm64v8, aarch64).

Buildare su architetture diverse – Un esempio

Consideriamo il programma contenuto nell’immagine esposta nell’articolo di questa serie sui Dockerfile

Ho creato l’immagine sul mio pc (un portatile x86_64 con WSL2 su Windows 10) e l’ho caricata sul mio account Docker Hub: la potete reperire al seguente indirizzo. A questo punto, scaricandola su Rasperry Pi ed eseguendola, ci si imbatte nel seguente criptico errore:

Questo errore è causato dal fatto che stiamo provando ad eseguire un’immagine creata per architetture AMD64 su una macchina ARM! Per risolvere questo problema, e creare immagini che siano indipendenti dall’architettura su cui vengono generate, andiamo a scoprire lo strumento docker buildx.

Docker buildx – Installazione ed uso

N.B. Le seguenti istruzioni sono state eseguite e testate su una macchina con Ubuntu 20.04.1; vi consiglio di avere un’installazione simile per continuare a seguire il tutorial. Il tutto dovrebbe funzionare in maniera analoga su un Raspberry Pi con Raspberry Pi OS.

Per utilizzare docker buildx avrete bisogno di avere una versione di Docker maggiore o uguale alla 19.03; per controllare che la vostra versione vada bene, potete eseguire il comando:

docker --version

Nel caso in cui la versione vada bene, buildx sarà già incluso all’interno di quanto installato con docker. Nelle impostazioni di base buildx sarà però disabilitato, in quanto è ancora uno strumento considerato in fase sperimentale.

Per abilitarlo, bisognerà cercare il file config.json nella cartella .docker presente nella home directory del vostro sistema e cambiare il flag “experimental” ad “enabled”:

Una volta abilitato buildx, possiamo procedere col creare un nuovo builder ed impostarlo come predefinito:

docker buildx create --name builder
docker buildx use builder

A questo punto possiamo generare le immagini utilizzando buildx per renderle multi-architettura. Siamo interessati principalmente a tre architetture: linux/amd64, linux/arm/v7, linux/arm64, ossia le due architetture di riferimento per i Raspberry Pi e l’architettura del pc su cui effettueremo la build.

Per fare ciò, spostiamoci nella cartella del nostro progetto che include il Dockerfile ed eseguiamo da terminale:

docker buildx build --platform linux/arm/v7,linux/arm64,linux/amd64 -t abathargh/hello-flask --push .

Dove:

  • –platform è un flag a cui passare una lista di architetture per cui generare immagini;
  • -t è il solito flag per taggare le immagini generate;
  • –push specifica che, alla fine del processo di build, vogliamo che le immagini siano caricate sul nostro Docker Hub (questo prevede l’aver effettuato il login con docker login).

È interessante notare che una volta caricate su Docker Hub, le varie immagini possono essere indirizzate come una sola. Scrivere in un Dockerfile:

FROM abathargh/hello-flask:latest

farà sì che l’immagine scaricata sarà automaticamente quella specifica dell’architettura della macchina che stiamo utilizzando, se disponibile.

Processo di build dell’immagine per ogni architettura selezionata

L’immagine su docker hub

Conclusioni

Per testare il tutto, vi invito a scaricare e mandare in esecuzione l’immagine che ho costruito in questo tutorial sul vostro Raspberry Pi. Ad esempio, potreste utilizzare il seguente comando docker run:

docker run -p 8080:8000 --name hello-flask abathargh/hello-flask

Una volta eseguito, aprite una scheda del vostro browser preferito ed andate all’indirizzo http://<hostname-raspberry>:8080 e dovreste vedere la seguente pagina:

Questo tutorial è stato volutamente di stampo pratico e meno specifico dei dettagli inerenti le modalità in cui il processo di build di docker buildx funziona.

Per eventuali approfondimenti o richieste di chiarimenti vi invito come al solito a commentare nella sezione qui sotto!

Scrivi un commento

Commento