Maîtrisez vos environnements de développement via docker-compose

1. Pourquoi un environnement reproductible est-il important ?

Avez vous déjà utilisé un gestionnaire de dépendance ? De Maven à pip en passant par npm ou nugget, tous les langages ont aujourd’hui leurs gestionnaires. Si vous cherchez à comprendre pourquoi, je vous invite à essayer de développer sans.

Une des principales fonctionnalités de ces gestionnaires est de pouvoir rassembler l’ensemble des informations nécessaires au téléchargement des dépendances dans un fichier externe, tel que le package.json de NPM.

Mais s’il est aujourd’hui naturel, grâce à ces gestionnaires, de ne plus se soucier de noter les numéros de versions des dépendances utilisés ou du téléchargements de ces dépendances, peut on en dire autant concernant l’environnement de développement en lui-même ?

N’avez-vous jamais eu de problèmes quand vos collègues n’ont pas la même version de java/python/JS/etc que vous ? Ou un OS différent, et donc une librairie manquante à la compilation du projet ?

Vous semble-t-il simple aujourd’hui de gérer de multiples versions de votre base de données, une pour chaque projet, à coté de vos nombreuses stacks technologique ?

Ces problèmes en plus de vous faire perdre du temps, génère de la frustration. Et s’il était possible de reproduire un environnement aussi facilement que d’installer les dépendances d’un projet ? Et si l’OS n’importait plus ? Me croiriez vous ?

2. Comment y parvenir ?

Quels sont donc les caractéristiques que nous souhaiterions réunir dans cet environnement ?

  1. Un fichier ou un ensemble de fichier doivent le décrire complètement et retenir les versions utilisées
  2. Ce ou ces fichiers doivent avoir un historique afin de pouvoir retracer l’évolution de l’environnement
  3. Il doit être simple d’installer l’ensemble de l’environnement
  4. Il doit être simple de modifier l’environnement et de rapidement transmettre cette modification à toute l’équipe

Nous avons donc 4 caractéristiques qui nous permettrait de simplifier notre vie de développeur.

Historiquement, un des meilleurs moyen de pouvoir fournir un environnement complet, et reproductible, se trouvait dans la virtualisation. Créer une machine virtuelle à partir d’un modèle et fournir ensuite ce modèle à toute l’équipe était en effet un bon moyen d’obtenir un environnement reproductible. D’ailleurs, ce n’est pas pour rien que des outils comment Vagrant sont devenus si populaire. Vagrant met d’ailleurs en avant une autre caractéristique importante, le fait de pouvoir reproduire l’environnement de production de chaque projet, simplement, sur votre machine.

Vagrant utilise en effet un système de fichier décrivant l’environnement, le « vagrantfile ». Toute personne rejoignant le projet n’ayant ainsi plus qu’à lancer la commande « vagrant up » pour démarrer un environnement isolé, prêt à l’emploi.

Associer ce fichier à un système de version tel que git nous permet en plus d’avoir un historique des fichier et de permettre de simplifier la mise à jour de l’environnement. Ainsi pour obtenir la nouvelle version de l’environnement, il vous suffit de 2 commandes :

git pull
vagrant up

Cependant, la couche de virtualisation imposé par la technologie utilisé par vagrant peut ralentir votre productivité. Pas nécessairement directement, mais le « feeling » d’une machine virtuelle peut vous frustrer et vous empêcher d’itérer aussi rapidement que vous souhaiteriez.

Mais depuis la révolution Docker, une solution d’isolation et non de virtualisation, une nouvelle solution s’offre à vous !

3. L’utilisation de docker et docker-compose

Nous allons ici combiner 3 solutions techniques afin de de proposer une architecture répondant à tous nos critères :

  • Docker : Conteneur isolé et rapide dans l’exécution
  • Docker-compose : Fichier de configuration permettant d’orchestrer la mise en place d’un ou plusieurs conteneur Docker
  • Git : Gestion de version des version du fichier docker-compose et partage facile de ce fichier

Les conteneurs Docker fonctionne très majoritairement sur Linux, mais le système Docker lui-même existe sur Windows, Mac et Linux, ce qui vous permettra de vous affranchir de l’OS d’exécution de l’environnement.

Docker-compose et le fichier « docker-compose.yml » nous permettra de figer l’environnement et de le rendre parfaitement reproductible. Nous pourrons y décrire l’ensemble de nos besoins en terme de logiciel, tel que nous le verrons plus loin.

Enfin, Git, nous donnera la possibilité de pouvoir rejoindre un projet en « Clonant » un dépôt git et nous apportera un système de version. Cette gestion des versions est importante dans la mesure où elle apportera de la traçabilité en cas de changement d’une des dépendances apportant un problème de comptabilité.

Voyons maintenant comment, concrètement, utiliser ces technologies afin d’obtenir une solution répondant à tous nos critères initiaux et aussi simple à utiliser qu’un « vagrant up », tout en étant plus rapide.

L’idée ici est de créer un dossier comprenant un docker-compose.yml décrivant l’environnement, puis de fournir chaque composant de l’environnement via une image docker disponible sur le docker hub ou via un dockerfile.

Nous allons ici construire un environnement comprenant une base elasticsearch et un environnement python, avec le driver elasticsearch pre-installé dans une version fixé.

Nous aurons donc la structure de dossier suivante :

Voici le docker-compose.yml vous permettant de mettre en place l’environnement:

Ce fichier va donc créer deux containeurs Docker. Un comportant notre base ElasticSearch, et l’autre un environnement Python à partir d’un Dockerfile. Les deux containeurs utiliseront le réseaux de l’hôte, afin d’être le plus transparent possible pendant le développement. Nous définissons également un point de montage d’un dossier (/home/pierre/python) vers /app dans le containeur afin que ce dernier puisse acceder à nos fichier.

Notez l’utilisation des options stdin_open, tty et du lancement de la commande /bin/bash dans le containeur. Ceci aura pour effet de maintenir un terminal ouvert, invisible pour l’utilisateur, afin que le containeur ne se termine pas tout seul.

Le dockerfile utilisé est ici assez standard :

Il ne vous restera plus qu’à utiliser Git afin de pousser cette définition d’environnement vers tous vos collègue.

Voyons maintenant comment utiliser votre environnement :

Supprimer cet environnement ne laissera aucune trace sur votre ordinateur :

Vous savez maintenant comment utiliser Docker pour développer sans frustration !

Pour plus d’information sur docker, docker-compose et git, voici leurs documentation respectives :

This entry was posted in Non classé. Bookmark the permalink.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*