đ» TP : Conteneuriser (manuellement) un logiciel
L’objectif de ce TP est d’apprendre Ă utiliser Podman pour transformer un conteneur en une image de conteneur, et pour publier une image au sein d’un registre de conteneur distant.
1. Préparatifs
1.1. CrĂ©ation d’un projet Gitlab
Les premiers Ă©noncĂ©s de ce TP nĂ©cessitent d’ĂȘtre rĂ©alisĂ©s au travers d’un projet sur le Gitlab de l’UniversitĂ©.
Reprenez la notice Gitlab et suivez les instructions pour créer un nouveau projet privé avec pour nom developpement_exploitation-tp-images.
Ce projet vous permettra de publier vos images de conteneurs au sein du registre de conteneur du Gitlab de l’universitĂ©.
|
Pour des raisons pratiques liĂ©es Ă l’infrastructure disponible Ă l’UniversitĂ©, on utilisera le serveur de dĂ©ploiement ( |
1.2. Authentification Podman pour le registre de conteneurs de l’UniversitĂ©
Ce TP va vous apprendre Ă publier vos images sur le registre de conteneurs du Gitlab de l’UniversitĂ©. Cela nĂ©cessite au prĂ©alable de donner Ă Podman vos informations de connexion pour qu’il puisse se connecter au Gitlab.
Pour cela, depuis le serveur de déploiement, faites :
$ podman login docker-registry.univ-nantes.fr
Puis saisissez votre identifiant et votre mot de passe que vous utilisez pour vous connecter habituellement sur Gitlab, et validez.
| Cette commande devra ĂȘtre re-exĂ©cutĂ©e au dĂ©but de chaque TP, car une fois effectuĂ©e l’authentification n’est valide que durant la session en cours ! |
2. Tutoriel : une premiĂšre image Ubuntu avec cowsay
2.1. Rappel du précédent tutoriel Ubuntu
Pour débuter, nous allons repartir du premier tutoriel du second TP.
Pour rappel, nous avions créé un conteneur Ă partir d’une image Ubuntu, puis nous avions exĂ©cutĂ© un interprĂ©teur de commandes dans ce conteneur afin d’installer un logiciel appelĂ© cowsay Ă l’aide des commandes suivantes :
$ apt update
$ apt install cowsay
Un inconvĂ©nient de cette approche est que si l’on dĂ©truit le conteneur ainsi obtenu, alors on perdra au passage l’installation de logiciel rĂ©alisĂ©e. Ainsi, si on devait recrĂ©er un conteneur identique, il faudrait alors Ă nouveau effectuer manuellement cette installation.
2.2. CrĂ©ation d’une image de conteneur cowsay
L’objectif ici est de crĂ©er une image de conteneur dans laquelle le logiciel souhaitĂ© (Ă savoir cowsay) est dĂ©jĂ installĂ©.
Ainsi, tout conteneur créé à partir de cette image possédera directement le logiciel souhaité.
Tout d’abord, prĂ©parons un nouveau conteneur Ă partir d’une image de base, Ă savoir l’image docker.io/ubuntu:24.04 (la mĂȘme que dans le premier tutoriel) :
$ podman container run -ti --name cowsay_template \
docker.io/ubuntu:24.04
Nous avons nommĂ© notre conteneur cowsay_template pour bien signifier que notre conteneur est un template (c’est Ă dire un gabarit ou un patron) qui sera ensuite transformĂ© en une nouvelle image de conteneur.
|
Au sein de ce nouveau conteneur, on installe la commande cowsay :
$ apt update
$ apt install cowsay
Enfin, on peut quitter le conteneur (ce qui l’arrĂȘte au passage) :
$ exit
Il ne nous reste plus qu’Ă crĂ©er une nouvelle image de conteneur Ă partir de notre conteneur template :
$ podman container commit cowsay_template \
tutoriel-cowsay:v1
Ici on a choisi de nommer notre nouvelle image de conteneur tutoriel-cowsay, et de lui donner l’Ă©tiquette v1.
Une fois l’image construite, vĂ©rifiez qu’elle est bien prĂ©sente dans votre stockage d’image local :
$ podman image list
On notera que la colonne REPOSITORY indique la rĂ©fĂ©rence d’image, qui dans notre cas commence par localhost puisque l’image est sur le stockage local.
| Il est possible que vous ayez Ă©galement dans cette liste un reliquat d’images tĂ©lĂ©chargĂ©es dans les prĂ©cĂ©dents exercices, ce qui est normal. |
Il ne nous reste plus qu’Ă tester notre nouvelle image, on peut donc faire :
$ podman container run --rm -ti \
localhost/tutoriel-cowsay:v1
On se retrouve dans un interprĂ©teur de commandes au sein du conteneur. On peut alors directement exĂ©cuter la commande souhaitĂ©e, sans avoir Ă l’installer au prĂ©alable :
$ /usr/games/cowsay "Bonjour depuis notre premiĂšre image de conteneur !"
2.3. Publication de l’image
On souhaite publier notre image sur le registre de conteneurs associé au Gitlab de l' Université, dans le but (hypothétique) de pouvoir réutiliser cette image pour différents déploiements.
Dans un registre de conteneurs Gitlab, une image ne peut ĂȘtre stockĂ©e que au sein d’un projet dĂ©jĂ créé. Nous allons ici utiliser le projet créé dans la Section 1.1 (TODO).
Pour publier votre image, préparez et exécutez la commande suivante :
$ podman image push localhost/tutoriel-cowsay:v1 \
docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v1
oĂč <chemin projet> est le chemin de votre projet au sein de l’arborescence Gitlab.
Si vous avez le compte étudiant eXXXXX et que vous avez nommé votre projet developpement_exploitation-tp-images, alors votre chemin de projet aura la forme eXXXXX/developpement_exploitation-tp-images.
| Il est nĂ©cessaire de mettre votre compte Ă©tudiant en minuscules pour que le chemin cible de publication d’image fonctionne. |
Dans cette commande, on observe que la derniĂšre partie de la cible de publication reprend le nom et l’Ă©tiquette de l’image (tutoriel-cowsay:v1) de maniĂšre identique au nom de l’image que nous avions créée dans le stockage local.
En effet, le souhait ici est de garder le mĂȘme nom et la mĂȘme Ă©tiquette sur le registre distant.
On notera cependant que ce n’est pas forcĂ©ment le cas : on peut trĂšs bien publier une image sous un nom et/ou une Ă©tiquette diffĂ©rente de son nom et son Ă©tiquette du stockage local.
|
Pour vĂ©rifier que la publication a bien fonctionnĂ©, utilisez un navigateur pour vous rendre sur la page du projet Gitlab, et rendez-vous dans la section DĂ©ploiement â Registre de conteneur.
La liste doit contenir un élément correspondant aux images nommées tutoriel-cowsay.
En cliquant sur cet Ă©lĂ©ment, on accĂšde Ă la liste des Ă©tiquettes, qui doit contenir simplement l’Ă©tiquette v1.
Pour tester votre image publiĂ©e, on peut de nouveau exĂ©cuter un conteneur mais avec une rĂ©fĂ©rence d’image correspondant Ă l’image distante :
$ podman container run --rm -ti \
docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v1
Et vous devriez avoir le mĂȘme rĂ©sultat que lors de l’exĂ©cution de l’image avec la rĂ©fĂ©rence locale.
2.4. Ajout d’un point d’entrĂ©e
On souhaite maintenant amĂ©liorer notre image en modifiant quel logiciel est exĂ©cutĂ© lors du dĂ©marrage d’un conteneur créé avec l’image.
Cela nĂ©cessite de spĂ©cifier un point d’entrĂ©e pour l’image Ă l’aide de la mĂ©tadonnĂ©e CMD.
Comme la v1 de notre image ne spĂ©cifiait pas de point d’entrĂ©e, elle hĂ©ritait par dĂ©faut de celui spĂ©cifiĂ© dans l’image de base (docker.io/ubuntu:24.04), ce qui correspond ici Ă l’interprĂ©teur de commandes bash.
C’est pour cela que la commande podman container run a directement dĂ©marrĂ© un interprĂ©teur de commande Ă partir de notre image.
|
Pour ce tutoriel, on souhaite que la commande cowsay soit exĂ©cutĂ©e au dĂ©marrage d’un conteneur.
ProblÚme : cette commande nécessite un argument, à savoir le message à afficher.
Comment faire pour qu’un conteneur créé Ă partir de notre image puisse recevoir le message Ă afficher ?
Comme on a pu le voir dans le TP prĂ©cĂ©dent, la technique la plus courante pour confier des informations Ă un conteneur est sous la forme de variables d’environnement passĂ©es Ă l’aide de l’option --env lors de la crĂ©ation du conteneur.
Si on revient Ă la crĂ©ation de l’image, il est possible dans une mĂ©tadonnĂ©e CMD de faire rĂ©fĂ©rence Ă une variable d’environnement avec la syntaxe $VARIABLE.
On va donc re-creér notre image de conteneur en ajoutant cette métadonnée :
$ podman container commit cowsay_template \
--change 'CMD /usr/games/cowsay $MESSAGE' \
tutoriel-cowsay:v2
On peut vĂ©rifier que l’image est bien créée Ă nouveau Ă l’aide de la commande :
$ podman image list
On peut voir que les deux images créées sont prĂ©sentes dans le stockage d’image local, la premiĂšre avec l’Ă©tiquette v1, la seconde avec l’Ă©tiquette v2.
|
On peut ainsi désormais exécuter un conteneur de la sorte :
$ podman container run --rm \
--env MESSAGE="Re-bonjour depuis notre premiĂšre image !" \
localhost/tutoriel-cowsay:v2
Et voilà notre premiÚre image paramétrable lors de son exécution en conteneur !
2.5. Re-publication de l’image
Pour finir, on publie cette deuxiÚme version de notre image aux cÎtés de la premiÚre version :
$ podman image push localhost/tutoriel-cowsay:v2 \
docker-registry.univ-nantes.fr/<chemin projet>/tutoriel-cowsay:v2
Allez de nouveau vĂ©rifier la liste des images au sein de la page de votre projet, et vous devez constater qu’il a dĂ©sormais deux Ă©tiquettes pour les images nommĂ©es tutoriel-cowsay.
3. Exercice : image Alpine avec Asciidoctor
3.1. ĂnoncĂ©
On souhaite prĂ©parer une image de conteneur qui permette d’exĂ©cuter facilement le logiciel Asciidoctor. Asciidoctor est un logiciel qui permet de convertir un fichier Ă©crit Ă l’aide du langage Asciidoc (similaire au langage Markdown), afin de produire un document HTML en sortie.
Asciidoctor s’utilise depuis un terminal Ă l’aide d’une commande qui peut prendre la forme suivante :
$ asciidoctor mondocument.adoc
et qui produit en résultat un fichier mondocument.html
Pour notre image de conteneur, on fait les choix suivants :
-
On utilisera comme image de base l’image officielle Alpine disponible sur le Docker Hub, en version 3.22.
-
On installera Asciidoctor simplement Ă l’aide de l’utilitaire
apkdisponible sur Alpine Linux. Avecapk, Asciidoctor peut ĂȘtre installĂ© Ă l’aide du paquet appelĂ©asciidoctor. Comme dĂ©jĂ prĂ©sentĂ© dans le TP prĂ©cĂ©dent,apks’utilise principalement avec deux actions :-
apk updatepermet de rĂ©cupĂ©rer la liste des paquets disponibles (similaire Ăapt update), -
apk add <nom du paquet>permet d’installer un nouveau paquet (similaire Ăapt install).
-
En outre, on souhaite que le point d’entrĂ©e de notre image soit l’exĂ©cution de la commande asciidoctor sur un fichier situĂ© dans un rĂ©pertoire /data situĂ© dans le conteneur.
L’image de conteneur produite devra avoir pour nom exercice-asciidoctor et pour Ă©tiquette 1.0.
3.2. Questions
-
Faites un travail préliminaire de conception de votre future image de conteneur en vous posant notamment les questions suivantes :
-
est-il nĂ©cessaire de pouvoir configurer l’exĂ©cution du logiciel conteneurisĂ© (Ă savoir Asciidoctor) ? si oui, quel mode de configuration est possible et pourrait ĂȘtre mis en place ?
-
quel point d’entrĂ©e dĂ©finir pour l’image ? comment articuler ce point d’entrĂ©e avec le mode de configuration choisi au point prĂ©cĂ©dent ?
-
est-ce qu’un montage sera nĂ©cessaire lors de la phase d’usage de l’image ? lequel et pourquoi ? comment rendre cohĂ©rent ce point de montage avec le mode de configuration et avec le point d’entrĂ©e dĂ©finis prĂ©cĂ©demment ?
Pour vous aider, vous pouvez également vous poser les questions suivantes :
-
Comment permettre Ă Asciidoctor de lire le fichier que l’on souhaite convertir en HTML ?
-
Comment permettre Ă Asciidoctor de savoir quel fichier convertir ?
-
-
-
PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©. Pour cela, vous pouvez d’abord vous poser les questions suivantes :
-
Quelle est la rĂ©fĂ©rence de l’image de base Ă utiliser ?
-
Quelles commandes faut-il exécuter au sein du conteneur pour installer Asciidoctor ?
-
-
En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur.
-
VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.
-
Testez votre nouvelle image de conteneur en exĂ©cutant un conteneur qui convertit un fichier Asciidoc de l’environnement d’accueil en HTML.
-
Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.
4. Tutoriel : une image pour déployer un site web avec nginx
4.1. Rappel du précédent tutoriel nginx
Pour débuter, nous allons repartir du premier tutoriel du TP sur la publication de port.
Pour rappel, dans ce tutoriel, nous avions créé un conteneur Ă partir d’une image nginx Ă l’aide de la rĂ©fĂ©rence d’image docker.io/nginx:1.25, et nous avons exĂ©cutĂ© ce conteneur avec Ă la fois un montage de rĂ©pertoire pour lui confier des fichiers HTMLs, et avec une publication de port pour que le serveur web soit accessible par le rĂ©seau.
Cette approche est tout a fait viable pour déployer un site web. Cependant, si dans le futur il devient nécessaire de migrer notre site web depuis un premier serveur de déploiement vers un nouveau serveur de déploiement, elle a pour inconvénient de nécessiter le déplacement de tous les fichiers du site web vers le nouveau serveur.
4.2. CrĂ©ation d’une image de conteneur nginx avec site web intĂ©grĂ©
L’objectif ici est de crĂ©er une image de conteneur dans laquelle se trouve directement Ă la fois le logiciel nginx et le site web qu’on souhaite dĂ©ployer. Ainsi, la migration de ce site web ne nĂ©cessitera plus qu’Ă supprimer le conteneur d’un premier serveur de dĂ©ploiement, et de recrĂ©er un conteneur identique sur un nouveau serveur.
Pour accomplir cela, il nous faut, lors de la crĂ©ation de l’image, s’assurer que notre site web (qui contient Ă minima un fichier index.html) soit copiĂ© dans le rĂ©pertoire /usr/share/nginx/html/ de l’image, car c’est Ă cet emplacement que nginx va charger le site qu’il rendra accessible.
Au sein de l’image nginx, le contenu par dĂ©faut de /usr/share/nginx/html/ n’est pas vide, car il contient une page d’accueil d’exemple, qui ne nous intĂ©resse pas !
Il va donc nous falloir remplacer ce répertoire par le contenu de notre choix.
|
On commence par crĂ©er un conteneur template Ă partir d’une image de base. Cette fois-ci, on choisit comme base l’image officielle nginx, qui permet de partir d’une base dans laquelle le logiciel nginx est dĂ©jĂ installĂ© :
$ podman container run -ti --name nginx_template \
docker.io/nginx:1.25 \
bash
On spĂ©cifie que l’on souhaite utiliser l’interprĂ©teur de commandes bash comme point d’entrĂ©e, car par dĂ©fait le point d’entrĂ©e de l’image officielle nginx est le dĂ©marrage du serveur web.
|
Dans notre conteneur template, il nous faut d’abord supprimer la page web exemple qui y est fournie par dĂ©faut dans l’image de conteneur nginx :
# rm /usr/share/nginx/html/*
On va ensuite y mettre Ă la place notre propre page web. Pour cet exercice, utilisez le fichier HTML que vous aviez gĂ©nĂ©rĂ© Ă l’aide d’Asciidoctor dans l’exercice prĂ©cĂ©dent, et Ă l’aide d’un second terminal, copiez ce fichier au sein de votre conteneur template :
$ podman container cp <fichier html> nginx_template:/usr/share/nginx/html/index.html
Lors de cette copie, on renomme notre fichier HTML en index.html, car c’est le fichier qui sera utilisĂ© par dĂ©faut par nginx comme point de dĂ©part de notre site web.
|
Dans le conteneur, on peut vérifier que notre fichier est bien arrivé à destination :
# cd /usr/share/nginx/html/
# ls
Si tout est bon, on peut quitter le conteneur (ce qui le stoppe au passage) :
# exit
Il ne nous reste plus qu’Ă transfomer notre conteneur template en nouvelle image de conteneur. Il nous faut pour cela spĂ©cifier un point d’entrĂ©e. On choisit ici de rĂ©utiliser Ă l’identique le mĂȘme point d’entrĂ©e que l’image de conteneur officielle nginx, qui consiste juste Ă dĂ©marrer le serveur web :
$ podman container commit nginx_template \
--change 'CMD nginx -g "daemon off;"' \
tutoriel-nginx:1
Enfin, testez votre image en créant un conteneur :
$ podman container run --rm \
--detach \
--name nouveau_serveur_web \
--publish <mon port réseau>:80 \
localhost/tutoriel-nginx:1
| Cette fois-ci, pas besoin de montage de rĂ©pertoire pour dĂ©ployer notre site web : ce dernier est dĂ©jĂ inclus dans l’image, et donc dans le conteneur ! |
VĂ©rifiez que votre dĂ©ploiement fonctionne en accĂ©dant depuis un navigateur Ă l’adresse http://podman:<mon port rĂ©seau> : normalement votre HTML s’affiche comme prĂ©vu !
5. Exercice : une image de conteneur pour economic_dispatch
5.1. ĂnoncĂ©
On souhaite prĂ©parer une image de conteneur qui permette d’exĂ©cuter facilement le l’outil economic_dispatch vu dans les premiers TPs.
Pour rappel, c’est un outil Ă©crit en Julia qui permet de faire un calcul d’optimisation Ă partir d’un modĂšle de scĂ©nario.
Pour notre image de conteneur, on fait les choix suivants :
-
On utilisera comme image de base
docker.io/julia, avec l’Ă©tiquette1.11-trixie. -
Lors de la phase d’usage de l’image, on souhaite pouvoir confier un modĂšle d’entrĂ©e Ă notre outil.
-
L’image de conteneur produite devra avoir pour nom
exercice-economic-dispatchet pour étiquettea.
Pour rappel, il est possible dâinstaller une bibliothĂšque Julia avec la commande suivante:
# julia -e 'import Pkg; Pkg.add("<nom de la bibliothĂšque>")'
5.2. Questions
-
Faites un travail préliminaire de conception de votre future image de conteneur.
RĂ©flĂ©chissez bien au point d’entrĂ©e que vous souhaitez avoir. -
PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©.
Pour récupérer le code source du projet Gitlab, vous pouvez suivre les instructions dédiées de la notice Gitlab. -
En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur.
-
VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.
-
Testez votre nouvelle image de conteneur en exĂ©cutant un conteneur qui s’exĂ©cute sur le modĂšle exemple fourni dans la documentation de l’outil.
-
Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.
6. Exercice : créer une image pour Web Calculator (Python)
6.1. ĂnoncĂ©
On souhaite crĂ©er une image de conteneur pour un logiciel fraĂźchement dĂ©veloppĂ© appelĂ© Web Calculator. C’est une application web dĂ©veloppĂ©e en Python, dont le code source est disponible sur le projet Gitlab suivant.
Une fois exĂ©cutĂ©e, l’application peut ĂȘtre accĂ©dĂ©e via un navigateur web, et fournit une interface pour faire des calculs arithmĂ©tiques entre deux nombres (addition, soustraction, etc.).
Lisez la documentation de l’application, et en particulier les sections 3 et 4. On y trouve des informations importantes, notamment :
-
Le logiciel nécessite un certain nombre de dépendances Python.
-
Ces dĂ©pendances peuvent ĂȘtre installĂ©es Ă l’aide de l’utilitaire
pip. -
Une commande
uvicornpermet de démarrer le logiciel. -
Le logiciel nécessite le port réseau
8000pour recevoir des connexions.
| La documentation fait rĂ©fĂ©rence Ă un concept Python appelĂ© venv. C’est une maniĂšre pratique pour crĂ©er des environnements Python dans lesquelles on installer des dĂ©pendances spĂ©cifiques Ă un dĂ©veloppement ou un dĂ©ploiement particulier. Dans notre cas, nous pouvons ignorer l’utilisation de venv car cela n’est pas nĂ©cessaire dans un conteneur, qui fourni dĂ©jĂ un environnement isolĂ© adaptĂ©. |
6.2. Questions
-
Faites un travail préliminaire de conception de votre future image de conteneur.
Ă nouveau, rĂ©flĂ©chissez bien au point d’entrĂ©e que vous souhaitez avoir. -
PrĂ©parez un conteneur template dans lequel vous installez tout le nĂ©cessaire pour rĂ©pondre au besoin de l’Ă©noncĂ©.
Pour récupérer le code source du projet Gitlab, vous pouvez suivre les instructions dédiées de la notice Gitlab. -
En vous basant sur votre travail préliminaire de conception, transformez votre conteneur template en image de conteneur, avec pour nom
webcalculatoret pour étiquettedev. -
VĂ©rifiez que l’image créée est bien prĂ©sente dans votre stockage local d’images.
-
Testez votre application Ă l’aide d’un navigateur.
-
Publiez votre image sur le mĂȘme projet Gitlab que celui prĂ©parĂ© en Section 1.1, avec le mĂȘme nom et la mĂȘme Ă©tiquette que ceux utilisĂ©s lors de la crĂ©ation de l’image locale.