Site iconSite icon Anthony Jacob

Migration Docker d’un serveur de base de données MySQL

image de mise en avant pour l'article migration Docker d'un serveur de base de données MySqlimage de mise en avant pour l'article migration Docker d'un serveur de base de données MySql

image de mise en avant pour l'article migration Docker d'un serveur de base de données MySql

Temps de lecture estimé: 2 minutes

cet article fait partie d’une série d’articles sur la Dockerisation de toute mon infra, mes services et applications en ligne.

dans mon infra, j’utilise MySql comme SGBD, notamment pour la base de données de ce blog. Je détaille ici la procédure de la migration. 

premièrement, je commence par faire un backup de toutes mes bases de données MySQL de mon serveur de production

mysqldump --add-drop-database  --add-drop-table --all-databases -u monuser -p > backup.sql

si comme moi tu utilises l’option  –add-drop-database, il faudra ensuite éditer le fichier pour supprimer une ligne

/*!40000 DROP DATABASE IF EXISTS `mysql`*/;

ensuite, sur mon serveur Docker, j’ai créé un volume local qui fera office de /var/lib/mysql dans le conteneur

docker volume create --driver local --name mysql

(si une étape foire, il faudra supprimer ce volume et le recréer parce que l’image aura initialisé ses données et ne considérera pas les prochains lancements avec ce volume comme une initialisation)

ensuite le dockerfile à partir d’une image mysql de base, la documentation est

FROM mysql:latest

EXPOSE 3306

je build l’image

docker build -t anthonygj/mysql . -f ./Dockerfile

pour le premier lancement de cette image, l’initialisation, je vais définir MYSQL_ROOT_PASSWORD qui est attendu et je vais fournir mon fichier de backup dans le répertoire de l’image /docker-entrypoint-initdb.d/ prévu pour exécuter certains scripts et fichiers SQL la première fois.

De mon côté, je choisis de restaurer la base de données mysql (contenant les utilisateurs et leurs mots de passe). Donc je me moque un peu d’avoir MYSQL_ROOT_PASSWORD en clair. Par contre comme indiquer dans la documentation de l’image, tu peux utiliser les secrets Docker. Ou sinon une autre alternative serait de le définir en tant que variable d’environnement.

#Windows
SET MYSQL_ROOT_PASSWORD=monpassword

#linux
export MYSQL_ROOT_PASSWORD="monpassword"

premier run d’initialisation de l’image (et surtout population de /var/lib/mysql dans le volume mysql)

docker run -dit \
-p 3306:3306 \
--network=infra \
-h mysql.anthony-jacob.com \
--restart=always \
-v mysql:/var/lib/mysql \
-v /home/docker-infra/docker-mysql/backup.sql:/docker-entrypoint-initdb.d/backup.sql \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
--name mysql \
anthonygj/mysql 

Et voilà je vérifie avec un utilisateur de ma base de données de prod

docker exec -it mysql  mysql -u monuser -p

je me connecte bien avec cet utilisateur et son mot de passe !! Tant que je suis connecté à MySql , un petit

show databases;

me permet de voir que mes bases de données sont bien là également.

je finis avec un accès root possible depuis n’importe quel host

CREATE USER 'root'@'%' IDENTIFIED BY 'MONPASSWORD';  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

voilà c’est fini pour moi sur la partie SQL de la migration de mon infra sur Docker. Je fignole juste le script de déploiement pour retirer le backup.sql et voici la version finale

#!/bin/bash
docker build -t anthonygj/mysql . -f ./Dockerfile
docker container rm -f mysql

docker run -dit \
-p 3306:3306 \
--network=infra \
-h mysql.anthony-jacob.com \
--restart=always \
-v mysql:/var/lib/mysql \
--name mysql \
anthonygj/mysql 

et voilà!! Mon serveur MySql sur Docker est bien déployé, fonctionnel et prêt à accepter les connexions de mes applications (notamment ce blog).

Pour suivre les autres étapes de la migration de mon serveur, ça se passe sur l’article récapitulatif

Partagez l'article:
Quitter la version mobile