Site icon Tosolini.info

Docker: backup db di un container Mysql

Parto dall’assunto che abbiate già preso dimestichezza con Docker e i Container. Mettiamo il caso più classico, ci siamo fatti un ambiente di WordPress che nella sua concezione standard usa due container, uno appunto è dedicato al DataBase MySQL.

Di fatto quest’ultimo ha tutto il set di comandi base al suo interno, per cui potremo tranquillamente collegarci via Command Line e dare il classico comando di Mysqldump.

Ma siccome i container si distruggono e si ricreano al minimo bisogno, nel caso volessimo creare qualcosa di più strutturato e duraturo, dobbiamo intervenire da fuori.

Docker ci mette a disposizione il comando “exec” che per l’appunto come suggerisce il nome stesso, esegue qualcosa sul container, ma il tutto viene “lanciato” da fuori.

Con WordPress, ma la cosa è replicabile in qualunque altro contesto similare, nel file “docker-compose.yml” avremo la possibilità di inserire delle variabili di sistema. Ecco un esempio tipico:

  db:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my-root-pwd
      MYSQL_DATABASE: my-personal-db
      MYSQL_USER: my-restricted-user
      MYSQL_PASSWORD: my-restricted-user-pwd

Se ci colleghiamo in command line al container “db” e diamo il comando “echo $MYSQL_USER” vedremo stampato a video “my-restricted-user“, questo ci torna utile per costruire un comando docker quasi agnostico.

docker exec NOMECONTAINER /usr/bin/bash -c '/usr/bin/mysqldump -v -u $MYSQL_USER --password=${MYSQL_ROOT_PASSWORD} $MYSQL_DATABASE' > $PWD/dump.sql

In questo caso vengono usate le variabili del nostro docker-compose, mentre il file di dump sarà salvato in una cartella sul server fisico, cioè fuori dal container. Da notare che il comando di BASH, seguito dalla PATH relativa al container, si può dare qualsiasi comando.

Ottimo, però noi vogliamo fare un passo in più, ovvero effettuare un backup automatico, per cui ci inventiamo uno script come questo:

#!/usr/bin/bash
# author: Walter Tosolini
# website: https://tosolini.info
#
# setup some variables
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_DIR="/path/to/your/backup/directory"
CONTAINER="wordpress-db"
# getting started to backup
docker exec $CONTAINER /usr/bin/bash -c '/usr/bin/mysqldump -v -u $MYSQL_USER --password=${MYSQL_ROOT_PASSWORD} $MYSQL_DATABASE' > $BACKUP_DIR/$1-$DATE.sql
gzip $BACKUP_DIR/$1-$DATE.sql
# remove old stuff not needed after some times
# lets remove the weekly
find $BACKUP_DIR -type f -name "weekly-*.gz" -mtime +7 -delete
# remove the monthly
find $BACKUP_DIR -type f -name "monthly-*.gz" -mtime +365 -delete
# EOF

Lo script di fatto imposta alcune variabili, come ad esempio la directory dove andremo a salvare i nostri backup. Quindi effettua “l’exec” di Docker, e alla fine comprime il file per non sprecare spazio. Le ultime righe andranno a cercare i file in base ad una certa anzianità ed elimineranno quelli più vecchi.

Il Nome del file salvato è la discriminante, infatti ho inserito “$1” separato dalla data in cui parte l’esecuzione. Questo sarà il nome che andremo ad aggiungere come argomento al nostro script dentro il Cron del server di Docker, a seconda del set temporale che decideremo.

00 00 * * * /usr/script/mysql-dump.sh weekly
30 00 1 * * /usr/script/mysql-dump.sh monthly

L’esempio qui sopra imposta una esecuzione giornaliera alle ore 24, ed una mensile, il giorno 1, alle 00:30. Da notare che il file richiamato è lo stesso, ma l’argomento è diverso.

A regime dovremo ottenere gli ultimi sette giorni e i file mensili per un anno. Chiaramente questo è un esempio, e potete gestire la granularità a seconda delle vostre esigenze.

Conclusioni

Si è trattato di un piccolo compendio per mostrare che anche da fuori dei container si può interagire al loro interno, anche in modo automatizzato, attraverso dei comodi script in Bash. Quello riportato era per MySQL, ma in realtà il concetto è applicabile a qualsiasi altra esigenza.

Exit mobile version