Dockerisation de Bases de Données
Environnement
Docker, MS SQL Server, Linux, DBeaver
Technologies
Dockerfile, Shell scripting, SQL, Docker Compose
Bases de données
MS SQL Server, Restauration de fichiers .bak, Gestion des volumes
Avantages obtenus
- Configuration rapide et homogène de l'environnement de développement
- Automatisation complète de la restauration des bases de données
- Portabilité de l'environnement entre différentes machines
- Simplification du déploiement en production
Présentation du projet
Ce projet avait pour objectif d'automatiser la configuration et la gestion d'une base de données MS SQL Server à l'aide de Docker. J'ai travaillé sur la mise en place d'une solution dockerisée intégrant des scripts pour importer automatiquement des fichiers de sauvegarde .bak à partir d'un script restore_db.sh.
Cette approche permet de créer rapidement un environnement de développement complet avec des bases de données pré-configurées, facilitant ainsi le travail des développeurs et assurant une cohérence entre les différents environnements. La solution développée permet également de simplifier le déploiement en production.
Défis techniques
Configuration de l'image Docker
Personnaliser l'image MS SQL Server pour inclure tous les outils nécessaires et configurer correctement l'environnement pour la restauration des bases de données.
Solution mise en œuvre
J'ai créé un Dockerfile personnalisé basé sur l'image officielle de MS SQL Server, en ajoutant les outils nécessaires comme sqlcmd. J'ai également configuré les variables d'environnement requises pour l'initialisation du serveur SQL et défini les permissions appropriées pour les fichiers et répertoires.
Gestion des volumes et persistance des données
Assurer la persistance des données même après la suppression des conteneurs et gérer efficacement les volumes Docker.
Solution mise en œuvre
J'ai configuré des volumes Docker pour stocker les fichiers de base de données (.mdf et .ldf) en dehors du conteneur. Cela permet de conserver les données même si le conteneur est supprimé ou recréé. J'ai également mis en place une stratégie de sauvegarde automatique pour sécuriser davantage les données.
Automatisation de la restauration des bases
Créer un script qui restaure automatiquement les bases de données à partir des fichiers .bak lors du démarrage du conteneur.
Solution mise en œuvre
J'ai développé un script shell (restore_db.sh) qui s'exécute au démarrage du conteneur. Ce script vérifie d'abord si les bases de données existent déjà, puis utilise sqlcmd pour exécuter les commandes T-SQL nécessaires à la restauration des fichiers .bak. Le script gère également les erreurs et fournit des logs détaillés pour faciliter le débogage.
#!/bin/bash
# Script pour restaurer automatiquement les bases de données
# à partir des fichiers .bak
# Attendre que SQL Server soit prêt
sleep 30s
# Vérifier si les bases existent déjà
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q "SELECT name FROM sys.databases" | grep -q "WS_TEST"
if [ $? -ne 0 ]; then
echo "Restauration de la base WS_TEST..."
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q "RESTORE DATABASE WS_TEST FROM DISK = '/var/opt/mssql/backup/ws_test.bak' WITH MOVE 'WS_TEST' TO '/var/opt/mssql/data/ws_test.mdf', MOVE 'WS_TEST_log' TO '/var/opt/mssql/data/ws_test_log.ldf'"
echo "Base WS_TEST restaurée avec succès."
fi
# Répéter pour WS_PROD
...Étapes principales du projet
Création du Dockerfile
J'ai commencé par créer un Dockerfile personnalisé basé sur l'image officielle de MS SQL Server. J'ai ajouté les outils nécessaires comme sqlcmd et configuré les variables d'environnement requises. J'ai également préparé le conteneur pour recevoir les fichiers .bak et les scripts de restauration.
FROM mcr.microsoft.com/mssql/server:2019-latest
# Créer les répertoires nécessaires
RUN mkdir -p /var/opt/mssql/backup
# Copier les fichiers de sauvegarde et les scripts
COPY ./backup/*.bak /var/opt/mssql/backup/
COPY ./scripts/restore_db.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/restore_db.sh
# Définir les variables d'environnement
ENV ACCEPT_EULA=Y
ENV MSSQL_PID=Developer
# Exposer le port SQL Server
EXPOSE 1433
# Exécuter le script de restauration après le démarrage de SQL Server
CMD /bin/bash -c "/opt/mssql/bin/sqlservr & /usr/local/bin/restore_db.sh"Configuration des volumes Docker
J'ai configuré des volumes Docker pour persister les données des bases de données. Cela permet de conserver les données même après la suppression des conteneurs. J'ai défini les volumes dans un fichier docker-compose.yml pour faciliter le déploiement.
version: '3.8'
services:
sqlserver:
build:
context: .
dockerfile: Dockerfile
ports:
- "1433:1433"
environment:
- SA_PASSWORD=YourStrongPassword123!
- ACCEPT_EULA=Y
volumes:
- sqlserver-data:/var/opt/mssql/data
- sqlserver-log:/var/opt/mssql/log
- sqlserver-backup:/var/opt/mssql/backup
restart: unless-stopped
volumes:
sqlserver-data:
sqlserver-log:
sqlserver-backup:Développement du script de restauration
J'ai créé un script shell (restore_db.sh) pour automatiser la restauration des bases de données WS_TEST et WS_PROD à partir des fichiers .bak. Le script vérifie d'abord si les bases existent déjà pour éviter les restaurations inutiles.
Construction et déploiement
J'ai construit l'image Docker et déployé le conteneur en utilisant docker-compose. Cette approche permet de gérer facilement l'ensemble de la configuration et de démarrer rapidement l'environnement complet.
# Construction et démarrage des conteneurs
docker-compose up -d --build
# Vérification des logs pour s'assurer que la restauration s'est bien déroulée
docker-compose logs -fTests et validation
J'ai testé la solution en vérifiant que les bases de données étaient correctement restaurées et accessibles. J'ai utilisé DBeaver pour me connecter aux bases et exécuter des requêtes SQL pour valider leur fonctionnement.
Avantages de la dockerisation des bases de données
Configuration homogène
Tous les développeurs travaillent avec exactement la même configuration de base de données, ce qui élimine les problèmes liés aux différences d'environnement.
Automatisation complète
Le processus de configuration et de restauration des bases de données est entièrement automatisé, ce qui réduit les erreurs humaines et accélère la mise en place des environnements.
Infrastructure as Code
La configuration de la base de données est définie dans des fichiers (Dockerfile, docker-compose.yml), ce qui permet de la versionner et de la gérer comme du code.
Isolation et portabilité
Les bases de données sont isolées dans des conteneurs, ce qui facilite leur déploiement sur différentes machines et environnements sans conflits avec d'autres applications.
Compétences acquises
Docker et conteneurisation
Création d'images Docker personnalisées, gestion des volumes et configuration des conteneurs pour des applications spécifiques
Administration SQL Server
Configuration de SQL Server, restauration de bases de données et gestion des fichiers de sauvegarde
Shell scripting
Développement de scripts shell pour automatiser des tâches complexes et gérer les erreurs
DevOps et automatisation
Mise en place de processus automatisés pour simplifier le déploiement et la gestion des environnements
Conclusion
La dockerisation des bases de données MS SQL Server a permis de créer une solution robuste et automatisée pour la gestion des environnements de développement. Grâce à cette approche, la configuration des bases de données est devenue plus rapide, plus fiable et plus cohérente entre les différents environnements.
Ce projet m'a permis d'approfondir mes connaissances en Docker, en administration SQL Server et en scripting, tout en développant des compétences précieuses en DevOps et en automatisation. La solution mise en place est maintenant utilisée par l'équipe de développement, ce qui a considérablement amélioré leur productivité et réduit les problèmes liés aux différences d'environnement.