đŸ’» TP : Publication de ports rĂ©seaux

Dans les TPs jusqu’ici, la seule maniĂšre que nous avons eu Ă  disposition pour intĂ©ragir avec un logiciel exĂ©cutĂ© au sein d’un conteneur Ă©tait par le biais de rĂ©pertoires et fichiers, que ce soit Ă  l’aide de simples copies (podman container cp) ou bien Ă  l’aide de montages (--mount).

Dans le prĂ©sent TP, vous allez voir comment permettre des intĂ©ractions avec un logiciel conteneurisĂ© en reliant un conteneur Ă  l’interface rĂ©seau (et donc au rĂ©seau local) de l’environnement de dĂ©ploiement, Ă  l’aide de publications de ports.

1. Tutoriel : dĂ©ployer un serveur web nginx avec publication de port

On se propose de dĂ©ployer un serveur web nginx qui aura pour mission de publier des pages HTMLs simples. Pour cela, on souhaite utiliser l’image de conteneur nginx officielle, Ă  savoir une image de conteneur qui a dĂ©jĂ  Ă©tĂ© prĂ©parĂ©e avec le logiciel nginx et toutes ses dĂ©pendances.

1.1. Exécution avec publication de port

En lisant la documentation de l’image nginx, on observe deux choses utiles :

  • Le point d’entrĂ©e de l’image est l’exĂ©cution d’un processus serveur serveur web nginx. Ainsi, si on exĂ©cute un conteneur Ă  partir de l’image, cela dĂ©marrera directement un processus nginx.

  • Un processus serveur web nginx Ă©coute sur le port rĂ©seau 80. Ainsi, pour que ce serveur web soit accessible depuis un navigateur exĂ©cutĂ© sur votre poste de travail, il va ĂȘtre nĂ©cessaire d’effectuer une publication de port qui rende le conteneur accessible depuis le rĂ©seau local de l’universitĂ©. Cette publication de port va permettre de relier un port rĂ©seau de votre conteneur (Ă  savoir, dans le cas prĂ©sent, le port 80) Ă  un port rĂ©seau de l’interface rĂ©seau de son environnement d’accueil − Ă  savoir le serveur de dĂ©ploiement.

    Pour rappel, le serveur de dĂ©ploiement est partagĂ© par tous les Ă©tudiants de la formation. Ainsi, il est nĂ©cessaire que chaque Ă©tudiant⋅e ne fasse des publications de port que sur les ports rĂ©seaux qui lui sont attribuĂ©s ! Merci de lire attentivement la section correspondante de la notice serveur.

PrĂ©parez et exĂ©cutez la commande suivante afin de crĂ©er un conteneur nginx appelĂ© serveur_web_1, et afin d’effectuer une publication de port sur le port 80 du conteneur  :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run --rm \
                       --detach \
                       --name serveur_web_1 \
                       --publish <mon port réseau>:80 \
                       docker.io/nginx:1.25

en remplaçant <mon port réseau> par un port de votre choix de votre intervalle de port attribué.

On choisit d’utiliser l’option --rm pour que notre conteneur s’autodĂ©truise Ă  son arrĂȘt, ainsi que l’option --detach pour ne pas attacher notre terminal au conteneur.

Pour vĂ©rifier que votre conteneur est bien en exĂ©cution, effectuez la commande suivante :

[sur l’environnement de dĂ©ploiement distant]
$ podman container ps

Vous devez voir que :

  • l’image utilisĂ©e est la bonne,

  • le statut est Up,

  • la publication de port est bien celle demandĂ©e,

  • le nom du conteneur est bien serveur_web_1.

Et pour uniquement vérifier la liste des publications de ports du conteneur, on peut faire :

[sur l’environnement de dĂ©ploiement distant]
$ podman container port serveur_web_1
Affichage de la publication de port

Supposons que votre publication du port 80 du conteneur mon_conteneur de fasse sur le port 7777 de l’environnement d’accueil. Si on utilise podman container port mon_conteneur, on verra alors apparaĂźtre :

80/tcp -> 0.0.0.0:8081

Décortiquons cela :

  • 80/tcp dĂ©signe le port rĂ©seau du conteneur que nous souhaitons publier. Le suffixe /tcp signifie que la publication de port est effectuĂ©e Ă  l’aide du protocole rĂ©seau TCP. En effet, il est Ă©galement possible de publier un port Ă  l’aide du protocole UDP, mais cela ne sera pas traitĂ© non plus dans le cours.

  • 0.0.0.0:8081 dĂ©signe le port rĂ©seau de l’environnement d’accueil sur lequel nous souhaitons faire la publication de port. La notation 0.0.0.0 signifie que la publication de port est effectuĂ©e sur toutes les interfaces rĂ©seau de l’environnement d’accueil. Il est en effet possible de restreindre une publication de port pour cibler Ă  une ou plusieurs interfaces rĂ©seaux choisies, mais ce cas ne sera pas traitĂ© dans le cours.

Pour vĂ©rifier que le conteneur est bien en train de travailler, regardez les logs Ă©crits par le conteneur Ă  l’aide de la commande suivante :

[sur l’environnement de dĂ©ploiement distant]
$ podman container logs serveur_web_1

Cela devrait vous afficher un grand nombre de lignes peu évidentes à comprendre, mais qui semblent indiquer que le serveur est bien en train de fonctionner !

On peut dĂ©sormais tester notre conteneur : sur votre poste informatique Linux, ouvrez le navigateur web Firefox, et accĂ©dez Ă  l’adresse suivante : http://podman:<mon port rĂ©seau>, avec <mon port rĂ©seau> le mĂȘme port que celui choisi pour la publication lors de la crĂ©ation du conteneur.

Dans cette adresse HTTP, on Ă©crit podman car c’est le nom d’hĂŽte de l’environnement de dĂ©ploiement utilisĂ© pour les TPs. Comme vos machines de TP sont sur un mĂȘme rĂ©seau informatique que cet environnement de dĂ©ploiement, elles peuvent le contacter via son nom d’hĂŽte.

Vous devriez normalement accĂ©der Ă  la page par dĂ©faut qu’affiche un conteneur nginx, avec pour titre "Welcome to nginx!".

Si tout est OK, on peut dĂ©sormais stopper et supprimer notre conteneur avant de passer Ă  la suite :

[sur l’environnement de dĂ©ploiement distant]
$ podman container stop serveur_web_1
Le conteneur ici est automatiquement supprimé suite au stop, car nous avions spécifié --rm lors de sa création.

1.2. Exécution avec montage de répertoire

En lisant la documentation de l’image nginx, on observe que, par dĂ©faut, la page HTML affichĂ©e est le fichier /usr/share/nginx/html/index.html situĂ© Ă  l’intĂ©rieur du conteneur. Afin d’afficher la page HTML de notre choix, il va ĂȘtre nĂ©cessaire d’effectuer un montage de rĂ©pertoire qui nous permette de personnaliser le contenu de /usr/share/nginx/html.

Commencez par prĂ©parer une page HTML extrĂȘmement simple Ă  publier Ă  l’aide de notre serveur web :

  • Sur le serveur de dĂ©ploiement, crĂ©ez un rĂ©pertoire mon_site_web.

  • Dans ce rĂ©pertoire, utilisez nano pour crĂ©er un fichier index.html, et mettez-y le contenu suivant :

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <title>Premier déploiement</title>
    </head>
    
    <body>
        <h1>Bienvenue !</h1>
        <p>Ce déploiement a été réalisé par XXXXXXXXXXX</p>
        <p>Si vous voyez cette page, c'est que tout a bien fonctionné.</p>
    </body>
    
    </html>

    en remplaçant XXXXXXXXXXX par votre nom (ou vos noms, si le travail est fait à plusieurs).

    Vous pouvez personnaliser le contenu de cette page à loisir, elle sert simplement de prétexte pour ce tutoriel.
  • Enfin, effectuez la commande pwd pour afficher le chemin absolu du rĂ©pertoire mon_site_web, et notez ce chemin pour l’Ă©tape suivante.

Maintenant que le contenu du site est prĂȘt, prĂ©parez et exĂ©cutez la commande suivante afin de crĂ©er Ă  nouveau un conteneur nginx similaire au prĂ©cĂ©dent, mais avec le montage de rĂ©pertoire souhaitĂ© :

[sur l’environnement de dĂ©ploiement distant]
$ podman container run --rm \
                       --detach \
                       --name serveur_web_2 \
                       --publish <mon port réseau>:80 \
                       --mount type=bind,source="<chemin absolu mon_site_web>",target="/usr/share/nginx/html" \
                       docker.io/nginx:1.25

avec <chemin absolu mon_site_web> le chemin absolu vers le rĂ©pertoire mon_site_web, obtenu prĂ©cĂ©demment Ă  l’aide de la commande pwd.

Testons ce nouveau conteneur : sur votre poste informatique Linux, utilisez Firefox pour accĂ©der Ă  nouveau Ă  l’adresse : http://podman:<mon port rĂ©seau>. Vous devriez normalement accĂ©der Ă  une page avec pour titre "Bienvenue !" et avec le contenu que vous aviez Ă©crit dans le fichier index.html. Si oui, bravo, vous avez dĂ©ployĂ© votre premier site web Ă  l’aide d’un conteneur !

Pour faire un bon rappel du fonctionnement d’un montage de rĂ©pertoire avec --mount, vous pouvez modifier le fichier index.html dans l’environnement d’accueil alors que votre conteneur est toujours en exĂ©cution, puis rafraĂźchir la page web affichĂ©e dans Firefox sur votre poste Linux : le changement sera instantanĂ©ment visible ! En effet, le rĂ©pertoire montĂ© existe simultanĂ©ment dans l’environnement d’accueil et dans le conteneur, ainsi un changement effectuĂ© dans l’un est directement visible dans l’autre.
Pour la suite, ne stoppez pas et ne supprimez pas tout de suite votre conteneur serveur_web_2.

1.3. Exécution de commandes dans un conteneur déjà en exécution

On souhaite comprendre ce qu’il se passe au sein du conteneur serveur_web_2 créé dans la section prĂ©cĂ©dente. Pour cela, exĂ©cutez la commande suivante :

[sur l’environnement de dĂ©ploiement distant]
$ podman container exec -ti serveur_web_2 bash
La notation -ti est la combinaison des options -t (version abrĂ©gĂ©e de --tty) et -i (version abrĂ©gĂ©e de --interactive). Pratique dĂšs qu’on souhaite crĂ©er une session interactive.

Suite Ă  cette commande, on se retrouve dans une session interactive de l’interprĂ©teur de commandes Bash au sein du conteneur serveur_web_2, et tout cela sans avoir interrompu l’exĂ©cution du processus nginx. On peut alors par exemple aller voir le conteneur du rĂ©pertoire /usr/share/nginx/html du conteneur :

[sur le conteneur]
# ls /usr/share/nginx/html

et ainsi vĂ©rifier qu’il contient bien un fichier index.html.

Puis, on peut afficher le contenu de ce fichier index.html :

[sur le conteneur]
# cat /usr/share/nginx/html/index.html

et constater que c’est bien le contenu du fichier HTML que nous avions prĂ©parĂ© initialement dans le rĂ©pertoire mon_site_web de l’environnement d’accueil !

Vous pouvez désormais quitter cette session interactive dans le conteneur avec exit, puis stopper et supprimer le conteneur serveur_web_2.

Le rĂ©pertoire mon_site_web ne sera pas supprimĂ© lors de la suppression de votre conteneur, puisqu’il Ă©tait simplement rendu disponible par un montage de rĂ©pertoire.

2. Exercice : déployer un service Gokapi avec publication de port

2.1. ÉnoncĂ©

On souhaite dĂ©ployer une instance de Gokapi, un logiciel libre permettant de fournir un service d’envoi de fichiers par URL.

On trouve sur le Docker Hub l’image de conteneur Gokapi officielle. En lisant la documentation Gokapi, on dĂ©couvre les informations utiles suivantes :

  • L’image Ă©tant sur le Docker Hub, le registre de conteneur est accessible via l’adresse docker.io.

  • Le nom de l’image est f0rc3/gokapi.

  • Le point d’entrĂ©e de l’image est l’exĂ©cution du serveur web Gokapi.

  • Ce serveur web Ă©coute par dĂ©faut sur le port 53842 du conteneur.

  • Le logiciel stocke ses donnĂ©es dans deux rĂ©pertoires diffĂ©rents au sein du conteneur :

    • le rĂ©pertoire /app/data, dans lequel les fichiers et les mĂ©tadonnĂ©es sont stockĂ©s,

    • le rĂ©pertoire /app/config, dans lequel la configuration de Gokapi est conservĂ©e.

  • Lors de son tout premier lancement (et uniquement lors de son premier lancement), un service Gokapi affiche une page d’accueil dĂ©diĂ©e uniquement Ă  l’administrateur⋅ice systĂšme, et qui permet Ă  la fois de crĂ©er un compte d’administration et de saisir facilement toutes les variables de configuration souhaitĂ©es.

2.2. Questions

  1. Préparez et exécutez une commande pour créer un conteneur Gokapi, en suivant avec les contraintes suivantes:

    • Le nom du conteneur doit ĂȘtre gokapi_instance,

    • L’image de conteneur utilisĂ©e doit ĂȘtre celle correspondant Ă  l’Ă©tiquette v2.1.0,

    • L’application doit ĂȘtre accessible par une publication de port,

    • Toutes donnĂ©es créées et stockĂ©es par le logiciel doivent ĂȘtre persistĂ©es dans l’environnement d’accueil. Autrement dit, on doit pouvoir ĂȘtre capable de sereinement dĂ©truire et recrĂ©er le conteneur utilisĂ© pour le dĂ©ploiement, sans perdre la moindre donnĂ©e.

  2. Une fois le conteneur en exĂ©cution, utilisez Firefox depuis votre poste de travail Linux pour accĂ©der Ă  la page d’accueil de l’application, en utilisant le nom d’hĂŽte du serveur de dĂ©ploiement (podman) ainsi que la publication de port que vous avez rĂ©alisĂ©e, et en ajoutant /setup Ă  la fin de votre URL. Cela devrait ressembler Ă  :

    http://podman:<port>/setup
  3. Configurez le service que vous avez dĂ©ployĂ© Ă  l’aide de la page d’accueil de premier lancement. Laissez les valeurs par dĂ©faut pour toutes les questions, SAUF pour les questions suivantes :

    • Page Webserver 2/2 :

      • Public Name : Gokapi de NOM PRENOM (Ă  remplacer avec votre nom et prĂ©nom)

      • Public Facing URL: http://podman:<port>, en remplaçant <port> par votre publication de port.

        La valeur que vous mettez ici doit normalement correspondre Ă  celle dans votre barre d’adresse Firefox, sans le /setup/start.
    • Page Credentials:

      • Username : admin

      • Password : my_password

  4. Testez l’application :

    1. Téléchargez sur votre poste de travail le logo du cours.

    2. Ouvrez la page d’accueil de votre instance Gokapi, puis authentifiez-vous avec le compte administrateur.

    3. Cliquez sur le (trĂšs gros) bouton "Drop files, paste or click here to upload", puis sĂ©lectionnez le fichier logo tĂ©lĂ©chargĂ© prĂ©cĂ©demment. Le fichier sera tĂ©lĂ©versĂ© dans l’espace Gokapi du compte admin, et sera visible dans la liste de fichiers affichĂ©e dans la page d’accueil.

    4. VĂ©rifiez que vous pouvez correctement tĂ©lĂ©charger votre fichier : cliquez sur l’ID de votre fichier pour ouvrir une page avec un bouton "Download" permettant de le tĂ©lĂ©charger.

    5. Stoppez et supprimez votre conteneur.

    6. RecrĂ©ez votre conteneur avec la mĂȘme commande que dans la premiĂšre Ă©tape.

    7. Connectez-vous, et vérifiez que le compte administrateur fonctionne toujours, et que le fichier que vous avez déposé est toujours là. Si oui, tout est OK ! Dans le cas contraire, avez-vous bien vérifié votre montage de répertoire 
 ?

Si tout s’est bien passĂ©, vous pouvez stopper et supprimez votre conteneur avant de passer Ă  la suite.

3. Exercice : dĂ©ployer un service Kanboard avec publication de port

3.1. ÉnoncĂ©

On souhaite déployer une instance de Kanboard, un logiciel libre reposant sur la méthode Kanban pour faire de la gestion de projet.

Pour simplifier le dĂ©ploiement, on souhaite reposer sur la possibilitĂ© offerte par Kanboard de stocker ses donnĂ©es sous la forme d’un fichier SQLite, afin d’Ă©viter d’avoir Ă  gĂ©rer un systĂšme de gestion de base de donnĂ©es externe. C’est d’ailleurs le mode de fonctionnement par dĂ©faut de Kanboard.

Nous verrons plus loin dans le TP un exercice avec un systÚme de gestion de base de données externe.

On trouve sur le Docker Hub l’image de conteneur Kanboard officielle. En lisant la documentation Kanboard, on dĂ©couvre les informations utiles suivantes :

  • L’image Ă©tant sur le Docker Hub, le registre de conteneur est accessible via l’adresse docker.io.

  • Le nom de l’image est kanboard/kanboard.

  • Le point d’entrĂ©e de l’image est l’exĂ©cution du serveur web Kanboard,

  • Ce serveur web Ă©coute par dĂ©faut sur le port 80 du conteneur,

  • Le logiciel stocke ses donnĂ©es dans le rĂ©pertoire /var/www/app/data du conteneur.

3.2. Questions

  1. Préparez et exécutez une commande pour créer un conteneur Kanboard, en suivant avec les contraintes suivantes:

    • Le nom du conteneur doit ĂȘtre kanboard_instance.

    • L’image de conteneur utilisĂ©e doit ĂȘtre celle correspondant Ă  l’Ă©tiquette v1.2.32

    • L’application doit ĂȘtre accessible par une publication de port,

    • Les donnĂ©es de l’application doivent ĂȘtre stockĂ©es dans l’environnement d’accueil.

    Relisez bien cette note qui concerne le montage de répertoire.

    Kanboard est un logiciel trĂšs peu bavard, et qui donc ne dit presque rien Ă  son dĂ©marrage. Ainsi, si vous regardez les logs de votre conteneur (soit en exĂ©cutant sans --detach, soit Ă  l’aide de podman container logs), vous verrez simplement apparaĂźtre quelque chose comme ceci :

    .........+....+..+......+...+....+.....+.+...........+....+.....+............+....+...+...+...+.....
    +.........+.......+...........+...+........................+.+..+....+.........+......+......+++++++
    ++++++++++++++++++++++++++++++++*..+...+..+.......+......+..............+.+.....+.............+.....
    ....+++++++++++++++++++++++++++++++++++++++*..........+.........+.........+...+..+......+.....
    .+.+...+..+............+.......+........++++++.+...+++++++++++++++++++++++++++++++++++++++*..+++++++
    ++++++++++++++++++++++++++++++++*.....+.......+.....+...+......+.........+...+..................+...
    ...+.+............+.....+...+.......+...+..................+..............+......+....+..+...+......
    +.......+...+..+...+..........+.........+.....+.+.........+.....+...+...+....+...+..+.......+.......
    .+.............+..+...+...+....+...+...+.........+...+.....+.........+...+.+....................+...
    ...+...............+.+.....+....+.....+.+....................+.............+.........+..+.........+.
    ......+..+.+......+...+...+..+.+......+.....+......+...+....+..+...+...+.......+...........+....+...
    +...+..+....+.........+..+..................+.+.....+....+......+......+...+..++++++
    -----

    Cette étrange séquence de caractÚres signifie simplement que Kanboard génÚre une clé cryptographique à son démarrage, et donc que tout fonctionne bien. La présence de la ligne ----- à la toute fin signifie que Kanboard est prÚs à fonctionner, et que vous pouvez donc passer à la question suivante.

  2. Une fois le conteneur en exĂ©cution, utilisez Firefox depuis votre poste de travail Linux pour accĂ©der Ă  la page d’accueil de l’application, en utilisant la publication de port que vous avez rĂ©alisĂ©e.

  3. Testez l’application :

    1. Par dĂ©faut, l’application met Ă  disposition un compte administrateur avec pour nom d’utilisateur admin et pour mot de passe admin. Connectez-vous Ă  l’aide de ce compte.

    2. Utilisez l’interface pour crĂ©er un nouveau projet, et donnez lui le nom de votre choix.

    3. Une fois le projet créé, allez dans l’onglet Board, et utilisez l’interface pour crĂ©er un ticket dans la colonne Backlog avec le contenu de votre choix.

    4. Une fois le ticket créé, déplacez ce ticket vers la colonne Ready.

  4. Si vous ĂȘtes arrivĂ© jusqu’ici, c’est que le dĂ©ploiement est dĂ©jĂ  un succĂšs ! On souhaite tout de mĂȘme vĂ©rifier que vous avez bien configurĂ© correctement le stockage des donnĂ©es, Ă  l’aide des actions suivantes :

    1. Stoppez et supprimez votre conteneur.

    2. RecrĂ©ez votre conteneur avec la mĂȘme commande que dans la premiĂšre Ă©tape.

    3. Connectez-vous, et vĂ©rifiez que le ticket que vous aviez créé est toujours lĂ . Si oui, tout est OK ! Dans le cas contraire, avez-vous bien vĂ©rifiĂ© votre montage de rĂ©pertoire 
 ?

Si tout s’est bien passĂ©, vous pouvez stopper et supprimez votre conteneur avant de passer Ă  la suite.

4. Exercices additionnels

Pour ceux qui auraient terminé ce travail avant le temps alloué en séance, voici quelques exercices supplémentaires moins guidés et plus "libres" que ceux demandés précédemment.

4.1. DĂ©ploiement d’un serveur de discussion IRC

IRC est un protocole permettant Ă  des logiciels clients IRC de communiquer avec des logiciels serveur IRC, afin de permettre Ă  de nombreux utilisateurs connectĂ©s au mĂȘme serveur de communiquer entre eux par messagerie instantanĂ©e. Il existe de trĂšs nombreux logiciels clients et serveurs compatibles avec le protocole IRC.

L’exercice est ici pour vous de dĂ©ployer un logiciel serveur IRC InspIRCd sur le serveur de dĂ©ploiement. Vous utiliserez l’image docker officielle, disponible sur le Docker Hub. Vous vous assurerez que les donnĂ©es du serveur sont bien stockĂ©es dans l’environnement d’accueil, et que votre serveur soit accessible via un de vos ports personnels. Pour l’essentiel, vous pouvez garder les options de configuration de base de InspIRCd.

Pour vĂ©rifier que votre dĂ©ploiement fonctionne, vous pouvez tĂ©lĂ©charger sur votre poste de travail la commande kirc (KISS for IRC) Ă  l’aide de ce lien. C’est un client IRC minimaliste capable de se connecter Ă  un serveur IRC. Pour se connecter Ă  votre serveur, vous pouvez vous baser sur ce format de commande :

[sur votre poste de travail local]
$ ./kirc -s <nom d'hĂŽte> -p <port> -c <canal> -n <pseudo>

avec :

  • <nom d’hĂŽte> : le nom d’hĂŽte auquel se connecter,

  • <port> : le port auquel se connecter sur l’hĂŽte ciblĂ©,

  • <canal> : le nom d’un canal auquel se connecter au sein du serveur IRC (si le canal n’existe pas, il sera créé),

  • <pseudo> : le pseudo Ă  utiliser pour envoyer des messages.

Si tout fonctionne, vous devriez avoir un retour texte assez verbeux de la part du serveur, puis vous devriez arriver face Ă  un invite de la forme :

nom_du_canal>

Ă  partir duquel vous pouvez envoyer des messages texte.

Pour pousser vos tests plus loin, vous pouvez tester un mĂȘme serveur IRC Ă  plusieurs en vous connectant dessus avec diffĂ©rents postes Linux simultanĂ©ment, et en vĂ©rifiant que vous arrivez Ă  Ă©changer des messages sur un mĂȘme canal de discussion !

4.2. Déploiement de Automatic-Image-Converter

Faites un dĂ©ploiement par vous mĂȘme d’une instance de Automatic-Image-Converter.

Vous pouvez bien entendu vous baser sur les commandes déjà vues pendant le cours.

Sur la page du projet, vous pouvez accĂ©der Ă  l’ensemble des images de conteneurs disponibles en vous rendant dans DĂ©ploiement → Registre de conteneur.