Accueil / Blog / Métier / 2014 / Utiliser Docker pour faciliter les migrations de base de données

Utiliser Docker pour faciliter les migrations de base de données

Par Mathieu Leplatre publié 07/11/2014
Une forme d'utilisation de Docker très pratique pour le développement!
Utiliser Docker pour faciliter les migrations de base de données

Containers by s_volenszki - CC-BY-NC

Docker est très polyvalent, et peut répondre à (vraiment) énormément de besoins différents. Vous en avez probablement déjà entendu parler pour mettre des applications en production.

Même si j'ai déjà écrit plusieurs Dockerfiles pour packager et déployer des applications Web, ce qui m'a le plus convaincu c'est son utilisation pour les bases en données en développement :)

Par exemple, quand on travaille avec des bases relationnelles, en développant des fonctionnalités dans des branches, c'est assez pénible de réinitialiser les schémas de tables qui divergent à chaque changement de branche (comme avec Django South ou 1.7).

De manière similaire, c'est assez pénible quand on veut rejouer des imports de données, des migrations, sur différents schémas de base, ou avec plusieurs versions de PostgreSQL etc.

Dans cet article, je vais présenter comment utiliser la fonctionnalité commit de Docker pour résoudre ces problèmes.

Exécuter PostgreSQL avec Docker

En premier lieu, vous devez choisir une image dans l'Docker index.

Quand vous avez trouvé l'image qui correspond à vos besoins (ou la plus populaire), récupérer une image est aussi facile que ça:

sudo docker pull helmi03/docker-postgis

Ensuite, pour l'exécuter en tâche de fond, sur localhost:5432:

sudo docker run -d -p 5432:5432 helmi03/docker-postgis

Félicitations, vous avez un conteneur PostGIS qui tourne. Loggez vous en superuser avec docker/docker.

Vous pouvez voir son identifiant avec sudo docker ps, et l'éteindre avec sudo docker stop <ID>.

Commit

La "fonctionnalité qui tue" de Docker, c'est son système de fichier incrémental, qui permet de tagger et committer les états des conteneurs.

Par exemple, une fois que vous aurez une base de données vide dans le conteneur, vous pourrez sauver son état:

sudo docker commit <ID> postgis-empty

Puis, par exemple, vous allez initializer les tables pour une de vos applications, créer des utilisateurs, etc. Vous sauvegardez !

sudo docker commit <ID> geotrek-0.28-empty

Chargé des données dans la base ? Commit !

sudo docker commit <ID> geotrek-0.28-demo

Maintenant que vous avez effectué une série de sauvegardes d'état, vous pouvez arrêter le conteneur et le relancer à un état précédent! Docker est le git des machines virtuelles!

Pour voir la liste des états, c'est sudo docker images:

$ sudo docker images
REPOSITORY                    TAG        IMAGE ID        CREATED        VIRTUAL SIZE
geotrek-0.28-demo             latest     48f51d78273a    2 weeks ago    1.236 GB
geotrek-0.28-empty            latest     3985183cd01a    4 weeks ago    1.208 GB
postgis-empty                 latest     24ec864dc058    4 months ago   844.4 MB
helmi03/docker-postgis        latest     f62d8f0fb8af    9 months ago   746.2 MB

Checkout

Relancer un état précédent c'est très très simple, c'est comme la première fois où vous avez lancé l'image récupérée l'image de l'index Docker, sauf que maintenant vous spécifiez le nom de l'état!

D'abord, éteignez l'instance courrante:

$ sudo docker ps
CONTAINER ID        IMAGE                      COMMAND       CREATED       STATUS      PORTS
7e1e44ce36d8        geotrek-0.28-demo:latest   "/start.sh"   6 hours ago   Up 6 hours  0.0.0.0:5432->5432/tcp

$ sudo docker stop 7e1e44ce36d8

Re-lancer à un état précédent:

$ sudo docker run -d -p 5432:5432 postgis-empty

Vous allez vite vous rendre compte que vous pouvez:

  • Lancer plusieurs versions de vos conteneurs (ou de versions de PostgreSQL) sur différents ports
  • Restaurer l'état de votre base de données nécessaire pour faire tourner la branche master de votre projet, en une commande!
  • Rejouer des scripts de migrations
  • Faire tourner les différentes bases de vos clients sans changer de configuration
  • ...
  • Avoir la même approche avec CouchDBRedisElasticSearch, ...

Pour être franc, c'est comme git, ça a vraiment changé ma façon de travailler, et maintenant je ne peux plus m'en passer...

PS: Et pour ceux qui sont sous Mac ou Windows, j'ai envie de dire... dommage.

ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Formation PostgreSQL / PostGIS du 17 au 19 octobre à Paris Formation PostgreSQL / PostGIS du 17 au 19 octobre à Paris 13/09/2017

Découvrez les outils Libres pour gérer vos données spatiales.

PostgreSQL utilisations avancées de generate_series pour générer du contenu PostgreSQL utilisations avancées de generate_series pour générer du contenu 27/06/2017

Générer du contenu en masse permet de tester les requêtes, index et traitements complexes sur ...

Bien débuter avec les transactions SQL Bien débuter avec les transactions SQL 09/12/2015

BEGIN et COMMIT vous connaissez, mais ACID ou LOCK ça vous dit quelque chose ?

Les curseurs PostgreSQL 11/06/2015

Découvrons comment utiliser les curseurs PostgreSQL pour effectuer des requêtes renvoyant de ...

Python : Bien configurer son environnement de développement Python : Bien configurer son environnement de développement 07/12/2015

Comment utiliser les bonnes pratiques de développement Python.