Comment déployer MySQL/MariaDB dans Docker avec stockage de données persistant
Introduction
Dans ce tutoriel, vous déployez un conteneur de base de données MySQL ou MariaDB en utilisant Docker avec un stockage de données persistant. Exécuter des bases de données dans des conteneurs simplifie le déploiement, le contrôle de version et la portabilité entre les environnements. À la fin de ce tutoriel, vous aurez une instance MySQL ou MariaDB prête pour la production fonctionnant dans Docker avec des données stockées en toute sécurité en dehors du conteneur.
Prérequis
Public cible : Administrateurs système intermédiaires
Temps estimé pour terminer : ~30–45 minutes
Système d'exploitation
- Ubuntu 24.04 LTS (testé)
- Également compatible avec : Ubuntu 22.04 LTS, Debian 12 / 13
Exigences logicielles
- Docker 24.0.6 ou version ultérieure
- Docker Compose v2 (inclus avec les installations modernes de Docker)
Vérifiez votre version de Docker :
docker --version
Résultat attendu : Docker version 24.0.6, build ed223bc
Vérifiez la version de Docker Compose :
docker compose version
Résultat attendu : Docker Compose version v5.1.0
Si vous n'avez pas Docker installé, vous l'installerez lors de l'Étape 1.
Exigences matérielles
- Minimum 2 Go de RAM
- Au moins 10 Go d'espace disque libre
Exigences réseau
- Port 3306 disponible (port par défaut MySQL/MariaDB)
- Pare-feu configuré pour autoriser l'accès uniquement si des connexions externes sont nécessaires
Permissions
- Un utilisateur non-root avec des privilèges
sudo - Utilisateur ajouté au groupe
docker(recommandé)
Connaissances présumées
- Concepts de base de Docker (images, conteneurs, volumes)
- À l'aise avec les opérations en ligne de commande
Étape 1 : Installer et vérifier Docker
Si Docker n'est pas installé, installez-le :
sudo apt update && sudo apt upgrade -y && sudo apt install curl
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
sudo apt install docker-ce docker-compose-plugin -y
Activez et démarrez Docker :
sudo systemctl enable docker
sudo systemctl start docker
Vérifiez que Docker fonctionne :
sudo systemctl status docker
Résultat attendu : le statut du service Docker indique active (running).
Ajoutez votre utilisateur au groupe docker pour éviter d'utiliser sudo lors de l'utilisation de Docker :
sudo usermod -aG docker <YOUR_USERNAME>
newgrp docker
Étape 2 : Créer un répertoire de données persistantes
Un montage bind mappe un répertoire du système hôte directement dans un conteneur, le rendant accessible dans le système de fichiers du conteneur.
Créez un répertoire pour les données de la base de données et définissez les permissions appropriées :
mkdir -p ~/mysql-docker/data
chmod 750 ~/mysql-docker/data
Ce répertoire stockera les fichiers de la base de données en dehors du conteneur.
Sans stockage persistant, toutes les données de la base de données sont perdues lorsque le conteneur est supprimé.
Étape 3 : Créer une configuration Docker Compose
Accédez à votre répertoire de projet :
cd ~/mysql-docker
Créez un fichier docker-compose.yml :
nano docker-compose.yml
Ajoutez la configuration suivante (exemple MySQL) :
services: mysql: image: mysql:8.0.36 container_name: mysql-server restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Alternative MariaDB — si vous préférez MariaDB, utilisez :
services: mariadb: image: mariadb:11.3 container_name: mariadb-server restart: unless-stopped environment: MARIADB_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MARIADB_DATABASE: appdb MARIADB_USER: appuser MARIADB_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Important : Ne jamais coder en dur de vrais mots de passe dans le contrôle de version. Utilisez des variables d'environnement ou un fichier .env en production. Remplacez <YOUR_STRONG_USER_PASSWORD> et <YOUR_STRONG_ROOT_PASSWORD> par vos mots de passe sécurisés.
Étape 4 : Démarrer le conteneur de base de données
Exécutez :
docker compose up -d
Résultat attendu :
- Docker télécharge l'image (si elle n'est pas déjà téléchargée)
- Le conteneur démarre en mode détaché
Vérifiez le statut du conteneur :
docker ps
Résultat attendu :
CONTAINER ID IMAGE STATUS PORTS abc123def456 mysql:8.0.36 Up 10 seconds 0.0.0.0:3306->3306/tcp
Étape 5 : Vérifier la fonctionnalité de la base de données
Se connecter au conteneur
Pour le conteneur MySQL, exécutez :
docker exec -it mysql-server mysql -u root -p
Pour le conteneur MariaDB, exécutez :
docker exec -it mariadb-server mysql -u root -p
Entrez votre mot de passe root.
Résultat attendu : l'invite de commande MySQL apparaît : mysql>
Vérifier les bases de données
SHOW DATABASES;
Vous devriez voir :
- appdb
- information_schema
- mysql
- performance_schema
- sys
EXIT;
Tester la persistance des données
Créer une table de test
docker exec -it mysql-server mysql -u root -p
Dans l'invite de commande MySQL, entrez les commandes suivantes :
USE appdb;
CREATE TABLE test_table (id INT PRIMARY KEY);
EXIT;
Arrêter et supprimer le conteneur
docker compose down
Redémarrer le conteneur
docker compose up -d
Vérifier que la table existe toujours
docker exec -it mysql-server mysql -u root -p
Dans l'invite de commande MySQL, entrez les commandes suivantes :
USE appdb;
SHOW TABLES;
Résultat attendu : test_table apparaît. Cela confirme que le stockage persistant fonctionne.
Étape 6 : Sécuriser le déploiement
Restreindre l'accès externe
Si l'accès à la base de données n'est nécessaire qu'en interne, modifiez les ports dans docker-compose.yml :
ports: - "127.0.0.1:3306:3306"
Redémarrez :
docker compose down
docker compose up -d
Important : Évitez d'exposer le port 3306 publiquement sauf si absolument nécessaire.
Utiliser un fichier .env
Créez .env :
nano .env
Exemple :
MYSQL_ROOT_PASSWORD=<YOUR_STRONG_ROOT_PASSWORD> MYSQL_PASSWORD=<YOUR_STRONG_USER_PASSWORD>
Référencez dans docker-compose.yml :
environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Vérification
Vous pouvez confirmer que tout fonctionne correctement en :
- Exécutant
docker ps— le conteneur est Up - Se connectant via l'interface CLI MySQL — la connexion réussit
- Redémarrant le conteneur — les données persistent
- Vérifiant les journaux :
docker logs mysql-server
Entrées de journal attendues : "ready for connections".
Revenir en arrière
Pour arrêter et supprimer le conteneur :
docker compose down
Pour supprimer les données persistantes :
Important : Cela supprime définitivement toutes les données de la base de données.
rm -rf ~/mysql-docker/data
Pour désinstaller Docker :
sudo apt remove docker-ce docker-compose-plugin -y
Dépannage
Le conteneur ne démarre pas
Vérifiez les journaux :
docker logs mysql-server
Causes courantes :
- Mot de passe faible rejeté
- Port 3306 déjà utilisé
Vérifiez l'utilisation du port :
sudo ss -tulnp | grep 3306
Erreurs de permission
Si vous voyez des erreurs de permission refusée :
sudo chown -R 999:999 ~/mysql-docker/data
999 est couramment l'ID utilisateur du conteneur MySQL.
Conclusion & Prochaines étapes
Vous avez déployé avec succès MySQL ou MariaDB dans Docker avec un stockage persistant. La base de données fonctionne maintenant dans un conteneur isolé tout en stockant les données en toute sécurité sur le système hôte.
Prochaines étapes :
- Configurer des sauvegardes automatisées
- Mettre en œuvre la réplication pour une haute disponibilité
- Intégrer avec des conteneurs d'application
- Ajouter une surveillance avec Prometheus et Grafana