Contents
- Backup e ripristino del contenitore Docker
- Backup e ripristino dei volumi Docker
- Approccio alternativo al backup & restore dei volumi Docker
- Buone pratiche di gestione dei volumi Docker
- Script personalizzati e immagini Docker
- Volumi Backup & Share
- SnapShooter di Digital Ocean
- Duplicati
- Backup e ripristino di Docker con Bacula Enterprise
Sebbene Docker – e tutti i container – siano in genere un po’ più recenti in un ambiente IT di produzione rispetto alla maggior parte delle altre tecnologie, è comunque necessario eseguire il backup di questi container, delle loro applicazioni e dei loro dati persistenti. Se un sistema IT di produzione produce dati persistenti, tali dati avranno probabilmente un certo valore. Potrebbero persino essere di importanza critica. Pertanto, è probabilmente necessario salvaguardare questi dati nel caso in cui si verifichi una sorta di disastro, ad esempio a seguito di una violazione dei dati o di un errore umano.
Questo argomento tratta sia la capacità di Docker di creare backup da solo, sia la capacità di varie soluzioni di terze parti di creare backup Docker completi, come Bacula Enterprise.
Backup e ripristino del contenitore Docker
Di solito si inizia con il commit del contenitore in questione come immagine, utilizzando il seguente comando:
# docker commit -p [container-id] backup01
sha256:89682d4xxxxxx
Questa immagine può essere salvata come file .tar con un altro comando:
# docker save -o backup01.tar backup01
# ls -al | grep back
-rw——- 1 root root 178697728 Mar 31 23:35 backup01.tar
Il file .tar può anche essere salvato sul punto di montaggio NFS. Un’alternativa è quella di spingere l’immagine in questione (backup01) direttamente nel registro locale. Per farlo, dovremo prima etichettare in modo appropriato l’immagine:
# docker tag backup01 localhost:5000/backup-image:v1
In questo caso localhost è il nome della posizione e 5000 è il numero di porta. Entrambi possono essere modificati se necessario. È anche importante ricordare che sia il nome del tag che il repository devono essere in minuscolo, affinché il tag venga applicato correttamente. Il processo è completo con l’avvio del comando push:
# docker push backup-image:v1
Poiché abbiamo parlato di due metodi di backup, ci saranno anche due metodi di ripristino. Per ripristinare l’immagine di backup da un file .tar dovrà avviare il seguente comando:
# docker load -i /tmp/backup01.tar
La riga di comando dovrebbe mostrare le righe di stato successive se il comando è stato inserito correttamente:
ff91b8b5abb1: Loading layer [======================>] 2.56 kB/2.56 kB
Loaded image: backup01:latest
Un altro comando chiamato docker run può essere utilizzato per creare un contenitore da questa immagine.
Un’immagine spinta può essere estratta direttamente con un comando relativamente semplice:
# docker pull localhost:5000/backup-image:v1
Come nell’esempio precedente, sia il nome localhostche il numero di porta sono soggetti a modifica, se necessario.
Backup e ripristino dei volumi Docker
Un altro tipo di backup di Docker è tramite i volumi – fornitori di storage persistente per i contenitori Docker. Questi volumi devono essere sottoposti a backup per la continuità dei dati.
Quando si tratta di gestire i dati persistenti all’interno dei container Docker in esecuzione, i volumi Docker sono il modo più consigliato per gestire il tutto. Questo tipo di approccio offre diversi vantaggi. Ad esempio, i dati archiviati nel contenitore Docker tramite i volumi vengono isolati in modo efficace dal resto del file system, rendendo molto più difficile essere colpiti da cyberattacchi a livello di sistema. Tuttavia, questo tipo di isolamento rende anche più difficile creare volumi di backup Docker.
Inoltre, i volumi eliminano la necessità di preoccuparsi di GUI e UID tra il sistema di container Docker e il sistema operativo. I volumi stessi sono portatili quando si tratta di diverse installazioni Docker, il che significa che non è necessario preoccuparsi del sistema operativo dell’host. Allo stesso tempo, questo approccio portatile rende possibile la gestione dei volumi Docker con vari strumenti esterni, come l’archiviazione basata su bucket, nfs, ecc.
Poiché i volumi Docker sono al limite della necessità per creare realisticamente diversi contenitori Docker con dati persistenti, è naturale assicurarsi di avere anche volumi di backup Docker – questo tipo di dati è importante almeno quanto qualsiasi altro dato all’interno del sistema, se non di più.
Naturalmente, l’utilizzo dei volumi Docker per archiviare i dati dei container potrebbe non essere esattamente conveniente e ci sono alcuni problemi di crescita. Ad esempio, dovrebbe imparare diversi comandi per fare qualcosa di semplice come copiare le informazioni dal contenitore. Dovrebbe anche conoscere diversi comandi per poter prendere una shell su un Docker in esecuzione per poter vedere lo stato attuale.
La totalità dei dati del volume Docker potrebbe essere più difficile da rendere visibile all’interno del suo file system centralizzato, in quanto funziona in modo leggermente diverso rispetto alle posizioni di archiviazione tradizionali – e dovrebbe creare volumi di backup Docker per lo stesso scopo per cui solitamente crea backup dei suoi dati regolari.
Di solito, i volumi Docker sono gestiti dal demone Docker, tuttavia non interagiremo affatto con esso. L’idea di un volume di backup Docker è di ottenere una copia del volume come file compresso in una delle directory locali. Questa copia è il backup che stiamo cercando.
In questo esempio il nostro contenitore in questione si chiama dckr-site con il volume chiamato dckr-volume, è montato su /var/lib/dckr/content/ e vi memorizza tutti i dati.
Il primo passo consiste nell’arrestare il contenitore utilizzando il seguente comando:
$ docker stop dckr-site
La prossima si concentra sia sul montaggio del contenitore che sul backup del contenuto del volume:
$ mkdir ~/backup
$ docker run –rm –volumes-from dckr-site -v ~/backup:/backup ubuntu bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar .”
In questo scenario:
- docker run è utilizzato per creare un nuovo contenitore,
- -rm comando che indica al sistema di rimuovere il contenitore una volta completata l’operazione;
- –volumes-from dckr-site monta i volumi del contenitore nel nostro nuovo contenitore temporaneo;
- bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar” crea un backup da tutti i contenuti della cartella /backup/
Il processo di ripristino di questi backup non è molto complicato. Inizia con la creazione di un nuovo volume con il seguente comando:
$ docker volume create dckr-volume-2
Quindi può utilizzare il seguente comando per ripristinare il volume da un contenitore temporaneo in un file .tar:
$ docker run –rm -v dckr-volume-2:/recover -v ~/backup:/backup ubuntu bash -c “cd /recover && tar xvf /backup/dckr-site.tar”
Naturalmente, dovrà montare questo nuovo volume nel nuovo contenitore per farlo funzionare correttamente:
$ docker run -d -v dckr-volume-2:/var/lib/dckr/content -p 80:2368 dckr:latest
Se la procedura viene eseguita correttamente, l’intero stato dell’applicazione dovrebbe essere ripristinato. È importante ricordare che questo metodo non dovrebbe essere utilizzato come unica fonte di backup, poiché i dati di backup sono ancora memorizzati sull’host e quindi andrebbero persi in caso di perdita di dati o di disastro che colpisca anche l’host.
Approccio alternativo al backup & restore dei volumi Docker
È naturale che tutti i sistemi moderni si evolvano e cambino nel corso del tempo, e Docker non fa eccezione, soprattutto con una comunità così vasta di utenti e sviluppatori. Ad esempio, esiste un approccio alternativo al backup dei volumi Docker che alcuni utenti potrebbero preferire alla prima opzione, per un motivo o per l’altro.
Il primo passo consiste nel definire il nome del volume. Il comando in questione differisce per gli utenti Windows (PowerShell) e Linux/macOS, i primi hanno bisogno del comando $VOLUME=”name_volume”, mentre i secondi si affidano al comando VOLUME=”name_volume”.
Una volta completato, la prima opzione è quella di eseguire un comando di Backup:
docker run –rm \
-v “${VOLUME}:/data” \
-v “${PWD}:/backup-dir” \
ubuntu \
tar cvzf /backup-dir/backup.tar.gz /data
La parte /data rappresenta la destinazione di destinazione e può essere modificata se necessario.
Il comando Ripristino sarebbe diverso da questo, ovviamente, e l’esempio qui sotto lo dimostra bene:
docker run –rm \
-v “${VOLUME}:/data” \
-v “${PWD}:/backup-dir” \
ubuntu \
bash -c “rm -rf /data/{*,.*}; cd /data && tar xvzf /backup-dir/backup.tar.gz –strip 1”
Va notato che la parte rm -rf /data/{*,.*} esiste per eliminare tutti i file esistenti prima del ripristino del backup, ma la natura di Docker significa che include due comandi diversi: uno per eliminare tutti i file e le cartelle che iniziano con un punto, e l’altro per i file che non iniziano con un punto. Tuttavia, in ogni contenitore ci sono due “file” invisibili chiamati “.” e “..” che non sono tecnicamente dei file, per cui non possono essere eliminati.
Per questo motivo, i primi due messaggi di output dopo l’esecuzione del comando Ripristina riguarderanno l’impossibilità di rimuovere questi file – questo è normale e non influisce in alcun modo sul resto del processo.
Ci sono alcune differenze fondamentali tra questo metodo e quelli che abbiamo offerto in precedenza:
- I tre argomenti tar precedentemente esistenti (c, v e f, come in cvf) sono ora inclusi come cvzf – in modo che il file di backup venga automaticamente compresso dopo la sua creazione.
- I percorsi di destinazione del volume di backup sono specificati in ogni comando di backup, rendendoli più facili da individuare in seguito. Si tratta di un approccio diverso dall’utilizzo del comando –volumes-from, poiché quest’ultimo non mostra i nomi dei volumi o i loro percorsi di destinazione all’utente in questione.
- Il processo di ripristino include il comando per eliminare tutti i dati del volume esistente prima di eseguire un’operazione di ripristino, per garantire un processo di ripristino corretto. Inoltre, c’è un motivo per utilizzare il punto e virgola tra i comandi tar xvzf e rm, poiché l’utilizzo di && (simile a come fa il nostro primo metodo) significa che l’intera catena di comandi si interrompe completamente dopo aver affrontato il primo comando fallito.
Naturalmente, questo particolare comando è adatto solo come esempio manuale per i backup dei volumi Docker, poiché ogni singola esecuzione del comando produce un backup full – cosa che sarebbe altamente inefficiente sia in termini di tempo che di spazio di archiviazione se questo comando dovesse essere automatizzato ed eseguito regolarmente (e nemmeno la compressione può risolvere questo problema).
Buone pratiche di gestione dei volumi Docker
Lavorare con i volumi Docker può essere una sfida: è uno strumento molto utile, ma ha le sue sfumature a cui la maggior parte degli utenti deve abituarsi prima o poi. Per rendere questo processo un po’ più semplice, possiamo esaminare alcuni consigli e best practice per la gestione dei volumi Docker:
- Implementare metodi coerenti per attaccare e staccare i volumi ai contenitori.
- Impiega convenzioni di denominazione coerenti e significative per facilitare l’identificazione e la gestione dei volumi.
- Evitare la creazione di volumi non necessari, poiché ogni volume consuma risorse.
- Controllare regolarmente i volumi per identificare e risolvere problemi di capacità o di archiviazione eccessiva dei dati.
- Evitare l’accesso simultaneo in scrittura allo stesso disco da parte di più contenitori per evitare la corruzione dei dati.
- Implementare misure di sicurezza appropriate per salvaguardare i dati sensibili memorizzati nei volumi.
- Assegnare nomi chiari e descrittivi ai volumi per una migliore organizzazione e gestione.
Script personalizzati e immagini Docker
Dal momento che Docker ha una comunità piuttosto ampia di persone altamente qualificate, non dovrebbe essere così sorprendente apprendere che esistono molti script e immagini personalizzate per il backup di Docker.
Un’immagine Docker di Offen ne è un buon esempio. Si tratta di un contenitore companion leggero che può eseguire backup individuali o regolari del volume Docker in una directory di destinazione specifica – directory locale, Azure Blob, S3, Dropbox, WebDAV, ecc. Ha anche la capacità di ruotare i backup più vecchi, può criptare i backup con GPG e le attività di backup fallite forniscono notifiche all’utente.
Il processo di configurazione iniziale è abbastanza semplice (tutte le informazioni possono essere reperite utilizzando il link precedente), e la linea di comando di esempio per una singola operazione di backup dovrebbe assomigliare a questa:
docker run –rm -v data:/backup/data
–env AWS_ACCESS_KEY_ID=”<key_id>” \
–env AWS_SECRET_ACCESS_KEY=”<access_key>” \
–env AWS_S3_BUCKET_NAME=”<bucket_name>” \
–entrypoint backup \
offen/docker-volume-backup:v2
Naturalmente, questo è solo un esempio, ma ci sono molte altre opzioni disponibili sul mercato per gli utenti che sono disposti a dedicare tempo e fatica per imparare come fare.
Gli utenti che hanno meno familiarità con la logica di un’interfaccia a riga di comando utilizzata per eseguire tutti i compiti sopra citati, potrebbero cercare un modo più semplice per lavorare con i contenitori Docker nel loro complesso. Fortunatamente, esiste una soluzione per questo problema: un’applicazione ufficiale di Docker Desktop che offre un’interfaccia grafica semplice per la gestione delle applicazioni, dei container e altro ancora.
Questa stessa applicazione dispone anche di un mercato di estensioni – che offre molte estensioni diverse per espandere o modificare la funzionalità della soluzione in qualche modo. Le estensioni possono essere sia ufficiali che generate dagli utenti, ma quella che ci interessa è fornita da Docker stessa.
Volumes Backup & Share è l’estensione ufficiale di Docker per la gestione dei volumi per Docker Desktop, che offre un modo perfetto per lavorare con i volumi, comprese le operazioni di backup e ripristino, nonché la clonazione, la condivisione e altro ancora.
La soluzione in questione offre quattro diversi tipi di backup:
- una nuova immagine.
- Un file di backup (un tarball compresso con gzip, simile a quello di cui abbiamo parlato in precedenza).
- Un registro dell’immagine.
- Un’immagine esistente.
Altre caratteristiche includono la possibilità di importare o ripristinare i volumi, la possibilità di trasferire i volumi da un host all’altro, e tutto questo può essere fatto senza l’ausilio di comandi CLI: un’ottima opzione per un pubblico specifico.
SnapShooter di Digital Ocean
Spostando la nostra attenzione sulle opzioni di backup di terze parti per Docker, possiamo iniziare con SnapShooter. SnapShooter è una soluzione di backup relativamente giovane che si rivolgeva in particolare alle offerte di DigitalOcean. Qualche anno dopo è stata estesa ad altri fornitori ed è stata acquisita da DigitalOcean all’inizio del 2023.
Come suggerisce il nome, l’offerta principale di SnapShooter è la capacità di eseguire snapshot – anche se è stata ampliata per includere anche backup di file, backup di database, backup di app, ecc. Per quanto riguarda le sue capacità Docker – SnapShooter può offrire il supporto per il backup del volume Docker, nonché la copertura del backup del database per MongoDB, MySQL e Postgres che gira in Docker.
SnapShooter può anche offrire un’interfaccia piuttosto facile da usare, che aiuta gli utenti a svolgere una serie di attività diverse. Questo include anche la creazione di backup e i processi di ripristino dei dati per i volumi Docker.
Duplicati
Un’altra opzione di backup di terze parti per i volumi Docker, un po’ diversa, è Duplicati. Duplicati è una soluzione di backup gratuita piuttosto nota con una struttura open-source, che offre la possibilità di creare backup dei dati e di spostarli su una varietà di destinazioni di archiviazione, che si tratti di server remoti, NAS o servizi cloud.
Poiché Duplicati è un’offerta gratuita e open-source, è un po’ più difficile lavorarci per un utente medio. Tuttavia, può comunque essere utilizzato per impostare backup regolari dei volumi Docker utilizzando una sequenza specifica di comandi. Va notato che questo esempio utilizza un contenitore Docker specifico – linuxserver/duplicati.
Il primo passo qui sarebbe quello di eseguire il comando chiamato id $user per assicurarsi che l’host corrente abbia i permessi di root per tutte le attività future. Il comando in questione, così come la risposta, dovrebbe assomigliare a questo:
root@debian:~# id $user
uid=0(root) gid=0(root) groups=0(root)
Il numero zero in entrambi i campi gid e uid rappresenta lo stato di utente root.
Il comando successivo esegue il suddetto contenitore Docker linuxserver/duplicati all’interno del suo sistema:
docker run -d \
–name=duplicati \
-e PUID=0 \
-e PGID=0 \
-e TZ=Etc/UTC \
-p 8200:8200 \
-v duplicati-config:/config \
-v /tmp/backups:/backups \
-v /:/source \
–restart unless-stopped \
lscr.io/linuxserver/duplicati:latest
Una volta inserito questo comando, può accedere all’interfaccia web di Duplicati visitando http://<server_ip>:8200 nella barra di ricerca del suo browser web.
Una volta completata l’esecuzione iniziale, è importante che il contenitore in questione venga fermato con il comando docker stop <id_cont> , in cui si digita l’ID univoco del contenitore.
La maggior parte delle interfacce grafiche per la gestione dei container Docker dovrebbe essere in grado di eseguire questo passo successivo, ma per il bene di questo esempio esamineremo la versione CLI. Qui, dobbiamo modificare il comando di avvio del contenitore Docker usato in precedenza, sostituendo il campo /source con la posizione esatta di ogni volume di cui si desidera eseguire il backup.
docker run -d \
–name=duplicati \
-e PUID=0 \
-e PGID=0 \
-e TZ=Etc/UTC \
-p 8200:8200 \
-v duplicati-config:/config \
-v /tmp/backups:/backups \
-v volume1:/source/volume1 \
-v volume2:/source/volume2 \
–restart unless-stopped \
lscr.io/linuxserver/duplicati:latest
Una volta completato questo processo, si consiglia di riavviare il contenitore Duplicati prima di continuare. L’ultimo passo consiste nell’iniziare a utilizzare l’interfaccia web di Duplicati per avviare i lavori di backup. Utilizzi il pulsante Add backup e segua la procedura guidata di backup per farlo. Dovrà indicare i dati esatti di cui desidera il backup – i volumi Docker che ha mappato dovrebbero trovarsi sotto la categoria Source data nella procedura guidata di backup. I backup stessi sono salvati nella directory /tmp/backups (può essere modificata).
Abbiamo esaminato una soluzione di backup di Docker su piccola scala e un’opzione gratuita di backup del volume di Docker, ora è il momento di vedere come funzionano le soluzioni di backup aziendali su larga scala con lo stesso compito.
Backup e ripristino di Docker con Bacula Enterprise
Bacula Enterprise utilizza la sua capacità modulare per consentire l’integrazione nativa di vari sistemi e servizi, compreso Docker. Bacula è un software di backup e ripristino completo e collegato in rete, progettato per sostenere i carichi di lavoro pesanti delle medie e grandi imprese. Inoltre, presenta livelli di sicurezza particolarmente elevati rispetto ad altre soluzioni di fornitori di backup e, per questo, si affida alla stragrande maggioranza delle organizzazioni militari, di difesa e governative occidentali. Il modulo Docker di Bacula offre molte utili funzioni aggiuntive accanto a quelle principali di backup e ripristino.
Il backup di Docker con Bacula Enterprise consiste in tre semplici passaggi:
- Lo stato attuale del contenitore viene salvato nella nuova immagine
- L’utility Docker viene eseguita e i dati vengono salvati
- Lo snapshot in questione viene rimosso per liberare spazio
Il backup in questione può essere eseguito su un container in ogni stato, e il software Bacula mostra lo stato del processo di backup in ogni fase. Ogni backup dell’immagine del contenitore significa un file .tar in più salvato. I backup delle immagini sono conservati nella directory /@docker/image//.tar, mentre i backup dei container sono conservati nella directory /@docker/container//.tar .
Il processo di ripristino dei backup Docker con Bacula Enterprise è leggermente più complicato e può essere eseguito in due modi diversi:
- Ripristino in directory locale che utilizza il parametro where=/some/path Bacula per indicare il percorso completo del backup da ripristinare come file o file di archivio;
- E Ripristino al servizio Docker, il che significa che i dati di backup verrebbero ripristinati con il comando where= come nuovo contenitore, senza archiviarli in primo luogo.
La personalizzazione del processo di ripristino è disponibile anche attraverso diversi parametri, come container_create, container_run e altri ancora.
Al momento della stesura di questo articolo, Bacula è una delle pochissime (o l’unica) soluzione di backup e ripristino di livello aziendale in grado di eseguire un backup completo ed esaustivo di un ambiente Docker. Protegge anche un’ampia gamma di altre tecnologie container ed è consigliata per gli ambienti IT esigenti e mission-critical grazie alla sua scalabilità, affidabilità e resilienza.
Nel complesso, la disponibilità di altre soluzioni di backup Docker specializzate, combinata con la soluzione integrata di Docker, insieme al modulo Docker di Bacula, significa che esiste una gamma di scelte a disposizione dei responsabili IT che cercano un modo per salvaguardare la loro implementazione Docker di produzione.