Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:redhat:rh134:l108 [2024/10/31 13:07] adminelearning:workbooks:redhat:rh134:l108 [2024/11/22 08:50] (Version actuelle) admin
Ligne 25: Ligne 25:
     * LAB #1 - Configuration des Registres     * LAB #1 - Configuration des Registres
     * LAB #2 - Gestion des Images     * LAB #2 - Gestion des Images
 +      * 2.1 - Télécharger une Image
 +      * 2.2 - Créer une Image à l'aide d'un Fichier Containerfile
     * LAB #3 - Gestion des Conteneurs     * LAB #3 - Gestion des Conteneurs
 +      * 3.1 - Création d'un Conteneur
 +      * 3.2 - Démarrage d'un Conteneur
 +      * 3.3 - Exécution d'une Commande dans un Conteneur
 +      * 3.4 - Suppression des Images et des Conteneurs
     * LAB #4 - Gestion du Stockage et du Réseau     * LAB #4 - Gestion du Stockage et du Réseau
       * 4.1 - Gestion du Stockage Persistant       * 4.1 - Gestion du Stockage Persistant
       * 4.2 - Gestion du Réseau       * 4.2 - Gestion du Réseau
     * LAB #5 - Gestion des Conteneurs en tant que Services Système     * LAB #5 - Gestion des Conteneurs en tant que Services Système
 +      * 5.1 - Création du Gestionnaire de Conteneurs
 +      * 5.2 - Création d'un Conteneur de Serveur Web
  
  
Ligne 67: Ligne 75:
  
 Graphiquement, les différences peuvent être consultées en consultant les deux images suivantes : Graphiquement, les différences peuvent être consultées en consultant les deux images suivantes :
- 
-===Machines Virtuelles=== 
- 
-{{ :elearning:workbooks:docker3:751px-container-vm-whatcontainer_2.png?nolink&600 |}} 
- 
-===Conteneurs=== 
- 
-{{ :elearning:workbooks:docker3:docker-container-architecture.png?nolink&600 |}} 
  
 ====Conteneurs Rootless et Rootful==== ====Conteneurs Rootless et Rootful====
Ligne 110: Ligne 110:
 Les images des conteneurs sont construites conformément à des spécifications, telles que la spécification du format d'image de l'**Open Container Initiative** (OCI). Ces spécifications définissent le format des images de conteneurs, ainsi que les métadonnées relatives aux systèmes d'exploitation hôtes des conteneurs et aux architectures matérielles que l'image prend en charge. Les images des conteneurs sont construites conformément à des spécifications, telles que la spécification du format d'image de l'**Open Container Initiative** (OCI). Ces spécifications définissent le format des images de conteneurs, ainsi que les métadonnées relatives aux systèmes d'exploitation hôtes des conteneurs et aux architectures matérielles que l'image prend en charge.
  
-Un registre de conteneurs est un référentiel permettant de stocker et de récupérer des images de conteneurs. Un développeur pousse ou télécharge des images de conteneurs dans un registre de conteneurs. Ensuite le dévellopeur extrait ou télécharge des images de conteneurs d'un registre vers un système local pour exécuter des conteneurs.+Un registre de conteneurs est un référentiel permettant de stocker et de récupérer des images de conteneurs. Un développeur pousse ou télécharge des images de conteneurs dans un registre de conteneurs. Ensuite le développeur extrait ou télécharge des images de conteneurs d'un registre vers un système local pour exécuter des conteneurs.
  
 Il est possible d'utiliser un registre public contenant des images de tiers ou un registre privé contrôlé par une organisation. La source des images de conteneurs est importante. Comme pour tout autre logiciel, il faut savoir si on peut faire confiance au code de l'image de conteneur. Les politiques varient d'un registre à l'autre en ce qui concerne la fourniture, l'évaluation et le test des images de conteneurs qui leur sont soumises. Il est possible d'utiliser un registre public contenant des images de tiers ou un registre privé contrôlé par une organisation. La source des images de conteneurs est importante. Comme pour tout autre logiciel, il faut savoir si on peut faire confiance au code de l'image de conteneur. Les politiques varient d'un registre à l'autre en ce qui concerne la fourniture, l'évaluation et le test des images de conteneurs qui leur sont soumises.
Ligne 239: Ligne 239:
 short-name-mode = "enforcing" short-name-mode = "enforcing"
 </code> </code>
 +
 +Commencez par vous connecter au registre **registry.access.redhat.com** :
  
 <code> <code>
Ligne 246: Ligne 248:
 Login Succeeded! Login Succeeded!
 </code> </code>
 +
 +Pour vérifier si vous êtes connecté au registre **registry.access.redhat.com**, ajoutez l'option **--get-login** :
  
 <code> <code>
Ligne 251: Ligne 255:
 <your_login> <your_login>
 </code> </code>
 +
 +Notez que vous devez vous connecter à chaque registre séparément :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman login registry.redhat.io --get-login [trainee@redhat9 ~]$ podman login registry.redhat.io --get-login
 Error: not logged into registry.redhat.io Error: not logged into registry.redhat.io
-</code> 
  
-<code> 
 [trainee@redhat9 ~]$ podman login registry.redhat.io [trainee@redhat9 ~]$ podman login registry.redhat.io
 Username: <your_login> Username: <your_login>
Ligne 266: Ligne 270:
 <your_login> <your_login>
 </code> </code>
 +
 +Les directives dans le fichier **/etc/containers/registries.conf** sont surchargées par les directives dans le fichier **~$HOME/.config/containers/registries.conf**. Créez donc ce fichier :
  
 <code> <code>
Ligne 280: Ligne 286:
 blocked = false blocked = false
 </code> </code>
 +
 +Pour vérifier si ce fichier est pris en compte, consultez la sortie de la commande **podman info** :
  
 <code> <code>
Ligne 300: Ligne 308:
  
 =====LAB #2 - Gestion des Images===== =====LAB #2 - Gestion des Images=====
 +
 +====2.1 - Télécharger une Image====
 +
 +Pour obtenir une image et la stocker localement, sans créer de conteneur, utilisez la commande **podman pull** :
  
 <code> <code>
Ligne 313: Ligne 325:
 142e82b6e600e0a2208e32bcffab89cd6257316f93b22a1f12f172756ed7fe53 142e82b6e600e0a2208e32bcffab89cd6257316f93b22a1f12f172756ed7fe53
 </code> </code>
 +
 +Pour examiner l'image, il faut utiliser la commande **skopeo**, or, cette commande n'est pas installée. Devenez donc **root** et installez le paquet **skopeo** :
  
 <code> <code>
Ligne 323: Ligne 337:
 [trainee@redhat9 ~]$ [trainee@redhat9 ~]$
 </code> </code>
 +
 +Utilisez maintenant la commande **skopeo inspect** pour examiner l'image téléchargée :
  
 <code> <code>
-[trainee@redhat9 ~]$ skopeo inspect docker://registry.access.redhat.com/ubi8/python-38{+[trainee@redhat9 ~]$ skopeo inspect docker://registry.access.redhat.com/ubi8/python-38 
 +{
     "Name": "registry.access.redhat.com/ubi8/python-38",     "Name": "registry.access.redhat.com/ubi8/python-38",
     "Digest": "sha256:74e5b2d063d424cb06f8e41ef1983a94b1cb890e62ec656c52e81074be21c15e",     "Digest": "sha256:74e5b2d063d424cb06f8e41ef1983a94b1cb890e62ec656c52e81074be21c15e",
Ligne 426: Ligne 443:
 } }
 </code> </code>
 +
 +Pour lister les images disponibles localement, utilisez la commande **podman images** :
  
 <code> <code>
Ligne 436: Ligne 455:
 **Important** - Notez que l'image est référencée par son IMAGE ID. **Important** - Notez que l'image est référencée par son IMAGE ID.
 </WRAP> </WRAP>
 +
 +====2.2 - Créer une Image à l'aide d'un Fichier Containerfile====
 +
 +Créez un contexte sous la forme d'un répertoire, placez-vous dans ce répertoire puis créez le fichier Containerfile :
  
 <code> <code>
Ligne 449: Ligne 472:
 CMD ["/bin/bash", "-c", "sleep infinity"] CMD ["/bin/bash", "-c", "sleep infinity"]
 </code> </code>
 +
 +Dans le fichier **Containerfile**, les significations des commandes sont :
 +
 +^ Commande ^ Description ^
 +| **FROM** | Définit l'image à partir de laquelle sera construite la nouvelle image. |
 +| **RUN** | Lance un processus dans la construction de la nouvelle image. |
 +| **CMD** | Définit la commande qui sera exécutée dans le conteneur lors de sa création à partir de la nouvelle image. |
 +
 +Créez maintenant l'image **python36:1.0**, l'option **-t** indique un **tag** :
  
 <code> <code>
Ligne 538: Ligne 570:
 registry.access.redhat.com/ubi8/python-38  latest      142e82b6e600  15 months ago  898 MB registry.access.redhat.com/ubi8/python-38  latest      142e82b6e600  15 months ago  898 MB
 </code> </code>
 +
 +En consultant l'image construite, on peut constater les résultat des commandes incluses dans le fichier **Containerfile**. Notez bien que l'on doit référencer l'image par son nom complet **registre/tag** :
  
 <code> <code>
Ligne 557: Ligne 591:
  
 =====LAB #3 - Gestion des Conteneurs===== =====LAB #3 - Gestion des Conteneurs=====
 +
 +Un conteneur peut être dans un de cinq états :
  
 ^ Etat ^ Description ^ ^ Etat ^ Description ^
Ligne 564: Ligne 600:
 | **Paused** | Un conteneur dont les processus sont en pause. Non pris en charge pour les conteneurs Rootless. | | **Paused** | Un conteneur dont les processus sont en pause. Non pris en charge pour les conteneurs Rootless. |
 | **Deleted** | Un conteneur dont les processus sont dans un état mort. | | **Deleted** | Un conteneur dont les processus sont dans un état mort. |
 +
 +====3.1 - Création d'un Conteneur====
 +
 +Créez un conteneur dénommé **python36** à partir de la nouvelle image. Notez que l'image est référencée par son **IMAGE ID** :
  
 <code> <code>
Ligne 569: Ligne 609:
 f42e19a0627eb457570ca3626c8bb1fff77963542b7dc59ae5d07e86bf1a3fca f42e19a0627eb457570ca3626c8bb1fff77963542b7dc59ae5d07e86bf1a3fca
 </code> </code>
 +
 +Pour visualiser la liste des conteneurs en cours d'exécution, utilisez la commande **podman ps** :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman ps [trainee@redhat9 ~]$ podman ps
 CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
 +</code>
  
 +Pour consulter la liste de tous les conteneurs, ajoutez l'option **-a** à la commande précédente :
 +
 +<code>
 [trainee@redhat9 ~]$ podman ps -a [trainee@redhat9 ~]$ podman ps -a
 CONTAINER ID  IMAGE                   COMMAND               CREATED         STATUS      PORTS       NAMES CONTAINER ID  IMAGE                   COMMAND               CREATED         STATUS      PORTS       NAMES
 f42e19a0627e  localhost/python36:1.0  /bin/bash -c slee...  32 seconds ago  Created                 python36 f42e19a0627e  localhost/python36:1.0  /bin/bash -c slee...  32 seconds ago  Created                 python36
 </code> </code>
 +
 +====3.2 - Démarrage d'un Conteneur====
 +
 +Pour démarrer un conteneur déjà créé, utilisez la commande **podman start** :
  
 <code> <code>
Ligne 588: Ligne 638:
 </code> </code>
  
-<code> +Pour démarrer un conteneur à partir d'une image distante, il convient d'utiliser la commande **podman run** :
-podman run -d --name python38 registry.access.redhat.com/ubi8/python-38 sleep infinity +
-</code>+
  
 <code> <code>
Ligne 601: Ligne 649:
 85e26c02bfad  registry.access.redhat.com/ubi8/python-38:latest  sleep infinity        38 seconds ago  Up 38 seconds              python38 85e26c02bfad  registry.access.redhat.com/ubi8/python-38:latest  sleep infinity        38 seconds ago  Up 38 seconds              python38
 </code> </code>
 +
 +====3.3 - Exécution d'une Commande dans un Conteneur====
 +
 +Pour exécuter une commande à l'intérieur d'un conteneur en cours d'exécution, utilisez la commande **podman exec** :
  
 <code> <code>
Ligne 609: Ligne 661:
 </code> </code>
  
-<code> +Il est aussi possible d'utilser cette commande en stipulant un shell spécifique :
-[trainee@redhat9 ~]$ ps aux | grep sleep +
-trainee   225401  0.0  0.0  23144  2560 ?        Ss   09:37   0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity +
-101000    225487  0.0  0.0  26000  2688 ?        Ss   09:40   0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity +
-trainee   225624  0.0  0.0 221796  2304 pts/0    S+   09:45   0:00 grep --color=auto sleep +
-</code>+
  
 <code> <code>
Ligne 625: Ligne 672:
       4 ?        R      0:00 ps -ax       4 ?        R      0:00 ps -ax
 </code> </code>
 +
 +Créez maintenant le fichier **/tmp/hello.sh** contenant la chaîne **hello world** et regardez ses caractéristiques :
  
 <code> <code>
Ligne 640: Ligne 689:
  Birth: 2024-10-31 09:49:46.727000000 +0100  Birth: 2024-10-31 09:49:46.727000000 +0100
  
 +Bien évidement ce fichier n'existe pas encore dans le conteneur **python38** :
 +
 +<code>
 [trainee@redhat9 ~]$ podman exec python38 stat /tmp/hello.sh [trainee@redhat9 ~]$ podman exec python38 stat /tmp/hello.sh
 stat: cannot statx '/tmp/hello.sh': No such file or directory stat: cannot statx '/tmp/hello.sh': No such file or directory
 </code> </code>
 +
 +Copiez donc le fichier dans le conteneur et regardez ses caractéristiques :
  
 <code> <code>
Ligne 657: Ligne 711:
  Birth: 2024-10-31 08:52:14.862000000 +0000  Birth: 2024-10-31 08:52:14.862000000 +0000
 </code> </code>
 +
 +Exécutez le script dans le conteneur avec le shell **bash** :
  
 <code> <code>
Ligne 662: Ligne 718:
 hello world hello world
 </code> </code>
 +
 +====3.4 - Suppression des Images et des Conteneurs====
 +
 +En essayant de supprimer l'image **registry.access.redhat.com/ubi8/python-38**, vous constaterez que ceci n'est pas possible à cause de la présence du conteneur **python38** qui dépend de l'image :
  
 <code> <code>
Ligne 667: Ligne 727:
 Error: image used by 85e26c02bfad3b47270b785b74ce225799dea5aff16ebf4f002a51688da2b3a7: image is in use by a container: consider listing external containers and force-removing image Error: image used by 85e26c02bfad3b47270b785b74ce225799dea5aff16ebf4f002a51688da2b3a7: image is in use by a container: consider listing external containers and force-removing image
 </code> </code>
 +
 +Arrêtez donc le conteneur **python38** :
  
 <code> <code>
Ligne 678: Ligne 740:
 85e26c02bfad  registry.access.redhat.com/ubi8/python-38:latest  sleep infinity        14 minutes ago  Exited (137) 17 seconds ago              python38 85e26c02bfad  registry.access.redhat.com/ubi8/python-38:latest  sleep infinity        14 minutes ago  Exited (137) 17 seconds ago              python38
 </code> </code>
 +
 +Supprimez le conteneur **python38** avec la commande **podman rm** :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman rm python38 [trainee@redhat9 ~]$ podman rm python38
 python38 python38
 +</code>
  
 +Il est maintenant possible de supprimer l'image **registry.access.redhat.com/ubi8/python-38** :
 +
 +<code>
 [trainee@redhat9 ~]$ podman rmi registry.access.redhat.com/ubi8/python-38 [trainee@redhat9 ~]$ podman rmi registry.access.redhat.com/ubi8/python-38
 Untagged: registry.access.redhat.com/ubi8/python-38:latest Untagged: registry.access.redhat.com/ubi8/python-38:latest
Ligne 688: Ligne 756:
 </code> </code>
  
-=====LAB #4 Gestion du Stockage et du Réseau=====+Créez un conteneur **db01** à partir de l'image **registry.redhat.io/rhel8/mariadb-105** :
  
 <code> <code>
Ligne 702: Ligne 770:
 Storing signatures Storing signatures
 aea7c40abc0570fb616be14de5642683be5ebbadc95359f4b2d3ec32f1b12ddd aea7c40abc0570fb616be14de5642683be5ebbadc95359f4b2d3ec32f1b12ddd
-</code> 
  
-<code> 
 [trainee@redhat9 ~]$ podman ps -a [trainee@redhat9 ~]$ podman ps -a
 CONTAINER ID  IMAGE                                        COMMAND               CREATED         STATUS                     PORTS       NAMES CONTAINER ID  IMAGE                                        COMMAND               CREATED         STATUS                     PORTS       NAMES
Ligne 710: Ligne 776:
 aea7c40abc05  registry.redhat.io/rhel8/mariadb-105:latest  --name db01           45 seconds ago  Exited (2) 45 seconds ago              great_nash aea7c40abc05  registry.redhat.io/rhel8/mariadb-105:latest  --name db01           45 seconds ago  Exited (2) 45 seconds ago              great_nash
 </code> </code>
 +
 +Examinez l'image avec la commande **skopeo** :
  
 <code> <code>
Ligne 727: Ligne 795:
 } }
 </code> </code>
 +
 +Vous noterez que pour lancer un conteneur, il faut spécifier les variables d'environnement indiquées dans la sortie de la commande **skopeo** :
  
 <code> <code>
Ligne 738: Ligne 808:
 afc0cc842767  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            12 seconds ago  Up 11 seconds             0.0.0.0:3306->3306/tcp  boring_ganguly afc0cc842767  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            12 seconds ago  Up 11 seconds             0.0.0.0:3306->3306/tcp  boring_ganguly
 </code> </code>
 +
 +Notez que le conteneur crée avec les variables d'environnement n'a pas été créé en spécifiant l'option **--name**. De ce fait, le conteneur a été automatiquement créé avec un nom généré aléatoirement.
 +
 +Supprimez maintenant le conteneur **db01**. Notez que vous que l'on peut référencer le conteneur par une partie de son **CONTAINER ID**, à condition que cette partie soit unique :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman rm aea [trainee@redhat9 ~]$ podman rm aea
 aea aea
 +</code>
  
 +Supprimez le deuxième conteneur en stipulant son nom :
 +
 +<code>
 [trainee@redhat9 ~]$ podman rm boring_ganguly [trainee@redhat9 ~]$ podman rm boring_ganguly
 Error: cannot remove container afc0cc8427677eed8cf17ef1ee9669b937ca25ccd322c066ee9c46e070baf3d3 as it is running - running or paused containers cannot be removed without force: container state improper Error: cannot remove container afc0cc8427677eed8cf17ef1ee9669b937ca25ccd322c066ee9c46e070baf3d3 as it is running - running or paused containers cannot be removed without force: container state improper
Ligne 749: Ligne 827:
 boring_ganguly boring_ganguly
 </code> </code>
 +
 +Re-créez un conteneur MariaDB ayant le nom **db1** :
  
 <code> <code>
Ligne 759: Ligne 839:
 90c582b10512  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            8 seconds ago   Up 7 seconds   0.0.0.0:3306->3306/tcp  db1 90c582b10512  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            8 seconds ago   Up 7 seconds   0.0.0.0:3306->3306/tcp  db1
 </code> </code>
 +
 +=====LAB #4 - Gestion du Stockage et du Réseau=====
  
 ====4.1 - Gestion du Stockage Persistant==== ====4.1 - Gestion du Stockage Persistant====
 +
 +Consultez les deux fichiers **/proc/self/uid_map** et **cat /proc/self/gid_map** :
  
 <code> <code>
Ligne 775: Ligne 859:
 **Important** - La sortie précédente montre que dans le conteneur, l'utilisateur root (UID et GID de 0) correspond à votre utilisateur (UID et GID de 1000) sur la machine hôte. Dans le conteneur, l'UID et le GID de 1 correspondent à l'UID et au GID de 100000 sur la machine hôte. Chaque UID et GID après 1 s'incrémente de 1. Par exemple, l'UID et le GID de 30 dans un conteneur correspondent à l'UID et au GID de 100029 sur la machine hôte. **Important** - La sortie précédente montre que dans le conteneur, l'utilisateur root (UID et GID de 0) correspond à votre utilisateur (UID et GID de 1000) sur la machine hôte. Dans le conteneur, l'UID et le GID de 1 correspondent à l'UID et au GID de 100000 sur la machine hôte. Chaque UID et GID après 1 s'incrémente de 1. Par exemple, l'UID et le GID de 30 dans un conteneur correspondent à l'UID et au GID de 100029 sur la machine hôte.
 </WRAP> </WRAP>
 +
 +Obtenez l'UID et le GID de l'utilisateur **mysql** dans le conteneur :
  
 <code> <code>
Ligne 781: Ligne 867:
 </code> </code>
  
-Il convient maintenant de monter le répertoire **/home/trainee/db_data** dans le conteneur db1 pour fournir un stockage persistant sur le répertoire **/var/lib/mysql** du conteneur.+Il convient maintenant de monter le répertoire **/home/trainee/db_data** sur le répertoire **/var/lib/mysql** dans le conteneur db1 pour fournir un stockage persistant.
  
-Créez donc le répertoire **/home/trainee/db_data** et utilisez la commande podman unshare pour définir l'UID et le GID de 27 en tant que propriétaire du répertoire :+Créez donc le répertoire **/home/trainee/db_data** et utilisez la commande **podman unshare** pour définir l'UID et le GID de 27 en tant que propriétaire du répertoire :
  
 <code> <code>
Ligne 804: Ligne 890:
 drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Videos drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Videos
 </code> </code>
 +
 +Vérifiez que l'état de SELinux est **enforcing** dans la machine hôte **redhat9** :
  
 <code> <code>
Ligne 817: Ligne 905:
 logout logout
 </code> </code>
 +
 +Arrêtez le conteneur **bd1** :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman stop db1 [trainee@redhat9 ~]$ podman stop db1
 db1 db1
 +</code>
  
 +Créez un conteneur dénommé **bd01** :
 +
 +<code>
 [trainee@redhat9 ~]$ podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v /home/trainee/db_data:/var/lib/mysql rhel8/mariadb-105 [trainee@redhat9 ~]$ podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v /home/trainee/db_data:/var/lib/mysql rhel8/mariadb-105
 959e8039ba2bc11a30bbe0ffb9185c4779aa6c8865a9288767675c5163e119bd 959e8039ba2bc11a30bbe0ffb9185c4779aa6c8865a9288767675c5163e119bd
 </code> </code>
 +
 +Consultez l'état du conteneur. Le conteneur **db01** sera en état d'arrêt :
  
 <code> <code>
Ligne 833: Ligne 929:
 959e8039ba2b  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            About a minute ago  Exited (1) About a minute ago  0.0.0.0:3306->3306/tcp  db01 959e8039ba2b  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            About a minute ago  Exited (1) About a minute ago  0.0.0.0:3306->3306/tcp  db01
 </code> </code>
 +
 +Afin de comprendre la nature du problème, consultez les journaux du conteneur avec la commande **podman container logs** :
  
 <code> <code>
Ligne 843: Ligne 941:
 ... ...
 </code> </code>
 +
 +En notant l'erreur **The error means mysqld does not have the access rights to the directory.**, devenez root dans la machine hôte **redhat9** :
  
 <code> <code>
 [trainee@redhat9 ~]$ su - [trainee@redhat9 ~]$ su -
 Password: fenestros Password: fenestros
 +</code>
  
 +Générez un fichier d'alertes de SELinux :
 +
 +<code>
 [root@redhat9 ~]# sealert -a /var/log/audit/audit.log > /root/mylogfile.txt [root@redhat9 ~]# sealert -a /var/log/audit/audit.log > /root/mylogfile.txt
  
Ligne 906: Ligne 1010:
 logout logout
 </code> </code>
 +
 +En consultant l'erreur ci-dessus, il semblerait que pour accéder au répertoire **/home/trainee/db_data**, le SC du répertoire diot conteneur le type **container_file_t**. Consultez le SC actuel du répertoire : 
  
 <code> <code>
Ligne 912: Ligne 1018:
 </code> </code>
  
-container_file_t+Pour forcer l'utilisation du SC correct, il faut ajouter la lettre **Z** à la fin de la valeur de l'option **-v** de la commande **podman run**. Par exemple, **-v chemin_hôte:chemin_conteneur:Z**. Relancez donc la commande en spécifiant Z **et** l'option **--replace** qui va remplacer le conteneur actuel :
  
 <code> <code>
Ligne 924: Ligne 1030:
 47a5626d51dd  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            About a minute ago  Up About a minute          0.0.0.0:3306->3306/tcp  db01 47a5626d51dd  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            About a minute ago  Up About a minute          0.0.0.0:3306->3306/tcp  db01
 </code> </code>
 +
 +Finalement vérifiez le SC du répertoire **/home/trainee/db_data** :
  
 <code> <code>
Ligne 938: Ligne 1046:
 97f190a660ceba8f62b688781a5df1daef06e3ded241d799b15a8df744049116 97f190a660ceba8f62b688781a5df1daef06e3ded241d799b15a8df744049116
 </code> </code>
 +
 +Notez ensuite la prise en charge de cette commande :
  
 <code> <code>
Ligne 943: Ligne 1053:
 97f190a660ce  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            55 seconds ago  Up 56 seconds              0.0.0.0:3306->3306/tcp, 0.0.0.0:13306->3306/tcp  db01 97f190a660ce  registry.redhat.io/rhel8/mariadb-105:latest  run-mysqld            55 seconds ago  Up 56 seconds              0.0.0.0:3306->3306/tcp, 0.0.0.0:13306->3306/tcp  db01
 </code> </code>
 +
 +Pour voir le mappage des ports, utilisez la commande **podman port -a** :
  
 <code> <code>
Ligne 954: Ligne 1066:
 </code> </code>
  
-Depuis la version 4.0, Podman supporte deux réseaux pour les conteneurs, **Netavark** et **CNI**. À partir de RHEL 9, les systèmes utilisent **Netavark** par défaut. Pour vérifier quel back-end réseau est utilisé, exécutez la commande podman info suivante :+Depuis la version 4.0, Podman supporte deux réseaux pour les conteneurs, **Netavark** et **CNI**. À partir de RHEL 9, les systèmes utilisent **Netavark** par défaut. Pour vérifier quel backend réseau est utilisé, exécutez la commande podman info suivante :
  
 <code> <code>
Ligne 963: Ligne 1075:
 netavark netavark
 </code> </code>
 +
 +Pour modifier le backend utilisé, il convient de modifier la directive **network_backend** dans le fichier **/usr/share/containers/containers.conf** :
  
 <code> <code>
Ligne 968: Ligne 1082:
 #network_backend = "" #network_backend = ""
 </code> </code>
 +
 +Lors de l'installation de podman un réseau par défaut, utilisant le DRIVER **bridge** et appelé **podman**, est créé :
  
 <code> <code>
Ligne 973: Ligne 1089:
 NETWORK ID    NAME        DRIVER NETWORK ID    NAME        DRIVER
 2f259bab93aa  podman      bridge 2f259bab93aa  podman      bridge
 +</code>
  
 +<WRAP center round important 60%>
 +**Important** - Le DRIVER **bridge** est limité aux conteneurs d'un hôte unique exécutant podman. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieur, il faut configurer le mappage de port.
 +</WRAP>
 +
 +Regardez les caractéristiques de ce réseau :
 +
 +<code>
 [trainee@redhat9 ~]$ podman network inspect podman [trainee@redhat9 ~]$ podman network inspect podman
 [ [
Ligne 997: Ligne 1121:
 ] ]
 </code> </code>
 +
 +Créez maintenant un deuxième réseau appelé **db_net** :
  
 <code> <code>
Ligne 1030: Ligne 1156:
 ] ]
 </code> </code>
 +
 +Placez le conteneur **db01** dans le réseau **db_net** :
  
 <code> <code>
Ligne 1035: Ligne 1163:
 36c9f95ae52f76f96c45bb7fd6600cb014adc751059a531bb7bf38f927a11541 36c9f95ae52f76f96c45bb7fd6600cb014adc751059a531bb7bf38f927a11541
 </code> </code>
 +
 +Créez maintenant le conteneur **client** en le plaçant dans le réseau **db_net** :
  
 <code> <code>
Ligne 1047: Ligne 1177:
 00b2b82c2adf  registry.access.redhat.com/ubi8/ubi:latest   sleep infinity        13 seconds ago     Up 13 seconds                                                                  client 00b2b82c2adf  registry.access.redhat.com/ubi8/ubi:latest   sleep infinity        13 seconds ago     Up 13 seconds                                                                  client
 </code> </code>
 +
 +Installez dans le conteneur **client**, les paquets **iputils** et **iproute** :
  
 <code> <code>
 [trainee@redhat9 ~]$ podman exec -it client dnf install -y iputils iproute [trainee@redhat9 ~]$ podman exec -it client dnf install -y iputils iproute
 </code> </code>
 +
 +Testez la connectivité du réseau **db_net** :
  
 <code> <code>
Ligne 1066: Ligne 1200:
 rtt min/avg/max/mdev = 0.048/0.055/0.064/0.006 ms rtt min/avg/max/mdev = 0.048/0.055/0.064/0.006 ms
 </code> </code>
 +
 +Testez la résolution des noms **db_net** :
  
 <code> <code>
Ligne 1078: Ligne 1214:
 rtt min/avg/max/mdev = 88.116/88.250/88.327/0.356 ms rtt min/avg/max/mdev = 88.116/88.250/88.327/0.356 ms
 </code> </code>
 +
 +Créez le troisième réseau **backend** :
  
 <code> <code>
Ligne 1088: Ligne 1226:
 556c9797ea6d  db_net      bridge 556c9797ea6d  db_net      bridge
 2f259bab93aa  podman      bridge 2f259bab93aa  podman      bridge
-</code> 
  
-<code> 
 [trainee@redhat9 ~]$ podman network inspect backend [trainee@redhat9 ~]$ podman network inspect backend
 [ [
Ligne 1114: Ligne 1250:
 ] ]
 </code> </code>
 +
 +Placez les deux conteneurs existants dans ce nouveau réseau :
  
 <code> <code>
Ligne 1120: Ligne 1258:
 [trainee@redhat9 ~]$ podman network connect backend client [trainee@redhat9 ~]$ podman network connect backend client
 </code> </code>
 +
 +Constatez que les deux conteneurs se trouvent dans les deux réseaux, **backend** et **db_net** :
  
 <code> <code>
Ligne 1212: Ligne 1352:
  
 =====LAB #5 - Gestion des Conteneurs en tant que Services Système===== =====LAB #5 - Gestion des Conteneurs en tant que Services Système=====
 +
 +Sans faire appel à un Orchestrateur de Conteneurs tel Kubernetes, il est possible de gérer des petites infrastructures en utilisant simplement **-systemd**.
 +
 +====5.1 - Création du Gestionnaire de Conteneurs====
 +
 +Commencez par créer un compte qui sera utilisé pour gérer les conteneurs :
  
 <code> <code>
Ligne 1226: Ligne 1372:
 passwd: all authentication tokens updated successfully. passwd: all authentication tokens updated successfully.
 </code> </code>
 +
 +Devenez l'utilisateur et constatez l'erreur lors de l'exécution de la commande **podman info** :
  
 <code> <code>
Ligne 1238: Ligne 1386:
 </code> </code>
  
-Podman est un utilitaire sans état et nécessite une session de connexion complète. Podman doit être utilisé dans une session SSH et ne peut pas être utilisé dans un shell sudo ou su+Podman est un utilitaire sans état et nécessite une session de connexion complète. Podman doit être utilisé dans une session SSH et ne peut pas être utilisé dans un shell sudo ou su 
  
 <code> <code>
Ligne 1279: Ligne 1427:
 ... ...
 </code> </code>
 +
 +====5.2 - Création d'un Conteneur de Serveur Web====
 +
 +Commencez par créer un répertoire dans l'hôte pour contenir les pages à publier par le serveur web :
  
 <code> <code>
 [fenestros@redhat9 ~]$ mkdir www [fenestros@redhat9 ~]$ mkdir www
 +</code>
  
 +Créez ensuite un conteneur, appelé **webserver** avec un mappage de ports, à partir de l'image **registry.access.redhat.com/ubi8/httpd-24** :
 +
 +<code>
 [fenestros@redhat9 ~]$ podman run -d --name webserver -p 8080:8080 -v ~/www:/var/www/html:Z registry.access.redhat.com/ubi8/httpd-24 [fenestros@redhat9 ~]$ podman run -d --name webserver -p 8080:8080 -v ~/www:/var/www/html:Z registry.access.redhat.com/ubi8/httpd-24
 Trying to pull registry.access.redhat.com/ubi8/httpd-24:latest... Trying to pull registry.access.redhat.com/ubi8/httpd-24:latest...
Ligne 1295: Ligne 1451:
 e8afda5806a98f378865230e6d5c900c85afc0ea152609602a65d05c60cd68dc e8afda5806a98f378865230e6d5c900c85afc0ea152609602a65d05c60cd68dc
 </code> </code>
 +
 +Utilisez la commande **podman generate systemd** pour créer un fichier d'unité de service pour le conteneur **webserveur** :
  
 <code> <code>
Ligne 1305: Ligne 1463:
 /home/fenestros/container-webserver.service /home/fenestros/container-webserver.service
 </code> </code>
 +
 +<WRAP center round important 60%>
 +**Important** - Notez l'utilisation de l'option **--new**. Cette option demande à l'utilitaire podman de configurer le service systemd pour qu'il crée le conteneur au démarrage du service, et qu'il le supprime à l'arrêt du service. Sans l'option --new, l'utilitaire podman configure le fichier d'unité de service pour démarrer et arrêter le conteneur existant sans le supprimer.
 +</WRAP>
 +
 +
 +Le fichier est créé dans le répertoire courant :
  
 <code> <code>
-[fenestros@redhat9 ~]$ cat .config/systemd/user/container-webserver.service +[fenestros@redhat9 ~]$ cat container-webserver.service 
 # container-webserver.service # container-webserver.service
 # autogenerated by Podman 4.9.4-rhel # autogenerated by Podman 4.9.4-rhel
Ligne 1347: Ligne 1512:
 </code> </code>
  
-<code> +Pour que systemd puisse prendre en charge le service, le fichier d'unité de service doit être placé dans le répertoire **$HOME/.config/systemd/user/** :
-[fenestros@redhat9 ~]mkdir -p ~/.config/systemd/user/ +
-</code>+
  
 <code> <code>
Ligne 1356: Ligne 1519:
 [fenestros@redhat9 ~]$ mv container-webserver.service ~/.config/systemd/user/ [fenestros@redhat9 ~]$ mv container-webserver.service ~/.config/systemd/user/
 </code> </code>
 +
 +Pour créer le service, utilisez la commande **systemctl --user daemon-reload**. Notez que l'utilisation de l'option **--user** informe systemctl de regarder dans le répertoire **$HOME/.config/systemd/user/** et non dans le répertoire **/etc/systemd/system/** :
  
 <code> <code>
 [fenestros@redhat9 ~]$ systemctl --user daemon-reload [fenestros@redhat9 ~]$ systemctl --user daemon-reload
 </code> </code>
 +
 +Vérifiez le statut du service :
  
 <code> <code>
Ligne 1368: Ligne 1535:
        Docs: man:podman-generate-systemd(1)        Docs: man:podman-generate-systemd(1)
 </code> </code>
 +
 +Dans l'état et par défaut, si ce service était activé et démarré, celui-ci s'arrêterait à la fin de la session courante pour être démarrer de nouveau lors de la prochaine ouverture de session. Ce comportement est configuré par la valeur de la directive **Linger** :
  
 <code> <code>
Ligne 1387: Ligne 1556:
 Linger=no Linger=no
 </code> </code>
 +
 +Afin que le service reste démarré après la fermeture de la session et qu'il réagisse comme un service de système, il faut modifier la valeur de Linger à **yes** :
  
 <code> <code>
Ligne 1408: Ligne 1579:
 Linger=yes Linger=yes
 </code> </code>
 +
 +Créez un fichier **index.html** dans le répertoire **$HOME/www/** :
  
 <code> <code>
 [fenestros@redhat9 ~]$ echo "Hello World" > ~/www/index.html [fenestros@redhat9 ~]$ echo "Hello World" > ~/www/index.html
 </code> </code>
 +
 +Supprimez le conteneur actuel **webserver** en utilisant l'option **-f** de la commande **podman rm** :
  
 <code> <code>
Ligne 1421: Ligne 1596:
 webserver webserver
 </code> </code>
 +
 +Activez et démarrez le service utilisateur **container-webserver** :
  
 <code> <code>
Ligne 1445: Ligne 1622:
 ed306cecef9e  registry.access.redhat.com/ubi8/httpd-24:latest  /usr/bin/run-http...  29 seconds ago  Up 28 seconds  0.0.0.0:8080->8080/tcp  webserver ed306cecef9e  registry.access.redhat.com/ubi8/httpd-24:latest  /usr/bin/run-http...  29 seconds ago  Up 28 seconds  0.0.0.0:8080->8080/tcp  webserver
 </code> </code>
 +
 +Déconnectez-vous du compte fenestros et vérifiez que le serveur Web fonctionne :
  
 <code> <code>
Ligne 1450: Ligne 1629:
 logout logout
 Connection to localhost closed. Connection to localhost closed.
-</code> 
  
-<code> 
 [root@redhat9 ~]# curl http://localhost:8080 [root@redhat9 ~]# curl http://localhost:8080
 Hello World Hello World
Menu