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 :
-
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) -
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
- Ces informations sont visibles en affichant les processus (commande
- Il faudra passer l'authentification à
-
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
- Commande
- On demande à docker d'exécuter la commande
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