La gestione efficiente delle immagini Docker tra ambienti di sviluppo e produzione è una sfida ancora troppo sottovalutata. Soluzioni come Docker Hub e GitHub Container Registry impongono di sottostare a compromessi in termini di sicurezza, prestazioni e semplicità operativa. A questi problemi risponde Unregistry, un progetto che, affiancato dallo strumento docker-pussh
, consente il trasferimento diretto delle immagini tra host Docker tramite SSH, evitando ogni necessità di infrastrutture aggiuntive.
Il problema della gestione delle immagini Docker
Quando si lavora con Docker, la nota piattaforma per creare, eseguire e distribuire applicazioni all’interno di container, uno degli aspetti fondamentali è proprio la gestione delle immagini.
Un’immagine rappresenta tutto ciò che serve per eseguire un’applicazione: il codice, le librerie, le dipendenze e le istruzioni di avvio. Una volta costruita un’immagine in locale, per eseguirla su un altro server (ad esempio un ambiente di produzione o di test), è necessario trasferirla.
Il metodo più comune per farlo è utilizzare un registro di immagini (“registry”), ovvero un servizio online progettato per conservare, organizzare e distribuire immagini Docker. I registri più noti sono Docker Hub (il registry ufficiale di Docker), GitHub Container Registry, GitLab Container Registry, Harbor e altri, sia pubblici che privati. Il processo standard funziona così:
- Lo sviluppatore costruisce un’immagine sul proprio computer.
- Esegue un comando
docker push
per caricarla nel registry remoto. - Il server di destinazione (ad esempio il server in produzione) scarica l’immagine eseguendo
docker pull
dallo stesso registry.
Questo flusso di lavoro funziona bene in molti casi, ma ha anche dei limiti. Utilizzare un registry implica che la connessione Internet sia attiva e funzionante, una registrazione e autenticazione al servizio, eventuali costi aggiuntivi per avere repository privati o maggiori quote di traffico, una gestione separata delle immagini e delle autorizzazioni, il rischio di esporre involontariamente dati sensibili se le immagini non sono protette correttamente.
In alternativa, esistono metodi come docker save
e docker load
, che permettono di esportare e importare le immagini manualmente, ma anche questi approcci hanno i loro svantaggi: trasferiscono sempre l’intera immagine, anche se la maggior parte dei dati è già presente sul server di destinazione.
Trasferire un’immagine Docker non dovrebbe essere così difficile
L’autore del progetto Unregistry spiega che con il comando docker pussh
, il deployment di immagini Docker è semplificato al massimo:
docker pussh myapp:latest user@remote-server
Nessuna configurazione di registri, nessuna porta da esporre, nessuna necessità di archiviazione intermedia. Solo un trasferimento SSH diretto, veloce ed efficiente, che invia solo i layer mancanti.
“Sotto il cofano” il comando stabilisce un tunnel SSH verso il server remoto, si avvia un container Unregistry temporaneo lato server, il tunnel mappa una porta casuale locale su quella di unregistry, docker pussh
esegue un docker push
verso l’endpoint locale, trasferendo unicamente i layer assenti. L’immagine è immediatamente disponibile nel Docker remoto.
In sostanza, Unregistry non fa altro che avviare un comando rsync sulle immagini Docker. A questo indirizzo è riportato il comando da usare per installare e utilizzare Unregistry.