Pour faire suite à notre premier article qui présente la technologie Docker, nous souhaitons à présent vous parler plus précisément de l’utilisation de cette technologie chez Touch & Sell.
Présentation de l’infrastructure chez Touch & Sell
Notre back-office est composé de 5 services :
- la base de données (postgresql), où sont stockées les données de nos clients,
- l’application (unicorn), qui contient tout la logique et fournit l’interface graphique que vous utilisez tous les jours,
- le serveur web (nginx), qui gère tous les documents qui n’ont pas besoin d’être calculés par le serveur d’application (images, feuilles de styles, etc.),
- le traitement en arrière-plan (sidekiq), qui permet à l’application de réaliser des actions longues en arrière-plan qui ne nécessite pas forcément d’interface graphique. Le serveur web gère notamment l’envoi des e-mails.
- le cache mémoire (redis), actuellement utilisé uniquement pour le dialogue entre l’application et le traitement en arrière-plan.
Ces 5 services dépendent les uns des autres et doivent communiquer d’où la nécessité de construire des liens, même si chacun est déployé dans un conteneur, isolé des autres.
Les volumes
Le stockage de fichiers est une autre part importante de Touch & Sell, ce n’est pas un service dédié, il utilise les volumes Docker pour partager les fichiers entre plusieurs conteneurs.
Qu’est-ce qu’un volume ? Les volumes sont des espaces de stockage de fichiers gérés par Docker mais indépendants des conteneurs et cela leur confère deux utilités :
- la liberté de détruire le conteneur de base de données et de le remplacer par un autre plus récent sans avoir à migrer les données, puisque les fichiers resteront partagés entre les 2 versions.
- le partage des fichiers entre plusieurs conteneurs, par exemple l’application et le traitement en arrière-plan travaillent tous les deux sur les fichiers de nos clients et nous ne voulons pas dupliquer ces données.
Orchestration
L’orchestration consiste à déployer ses différents services sur un ou plusieurs serveurs afin de mettre en place l’infrastructure voulue. Avec Docker, cette tâche se fait avec l’outil Docker Compose qui permet de déclarer tous les services de l’infrastructure, les volumes et les liens qui unissent ces services. Docker Compose se charge alors de créer les conteneurs correspondants et de les configurer pour que l’infrastructure fonctionne.
L’avantage de Docker Compose est que la configuration d’orchestration est la même pour tous nos serveurs et pour nos machines de développement. Cela nécessite un peu plus d’effort de la part du développeur lorsqu’il souhaite ajouter un service mais cela nous permet de garantir le fonctionnement sur tous nos serveurs par la suite. Nous avons cependant une autre infrastructure dédiée au développement pour simplifier les tâches quotidiennes.
Pour le back-office, nous utilisons les fichiers de configuration suivants :
- docker-compose.yml : c’est le fichier par défaut de Docker Compose, il contient donc l’infrastructure optimisée pour le développement. Le but est qu’un nouveau développeur puisse très rapidement se créer son infrastructure de développement sur sa machine,
- docker-compose.prod.yml : l’infrastructure de “production”, elle est utilisée pour tous les déploiements nécessitant de valider l’infrastructure finale, sur le poste du développeur, sur notre serveur de recette ou sur la production elle-même,
- docker-compose.common.yml : un fichier mettant en commun tout ce qui peut l’être entre l’infrastructure de développement et de production, il évite les répétitions et réduit le risque d’erreurs,
- docker-compose.override.yml : un fichier spécifique à chaque développeur qui n’est pas partagé, il permet d’altérer localement son infrastructure en fonction des contraintes de sa machine. (Nous travaillons à la fois sur Mac, Linux et Windows ce qui peut amener quelques différences dans l’usage de Docker)
Déploiement
Pour déployer une nouvelle version de l’application, nous utilisons uniquement Docker Compose. Une image Docker est construite pour chaque service directement sur le serveur de déploiement. Cette image nous sert alors à démarrer une nouvelle version des conteneurs qui — grâce aux volumes — reprennent les mêmes données que les versions précédentes.
Docker Compose nous permet même de faire fonctionner deux infrastructures similaires en parallèle, de manière à supprimer les temps de coupures durant les déploiements les plus simples.
Pour le moment, nous n’utilisons qu’un seul gros serveur pour notre infrastructure principale (en plus des serveurs de backup mais c’est un autre sujet). Mais dans l’avenir, nous envisageons de migrer sur une configuration utilisant Docker Swarm, la nouvelle technologie de Docker qui permet de répartir ses conteneurs sur plusieurs machines. Cela permettra de supporter la croissance de Touch & Sell.