Utiliser Citizen avec Docker

Introduction aux conteneurs

Docker

Docker est un gestionnaire de conteneurs.

Pour faire très simple : un conteneur peut être vu comme une mini machine virtuelle utilisant les librairies de l’OS sur lequel il est lancé. Cela le rend donc plus léger et plus rapide qu’une machine virtuelle.

Je vous invite à regarder cette vidéo : IBM et même toute la série de vidéos relatives à la conteneurisation.

L’objectif des conteneurs et d’isoler les applications. Dans une application web, les conteneurs suivants sont souvent mis en place :

  • Base de données

  • Backend

  • Proxy & Frontend (le frontend est considéré ici comme statique)

Docker-compose

Utilitaire permettant de créer facilement des conteneurs. Ces conteneurs sont définis par des services. Il permet également de faciliter la mise en place d’un réseau (network) pour faire communiquer les conteneurs entre eux.

Nomenclature

  • Image : peut se rapprocher d’un fichier ISO

  • Dockerfile : ensemble d’instructions permettant de construire une image

  • Conteneur : emplacement dans lequel est monté l’ISO

  • Service : ici peut se traduire directement par : un conteneur

Avantages

  • Chaque service est isolé (pas de dépendance « forte »)

  • Chaque service s’execute dans un environnement vierge (aucun conflit)

  • Le code est beaucoup plus portatif : seul docker est requis sur la machine

  • Donc installations beaucoup plus rapides

  • Le déploiement peut se faire automatiquement : - à chaque merge sur une branche particulière : construction des images; - mise à disposition via une bibliothèque d’images; - Téléchargement des images; - Montage des images dans les conteneurs; - les services sont opérationnels et accessibles par les utilisateurs.

  • Beaucoup utilisé dans la communauté open-source.

Inconvénients

  • Concepts parfois complexes à appréhender (images, conteneurs, volumes, network, contexte…).

  • Lignes de commandes à « apprendre »

  • Langage à apprendre (Dockerfile)

Utiliser Docker dans Citizen en production

4 services/images/conteneurs sont cré(e)s depuis docker-compose.yml

  • Service base de données (postgis)

  • Backend

  • Frontend (car ici le frontend est en server-side rendering ou SSR)

  • Proxy nginx

Lancer les services

Lancer ./docker.sh

Lancer cette commande : docker-compose up Cette commande va construire les images et les monter une par une dans un conteneur qui leur est propre.

Il est possible de détacher le programme (comme un & sur Linux) et donc toute la sortie de la commande en lançant docker-compose up -d (detaché).

Arrêter les services

Pour « tuer » les services : docker-compose down

Contruire une ou plusieurs images

Situation 1 : le front a été modifié et j’ai besoin de reconstruire l’image

Lancer : docker-compose build frontend. Cela va reconstruire le frontend

Pour construire puis lancer directement le service : docker-compose up frontend --build

Situation 2 : J’ai besoin de tout reconstruire

Lancer : docker-compose build OU : docker-compose up --build pour tout reconstruire et relancer tous les services

Utiliser Docker dans Citizen en developpement

Lancer docker-compose -f docker-compose.dev.yml up --build

Cela utilisera le ficher de configuration des services et construira les images pour le developpement (rechargement automatique du front, accès à tous les services et pas juste au proxy…).

Ce qu’il reste à améliorer

  • Il n’est pas possible de ne pas construire en front autrement qu’en SSR

  • Les docker-compose prod et dev pourraient être mieux écrits pour qu’il y en ai un qui « écrase » l’autre (override) et donc pourraient être lancés comme ceci : docker-compose -f docker-compose.prod.yml -f docker-compose.dev.yml up

  • Les fichers pourraient être mieux nommés

  • Les Dockerfile pourraient être améliorées nottamment le front en ajoutant un « Stage » pour copier le front buildé

  • Sûrement d’autres choses…