Lors de l'implémentation de ce serveur, je me suis posé la question d'automatiser au maximum la mise en place des différents services.

Il fallait absolument que la configuration et le déploiement des services soit aussi simple que possible.
Après avoir choisi Docker pour sa simplicité d'utilisation et son efficacité (quantité importante d'images disponibles), la question s'est posée de savoir comment maintenir et fiabiliser le déploiement des images. En effet, avec docker par défaut, on lance un container avec la commande docker run -d [arguments] <nom de l'image>. Le résultat est que pour sauvegarder la configuration déployée, il faut enregistrer cette commande pour chacun des containers afin de pouvoir les rejouer si jamais on souhaite apporter une modification a la solution technique. Pas forcément très pratique !

Un de mes collègues, qui a fait avant moi ce chemin de mise en place sur son propre serveur, m'avait parlé de docker compose. Je me suis donc décidé de faire l'essai et la mise en place pour le différents services que j'utilise.

docker-compose simplifie grandement la gestion d'un ensemble de services sur une machine, car il suffit de déclarer dans un fichier YAML l'état attendu d'un ensemble de services.

L'utilisation de docker-compose a donc énormément d'avantages pour un déploiement qui respecte l'esprit DevOps :

  • Infrastructure as code :
    Mes services sont déclarés de manière explicite dans un fichier de configuration : docker-compose.yml.
  • Versionnable :
    Je peux insérer ce ficher dans un repo git qui va me permettre de garder un historique des modifications apportées et me permettre de revenir en arrière à tout moment.
  • Utilisable dans des Pipelines :
    docker-compose dispose d'une commande docker-compose config qui permet de faire un "sanity check" du code inséré (le fichier docker-compose.yml est lu par l'interpréteur qui retourne une erreur si la syntaxe du fichier est incorrecte).

Il est donc tout à fait envisageable d'imaginer un pipeline du type suivant :

  1. Je modifie le docker-compose.yml pour rajouter un nouveau service / apporter une modification
  2. Je sauvegarde ma modification dans git via un nouveau commit
  3. Mon outil de CI (Jenkins, Concourse, Travis) détecte un changement sur mon repo git et lance automatiquement la commande docker-compose config afin de vérifier que ma syntaxe est correcte.
  4. Si elle est correcte l'outil de CI lance la commande docker-compose up qui relance automatiquement les containers docker selon les changements qui ont été apportés à la configuration.

Modifier notre infrastructure est donc devenu aussi simple que de changer un fichier texte (la syntaxe YAML est extrèmement simple à appréhender), l'outil de CI s'occupant ensuite de réaliser les modifications selon un ensemble de règle établies.

Mon prochain challenge sera donc de réaliser ce pipeline via concourse !

Affaire à suivre...