Docker avec .NET: #3 Aller plus loin avec les conteneurs


Cet article est le dernier d’une série de trois articles sur Docker.

Nous avons vu comment construire et lancer des images Docker. Nous allons maintenant nous intéresser à des notions utiles pour vraiment travailler avec des conteneurs, notamment pour orchestrer plusieurs conteneurs de la façon la plus efficace.

En effet, il est commun qu’un système soit composé de plusieurs conteneurs. La pratique étant justement de créer une image par service. En cela, Docker s’aligne parfaitement avec l’approche des microservices.

Lorsque l’on parle de composition de conteneurs, deux idées sont majeures :

  • Faire communiquer les conteneurs entre eux.
  • Piloter des groupes de conteneurs de façon synchronisée afin d’éviter les tâches répétitives et réduire le risque d’erreur lors de la mise en oeuvre de plusieurs conteneurs interdépendants.

Faire communiquer les conteneurs entre eux

Il y a deux principales façons pour faire communiquer les conteneurs :

  • Le partage de répertoires (les volumes).
  • La mise en réseau des conteneurs (liens entre conteneurs).

Le choix entre ces deux solutions dépend de l’architecture du système. Le partage de système de fichier impose une synchronisation au niveau des applications: Docker n’empêchera pas deux applications d’écrire dans le même fichier en même temps et de corrompre les données. La mise en réseau implique que les applications prévoient un protocol de communication.

Volumes partagés

Les volumes partagés consistent à monter un répertoire de l’hôte Docker dans le système de fichiers d’un conteneur. Si le même répertoire est monté dans plusieurs conteneurs, il devient partagé entre ces différents conteneurs.

Le partage se fait grâce à un ou plusieurs paramètres -v lors du lancement d’une image.
Comme tous les paramètres de démarrage d’image, il doit être indiqué avant le nom de l’image car les paramètres situés après l’image sont transmis en argument au point d’entrée du conteneur (l’instruction ENTRYPOINT du Dockerfile):

Note spéciale pour Windows et Mac OS X: comme l’hôte Docker est exécuté dans une VM, l’accès au système de fichiers physique peut être limité en fonction du partage qu’a réussi à obtenir Docker Toolbox. La documentation indique que le répertoire utilisateur est normalement partagé. Par exemple:

Pour aller plus loin sur les volumes, consultez cette page: https://docs.docker.com/engine/userguide/dockervolumes/

Créer des liens réseaux entre conteneurs

Nous avons vu dans l’article précédent comment “exposer” un port d’un conteneur grâce à l’instruction EXPOSE dans le Dockerfile. Cette instruction est seulement une règle du pare-feu du conteneur et ne rend pas directement accessible ce port depuis l’extérieur du conteneur. C’est une première étape nécessaire qui “déclare” les ports entrant du conteneur.

La mise en réseau consiste à créer une interface réseau (une interface virtuelle de type ethernet bridge) et à y brancher les conteneurs. Les conteneurs branchés à la même interface peuvent alors communiquer.

Par exemple la commande suivante crée une nouvelle interface réseau nommée “reseau”:

Puis nous pouvons brancher les conteneurs à ce réseau lorsque nous les lançons grâce au paramètre --net:

Il est même possible de brancher et débrancher un conteneur d’un réseau pendant son fonctionnement, comme si nous branchions/débranchions un câble à chaud:

A tout moment, vous pouvez voir la liste des réseaux existants avec la commande:

Et vous pouvez consulter la liste des conteneurs actuellement connectés à un réseau:

Lors de la mise en réseau, Docker gère automatiquement la mise à jour du fichier /etc/hosts afin de permettre aux conteneurs de communiquer par nom d’hôte sous la forme “hostname.network”. Par exemple, le nom d’hôte du conteneur nommé “web” branché au réseau “reseau” sera “web.reseau”. L’adresse IP des conteneurs change à chaque lancement d’image mais le nom reste stable (si correctement défini avec le paramètre --name).

Piloter un groupe de conteneurs avec Docker Compose

Nous terminons avec le plus intéressant: la composition de conteneurs grâce à Docker Compose. Il s’agit d’un outil déjà installé avec Docker Toolbox sur Windows et sur Mac OS X. Sur Linux, vous l’installez séparément.

Pour tester s’il est installé, utilisez la commande:

Le fonctionnement est extrêmement simple. Docker Compose consiste à créer un groupe de conteneurs qui pourront être orchestrés en même temps sous un même nom.

La configuration se fait grâce à un fichier docker-compose.yml (format yaml). Avant cela, les images doivent être prêtes. Le fichier docker-compose.yml ne fait que les référencer.

Voici un exemple de fichier docker-compose.yml. Pour toutes les instructions possibles, voir: https://docs.docker.com/compose/compose-file/

Ce fichier crée un groupe de deux conteneurs basés sur les images “mon_app/v1” et “redis”. Le port 80 de l’hôte Docker sera redirigé vers le port 5004 du conteneur “mon_app/v1”.

Un lien réseau est également créé permettant au conteneur “mon_app/v1” de communiquer avec “redis”.

Une fois le fichier docker-compose.yml créé, il suffit de lancer le groupe à partir du répertoire qui contient ce fichier:

Cette commande équivaut à exécuter la commande docker run sur chaque image du groupe avec les paramètres spécifiés dans le fichier docker-compose.yml.

L’option -d lance le groupe en mode démon (non interactif).

Plusieurs commandes proches des commandes de base de Docker sont disponibles dans Docker Compose:

Pour aller plus loin, voir: https://docs.docker.com/compose/reference/docker-compose/

Récapitulatif de cette série

Cette introduction à Docker nous a permis de voir à quel point il est aujourd’hui facile d’installer Docker sur Windows et de créer des conteneurs avec .NET Core.

Si Docker est très mature, il n’en va pas encore de même pour .NET Core. Ce dernier framework est seulement en devenir (en RC1 au jour de rédaction de cet article). Le framework est actuellement un sous-ensemble de .NET, avant tout conçu pour le support d’ASP.NET 5. Quoiqu’il en soit, on peut envisager une croissance forte de ce framework dans les années à venir et il nous permettra déjà d’ici quelques mois de faire des choses très sympathiques!

Commentez cet article