đ RĂ©seaux virtuels et dĂ©ploiements multi-conteneurs
1. Problématique
Nous avons vu qu’un processus doit souvent communiquer avec d’autres processus (et donc d’autres logiciels) pour fonctionner. Par exemple, le processus d’un site web doit souvent communiquer avec le processus d’une base de donnĂ©es, par exemple pour demander Ă ce dernier de stocker des informations.
IdĂ©alement, lors d’un dĂ©ploiement qui implique plusieurs logiciels, nous souhaitons que chaque logiciel soit isolĂ© dans son propre conteneur, pour faciliter son dĂ©ploiement et pour lui offrir le meilleur environnement. Nous appelons ce type de dĂ©ploiement un dĂ©ploiement multi-conteneurs.
Cependant, une question technique doit ĂȘtre rĂ©solue pour permettre ce type de dĂ©ploiement : comment permettre Ă des processus situĂ©s dans des conteneurs diffĂ©rents de communiquer entre eux ?
Nous avons vu dans un chapitre prĂ©cĂ©dent qu’il Ă©tait possible pour un conteneur de publier un port rĂ©seau. Malheureusement, ce mĂ©chanisme ne sera pas suffisant pour un dĂ©ploiement multi-conteneurs: une publication de port permet uniquement Ă un processus extĂ©rieur Ă l’environnement d’accueil de communiquer avec un processus situĂ© dans le conteneur.
Pour résoudre ce problÚme, dans ce (bref) chapitre nous allons apprendre le principe du réseau virtuel, qui permet de relier plusieurs conteneurs entre eux via un réseau purement logiciel.
2. Principe
La publication de port permet de rĂ©pondre Ă une situation oĂč un processus extĂ©rieur Ă l’environnement d’accueil souhaite communiquer avec un processus Ă l’intĂ©rieur d’un conteneur de l’environnement d’accueil.
Cependant, que faire lorsque deux processus souhaitent communiquer alors qu’ils sont dans le mĂȘme environnement d’accueil, mais chacun dans un conteneur diffĂ©rent ?
On considĂšre Ă nouveau, Simplestblog, un logiciel qui s’exĂ©cute sous la forme d’un serveur web. Cette fois-ci, on se focalise sur le fait que Simplestblog stocke ses donnĂ©es dans un systĂšme de gestion de base de donnĂ©es (SGBD) via un logiciel Ă part appelĂ© MariaDB. Dans ce contexte, c’est Simplestblog qui joue le rĂŽle de processus client qui se contacte au processus serveur du SGBD.
Supposons que :
-
Simplestblog s’exĂ©cute au sein d’un conteneur dans un environnement d’accueil.
-
MariaDB s’exĂ©cute au sein d’un second conteneur dans le mĂȘme environnement d’accueil.
-
Le processus MariaDB écoute sur le port
3306et attend qu’un processus client se connecte pour lire ou Ă©crire des entrĂ©es dans la base de donnĂ©es.MĂȘme si MariaDB Ă©coute sur un port rĂ©seau, ce n’est pas une publication de port puisqu’il n’y a aucun lien dĂ©fini avec un port de l’interface rĂ©seau de l’environnement d’accueil.
Schématiquement, nous avons donc la situation suivante :
| Ce schéma ne montre volontairement pas la publication de port définie dans la partie précédente, pour nous concentrer sur le problÚme de communication inter-conteneurs. |
ProblĂšme : mĂȘme si MariaDB Ă©coute bien sur un port rĂ©seau, il est impossible pour Simplestblog de s’y connecter puisque les deux conteneux ne sont pas sur un mĂȘme rĂ©seau informatique.
Pour remĂ©dier Ă ce type de situation, il est possible de relier diffĂ©rents conteneurs d’un mĂȘme environnement Ă l’aide d’un rĂ©seau virtuel. Un rĂ©seau virtuel est un type de rĂ©seau purement logiciel (tout comme le rĂ©seau de rebouclage propre Ă chaque environnement) qui existe virtuellement au sein d’un environnement d’accueil donnĂ©. Ă sa crĂ©ation, un conteneur peut ĂȘtre connectĂ© Ă un rĂ©seau virtuel Ă l’aide de son interface rĂ©seau virtuelle.
| Par dĂ©faut, au sein d’un rĂ©seau virtuel, le nom d’hĂŽte d’un conteneur est le nom donnĂ© au conteneur Ă sa crĂ©ation. |
L’illustration ci-dessus prĂ©sente trois conteneurs dans le mĂȘme environnement d’accueil.
On crée deux réseaux virtuels, à savoir R1 et R2.
On ajoute les conteneurs A et B au réseau R1, et les conteneurs B et C au réseau R2.
-
Sur le réseau
R2, les conteneursBetCpeuvent se contacter mutuellement. Par exemple, un processus exĂ©cutĂ© dansCpeut se connecter sur le port465du conteneurB(ou Ă©crit autrement, peut se connecter ĂB:465). -
Sur le réseau
R1, les conteneursAetBpeuvent se contacter mutuellement. Par exemple, un processus exĂ©cutĂ© dansBpeut se connecter sur le port5000du conteneurA(ou Ă©crit autrement, peut se connecter ĂA:5000).
Quelques points importants pour bien comprendre le cas général :
-
Un conteneur peut ĂȘtre sur plusieurs rĂ©seaux virtuels simultanĂ©ment. C’est par exemple le cas ici du conteneur
B. -
Il est Ă©galement possible qu’un rĂ©seau virtuel connecte plus de deux conteneurs simultanĂ©ment.
-
Contrairement Ă la publication de port, la crĂ©ation et l’usage de rĂ©seaux virtuels est complĂ©tement sĂ©parĂ©e des interfaces rĂ©seaux matĂ©rielles de l’environnement d’accueil. Par exemple ici l’interface ethernet n’est absolument pas concernĂ©e par la mise en rĂ©seau purement logicielle des diffĂ©rents conteneurs entre eux.
Pour permettre à Simplestblog, exécuté dans un conteneur appelé simplestblog_app, de communiquer avec le systÚme de gestion de base de données MariaDB, exécuté dans un conteneur appelé simplestblog_db, on crée un réseau virtuel appelé simplestblog_network sur lequel on connecte les deux conteneurs :
Ainsi, le processus Simplestblog exĂ©cutĂ© dans le conteneur simplestblog_app peut effectuer un accĂšs rĂ©seau sur nom d’hĂŽte simplestblog_db et le port 3306 (aussi Ă©crit sous la forme simplestblog_db:3306), et ainsi se retrouver Ă Ă©changer avec le processus MariaDB du conteneur simplestblog_db.
Jusqu’ici dans le cours, sur le cas d’Ă©tude Simplestblog, nous avons regardĂ© de maniĂšre sĂ©parĂ©e :
-
l’utilisation du montage de fichiers/rĂ©pertoires, utilisĂ© Ă la fois pour fournir un fichier de configuration Ă Simplestblog et pour persister les donnĂ©es de la base de donnĂ©e MariaDB,
-
l’utilisation d’une publication de port pour pouvoir se connecter au port rĂ©seau sur lequel Ă©coute le processus Simplestblog,
-
l’utilisation d’un rĂ©seau virtuel pour permettre au processus Simplestblog de communiquer avec le processus MariaDB situĂ© dans un conteneur sĂ©parĂ©.
Voyons schématiquement à quoi ressemble ce déploiement une fois ces trois principes combinés :
3. Mise en Ćuvre avec Podman
La crĂ©ation d’un rĂ©seau virtuel doit se faire sĂ©parĂ©ment et au prĂ©alable de la crĂ©ation d’un conteneur.
Pour créer un nouveau réseau virtuel :
$ podman network create <nom du réseau>
Pour lister tous les réseaux créés :
$ podman network ls
Ensuite, la connexion d’un conteneur Ă un rĂ©seau virtuel se fait lors de la crĂ©ation d’un conteneur (par exemple lors d’un appel Ă podman container run) Ă l’aide de l’option suivante :
-
--network <nom du réseau>: connecte le conteneur au réseau virtuel appelé<nom du réseau>.
On souhaite dĂ©ployer Simplestblog Ă l’aide de conteneurs. Il nous faut pour cela crĂ©er deux conteneurs : Simplestblog d’une part, et une base de donnĂ©es compatible MySQL d’autre part. Il nous faut Ă©galement relier ces deux conteneurs Ă l’aide d’un rĂ©seau virtuel, afin de permettre Ă Simplestblog de se connecter Ă sa base de donnĂ©es.
On commence par prĂ©parer un rĂ©seau virtuel appelĂ© simplestblog_network qui permettra aux deux conteneurs d’ĂȘtre connectĂ©s :
$ podman network create simplestblog_network
Pour la base de donnĂ©es, on souhaite utiliser l’image MariaDB disponible sur le registre Docker Hub Ă l’emplacement mariadb.
On souhaite que notre conteneur MariaDB :
-
soit nommé
simplestblog_db, -
soit en mode détaché,
-
soit automatiquement supprimé à la fin de son exécution,
-
possĂšde un montage du rĂ©pertoire de l’environnement d’accueil
/data/simplestblog/database_datavers le rĂ©pertoire/var/lib/mysqldu conteneur, de maniĂšre Ă persister le contenu de la base de donnĂ©es sur l’environnement d’accueil, -
soit sur la réseau virtuel
simplestblog_network, -
configure les variables d’environnement attendues par l’image MariaDB, c’est Ă dire :
-
MARIADB_ROOT_PASSWORD, le mot de passe administrateur de l’instance MariaDB, avec la valeur "my_very_very_secret_root_password", -
MARIADB_DATABASE, le nom de la base de donnée pour Simplestblog, avec la valeursimplestblog -
MARIADB_USER, le nom d’utilisateur du compte base de donnĂ©es, avec la valeur "simplestblog", -
MARIADB_PASSWORD, le mot de passe pour le compte base de données, avec la valeur "my_very_secret_db_password",
-
-
utilise la version
11de l’image de conteneur.
On exécute donc la commande suivante :
$ podman container run --name simplestblog_db \
--detach \
--rm \
--mount type=bind,source=/data/simplestblog/database,target=/var/lib/mysql \
--env MARIADB_ROOT_PASSWORD="my_very_very_secret_root_password" \
--env MARIADB_DATABASE="simplestblog" \
--env MARIADB_USER="simplestblog" \
--env MARIADB_PASSWORD="my_very_secret_db_password" \
--network simplestblog_network \
docker.io/mariadb:11
Ensuite, pour Simplestblog, on fait usage de l’image disponible dans le registre de conteneurs du Gitlab Nantes UniversitĂ©, accessible Ă l’emplacement developpement_exploitation/resources/simplestblog.
On suppose qu’une image de conteneur a dĂ©jĂ Ă©tĂ© prĂ©parĂ©e pour Simplestblog, et que cette image fait l’hypothĂšse qu’un fichier de configuration doit se trouver Ă l’emplacement /config.py au sein du conteneur.
Ce fichier doit notamment contenir les informations indiquant à Simplestblog comment se connecter à sa base de données.
On prĂ©pare le fichier configuration Simplestblog suivant, Ă l’emplacement /data/simplestblog/test_config.py dans l’environnement d’accueil :
SECRET_KEY = "my_very_secret_key"
DB_TYPE = "mysql"
MYSQL_DATABASE_USER = "simplestblog"
MYSQL_DATABASE_DB = "simplestblog"
MYSQL_DATABASE_PASSWORD = "my_very_secret_db_password"
MYSQL_DATABASE_HOST = "simplestblog_db"
MYSQL_DATABASE_PORT = "3306"
Le contenu de ce fichier de configuration est prĂ©parĂ© de maniĂšre Ă ĂȘtre compatible avec le conteneur MariaDB prĂ©parĂ© plus haut. Plus prĂ©cisĂ©ment on peut constater que :
-
MYSQL_DATABASE_USERcorrespond ĂMARIADB_USERdans la configuration du conteneur MariaDB, -
MYSQL_DATABASE_DBcorrespond ĂMARIADB_DATABASEdans la configuration du conteneur MariaDB, -
MYSQL_DATABASE_PASSWORDcorrespond ĂMARIADB_PASSWORDdans la configuration du conteneur MariaDB, -
MYSQL_DATABASE_HOSTcorrespond au nom du conteneur MariaDB, car le nom du conteneur est Ă©galement un nom d’hĂŽte permettant d’atteindre le dit conteneur au sein du rĂ©seau virtuel oĂč il se trouve (Ă savoir le rĂ©seausimplestblog_networkdans notre exemple). -
MYSQL_DATABASE_PORTcorrespond au port sur lequel écoute le processus MariaDB (à savoir, par défaut, 3306)
Enfin on souhaite que notre conteneur Simplestblog :
-
soit nommé
simplestblog_app, -
soit en mode détaché,
-
soit automatiquement supprimé à la fin de son exécution,
-
possĂšde un montage du rĂ©pertoire de l’environnement d’accueil
/data/simplestblog/test_config.pyvers le fichier/config.pydu conteneur, -
soit sur la réseau virtuel
simplestblog_network, -
publie son port
5000sur le port8100de l’environnement d’accueil, -
utilise la version
52de l’image de conteneur.
On exécute donc la commande suivante :
$ podman container run --name simplestblog_app \
--detach \
--rm \
--mount type=bind,source=/data/simplestblog/test_config.py,target=/config.py \
--network simplestblog_network \
--publish 8100:5000 \
docker-registry.univ-nantes.fr/gl/developpement_exploitation/resources/simplestblog:60
On se retrouve ainsi avec un conteneur Simplestblog relié par un réseau virtuel à un conteneur MariaDB !
On notera également la commande suivante, pour supprimer tous les réseaux non utilisés par des conteneurs (pratique pour faire le ménage) :
$ podman network prune