Sauvegarde de base MySQL conteneurisée

Sauvegarde de base MySQL conteneurisée
Photo by Jan Antonin Kolar / Unsplash

A l'intérieur de votre conteneur MySQL, là où se trouve votre moteur de base de donnée, utilisez la commande mysqldump pour sauvegarder une base :

mysqldump votre_base >  /chemin/backup_votre_base.sql

Avec cette commande, on demande à MySQL de dumper la base votre_base dans le fichier /chemin/backup_votre_base.sql.

Il faut quand même nuancer le propos :

  1. Il faut rapatrier la sauvegarde .sql du conteneur vers l'hôte, donc utiliser un répertoire partagé entre les deux (par exemple, un bind mount)

  2. La base et le moteur sont authentifiés

    • Il faudra passer l'authentification à mysqldump
    • On évitera absolument d'utiliser les options -u et -p pour passer le nom d'utilisateur et le mot de passe en ligne de commande
      • Ces informations sont visibles en affichant les processus (commande ps), mais aussi fatalement dans votre script de backup
  3. Il faut exécuter cette commande a priori à partir de l'hôte :

    • On demande à docker d'exécuter la commande mysqldump à l'intérieur du conteneur
      • Commande docker exec

1)

Il faut avoir créé votre conteneur MySQL avec un volume ou un bind mount.

Identifiez les bind mounts de votre conteneur mysql_mariadb_prod avec la commande :

docker inspect mysql_mariadb_prod --format='{{.Mounts}}'
[{bind  /data/mariadb /bitnami/mariadb  rw true rprivate}]

Ici, le répertoire /data/mariadb sur l'hôte correspond au répertoire /bitnami/mariadb dans le conteneur.

On mettra la sauvegarde dans /bitnami/mariadb pour la récupérer par la suite au niveau de l'hôte, dans /data/mariadb.

2)

Il y a plusieurs possibilités pour passer l'authentification à mysqldump sans l'écrire dans la ligne de commande.

Une de ces possibilités est d'utiliser un fichier de configuration, dont on précisera le chemin à mysqldump avec l'option --defaults-file=.

Format du fichier de configuration .my.cnf :

[mysqldump]
user=mysqluser
password=secret

NB : utiliser autant que faire se peut l'authentification la plus restreinte possible. Ici, on utilise l'utilisateur/mot de passe de la base à sauvegarder, plutôt que les identifiants de l'administrateur du moteur MySQL.

On pourrait par exemple :
a) Stocker ce fichier dans un endroit sécurisé sur l'hôte
b) Au moment de le sauvegarde, copier ce fichier vers le répertoire partagé avec le conteneur (ici, /data/mariadb), avec les bonnes permissions
c) Demander à mysqldump d'utiliser ce fichier dans le répertoire correspondant dans le conteneur (ici, /bitnami/mariadb) et effectuer la sauvegarde
d) Supprimer le fichier

3)

Pour exécuter la commande mysqldump à partir de l'hôte, on l'encapsule dans un bash -c.

Par exemple :

docker exec mysql_mariadb_prod bash -c 'la commande'

Au final,

voici la commande que l'on va exécuter au niveau de l'hôte :

cp /securepath/.my.cnf /data/mariadb/
docker exec mysql_mariadb_prod bash -c 'mysqldump --defaults-file=/bitnami/mariadb/.my.cnf votre_base > /bitnami/mariadb/backup_votre_base.sql'
rm /data/mariadb/.my.cnf
mv /data/mariadb/backup_votre_base.sql /backups/

On fera bien attention aux permissions qu'on met sur le fichier de config .cnf :

  • chmod 400
  • chown UID utilisé par mysqldump / UID correspondant sur l'hôte