Retour aux réalisations

Dockerisation de Bases de Données

2023
Docker
SQL Server
Automatisation
Shell

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

1

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"
2

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:
3

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.

4

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 -f
5

Tests 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.