Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
elearning:workbooks:redhat:rh134:l108 [2024/10/25 12:51] – admin | elearning:workbooks:redhat:rh134:l108 [2024/11/22 08:50] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
- | ======RH13409 - Gestion des Conteneurs====== | + | ======RH13409 - Gestion des Conteneurs |
=====Contenu du Cours===== | =====Contenu du Cours===== | ||
- | * **RH13409 - Gestion des Conteneurs** | + | * **RH13409 - Gestion des Conteneurs |
* Contenu du Cours | * Contenu du Cours | ||
- | * Présentation de la Virtualisation par Isolation* | + | * Présentation de la Virtualisation par Isolation |
* Historique | * Historique | ||
* Conteneurs vs Machines Virtuelles | * Conteneurs vs Machines Virtuelles | ||
- | | + | |
- | * La Commande Podman | + | * Conteneurs |
+ | | ||
+ | * Architecture à base de Conteneurs | ||
+ | * Outils de Gestion des Conteneurs | ||
+ | * Images et Registres des Conteneurs | ||
+ | * Podman | ||
+ | * Présentation | ||
+ | | ||
+ | * LAB #1 - Configuration des Registres | ||
+ | * 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 | ||
+ | * 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 | ||
+ | * 4.1 - Gestion du Stockage Persistant | ||
+ | * 4.2 - Gestion du Réseau | ||
+ | * 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 31: | Ligne 53: | ||
* **2013** - [[https:// | * **2013** - [[https:// | ||
* **2014** - [[https:// | * **2014** - [[https:// | ||
- | * **2018** - [[https://linuxcontainers.org/lxd/introduction/|Podman]] - l' | + | * **2018** - [[https://www.redhat.com/ |
- | =====Podman===== | + | ====Conteneurs vs Machines Virtuelles==== |
+ | |||
+ | Les conteneurs et les machines virtuelles (VM) sont des technologies de virtualisation, | ||
+ | |||
+ | * **Architecture et Isolation** | ||
+ | * **Conteneurs** - Un conteneur virtualise uniquement le système d' | ||
+ | * **Machines Virtuelles** - Une VM virtualise le matériel physique. Chaque VM exécute un système d' | ||
+ | * **Poids et Performance** | ||
+ | * **Conteneurs** - Les conteneurs sont légers et démarrent rapidement car ils n’incluent pas d’OS complet. Ils consomment moins de ressources car ils partagent le noyau de l’OS hôte, ce qui les rend plus performants pour les déploiements rapides. | ||
+ | * **Machines Virtuelles** - Les VMs sont plus lourdes et demandent plus de ressources, car chaque VM nécessite son propre OS. Elles mettent plus de temps à démarrer et consomment plus de mémoire et de CPU. | ||
+ | * **Cas d’utilisation** | ||
+ | * **Conteneurs** - Idéaux pour les microservices, | ||
+ | * **Machines Virtuelles** - Conviennent aux applications nécessitant un niveau élevé d' | ||
+ | * **Sécurité** | ||
+ | * **Conteneurs** - Moins isolés que les VMs, car ils partagent le noyau de l'OS hôte. Bien que l' | ||
+ | * **Machines Virtuelles** - Offrent une meilleure isolation, chaque VM étant indépendante et exécutant son propre OS. Même si l’une est compromise, les autres VM restent protégées. | ||
+ | |||
+ | En résumé, les conteneurs sont légers, rapides et optimisés pour le déploiement d’applications isolées mais interconnectées, | ||
+ | |||
+ | Graphiquement, | ||
+ | |||
+ | ====Conteneurs Rootless et Rootful==== | ||
+ | |||
+ | Sur l' | ||
+ | |||
+ | Un conteneur Rootless n'est pas autorisé à utiliser les ressources du système qui sont habituellement réservées aux utilisateurs privilégiés comme l' | ||
+ | |||
+ | On peut exécuter les conteneurs directement en tant que root si nécessaire, | ||
+ | |||
+ | ====Architecture à base de Conteneurs==== | ||
+ | |||
+ | Les conteneurs sont un moyen efficace de réutiliser les applications hébergées et de les rendre portables. Les conteneurs peuvent être facilement déplacés d'un environnement à un autre, par exemple du développement à la production. On peut enregistrer plusieurs versions d'un conteneur et accéder rapidement à chacune d' | ||
+ | |||
+ | Les conteneurs sont généralement temporaires ou éphémères. Vous pouvez enregistrer de manière permanente dans un stockage persistant les données générées par un conteneur en cours d' | ||
+ | |||
+ | On peut installer une application logicielle complexe avec plusieurs services dans un seul conteneur. Par exemple, un serveur web peut avoir besoin d' | ||
+ | |||
+ | ====Outils de Gestion des Conteneurs==== | ||
+ | |||
+ | RHEL fournit un ensemble d' | ||
+ | |||
+ | * **podman** pour gérer les Conteneurs et les Images, | ||
+ | * **skopeo** pour inspecter, copier, supprimer et signer les Images, | ||
+ | * **buildah** pour créer des Images. | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : L' | ||
+ | </ | ||
+ | |||
+ | ====Images et Registres des Conteneurs==== | ||
+ | |||
+ | Pour exécuter des conteneurs, il faut utiliser une image de conteneur. Une image de conteneur est un fichier statique qui contient des étapes codifiées et qui sert de modèle pour créer des conteneurs. Les images de conteneur empaquettent une application avec toutes ses dépendances, | ||
+ | |||
+ | Les images des conteneurs sont construites conformément à des spécifications, | ||
+ | |||
+ | 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' | ||
+ | |||
+ | Red Hat distribue des images de conteneurs certifiées par le biais de deux registres de conteneurs principaux auxquels il est possible d' | ||
+ | |||
+ | * **registry.redhat.io** pour les conteneurs basés sur les produits officiels de Red Hat, | ||
+ | * **registry.connect.redhat.com** pour les conteneurs basés sur des produits tiers. | ||
+ | |||
+ | Le **[[https:// | ||
+ | |||
+ | ====Podman==== | ||
+ | |||
+ | ===Présentation=== | ||
Podman, créé en 2018, est un outil open-source de gestion de conteneurs développé par Red Hat. Il offre des fonctionnalités similaires à Docker mais se distingue par sa conception " | Podman, créé en 2018, est un outil open-source de gestion de conteneurs développé par Red Hat. Il offre des fonctionnalités similaires à Docker mais se distingue par sa conception " | ||
Ligne 46: | Ligne 136: | ||
La combinaison des namespaces et des cgroups permet à Podman de fournir une isolation forte entre les conteneurs et de contrôler la consommation des ressources, tout en restant conforme aux standards OCI pour l' | La combinaison des namespaces et des cgroups permet à Podman de fournir une isolation forte entre les conteneurs et de contrôler la consommation des ressources, tout en restant conforme aux standards OCI pour l' | ||
- | ====La Commande Podman==== | + | ===La Commande Podman=== |
- | **Podman** est du méta-paquet **container-tools**. Podman fournit plusieurs sous-commandes pour interagir avec les conteneurs et les images.La liste suivante présente les sous-commandes utilisées dans cette section : | + | **Podman** est contenu dans le méta-paquet **container-tools**. Podman fournit plusieurs sous-commandes pour interagir avec les conteneurs et les images.La liste suivante présente les sous-commandes utilisées dans cette section : |
^ Commande ^ Description ^ | ^ Commande ^ Description ^ | ||
- | | **podman-build** | Construire une image de conteneur avec un fichier de conteneur. | | + | | **podman build** | Construire une image de conteneur avec un fichier de conteneur. | |
- | | **podman-run** | Exécuter une commande dans un nouveau conteneur. | | + | | **podman run** | Exécuter une commande dans un nouveau conteneur. | |
- | | **podman-images** | Liste des images stockées localement. | | + | | **podman images** | Liste des images stockées localement. | |
- | | **podman-ps** | Imprimer des informations sur les conteneurs. | | + | | **podman ps** | Imprimer des informations sur les conteneurs. | |
- | | **podman-inspect** | Affiche la configuration d'un conteneur, d'une image, d'un volume, d'un réseau ou d'un pod. | | + | | **podman inspect** | Affiche la configuration d'un conteneur, d'une image, d'un volume, d'un réseau ou d'un pod. | |
- | | **podman-pull** | Télécharger une image à partir d'un registre. | | + | | **podman pull** | Télécharger une image à partir d'un registre. | |
- | | **podman-cp** | Copier des fichiers ou des dossiers entre un conteneur et le système de fichiers local. | | + | | **podman cp** | Copier des fichiers ou des dossiers entre un conteneur et le système de fichiers local. | |
- | | **podman-exec** | Exécuter une commande dans un conteneur en cours d' | + | | **podman exec** | Exécuter une commande dans un conteneur en cours d' |
- | | **podman-rm** | Supprimer un ou plusieurs conteneurs. | | + | | **podman rm** | Supprimer un ou plusieurs conteneurs. | |
- | | **podman-rmi** | Supprimer une ou plusieurs images stockées localement. | | + | | **podman rmi** | Supprimer une ou plusieurs images stockées localement. | |
- | | **podman-search** | Recherche d'une image dans un registre. | | + | | **podman search** | Recherche d'une image dans un registre. | |
+ | |||
+ | =====LAB #1 - Configuration des Registres===== | ||
+ | |||
+ | La configuration par défaut des registres de conteneurs se trouve dans le fichier **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ cat / | ||
+ | # For more information on this configuration file, see containers-registries.conf(5). | ||
+ | # | ||
+ | # NOTE: RISK OF USING UNQUALIFIED IMAGE NAMES | ||
+ | # We recommend always using fully qualified image names including the registry | ||
+ | # server (full dns name), namespace, image name, and tag | ||
+ | # (e.g., registry.redhat.io/ | ||
+ | # quay.io/ | ||
+ | # When using short names, there is always an inherent risk that the image being | ||
+ | # pulled could be spoofed. For example, a user wants to pull an image named | ||
+ | # `foobar` from a registry and expects it to come from myregistry.com. If | ||
+ | # myregistry.com is not first in the search list, an attacker could place a | ||
+ | # different `foobar` image at a registry earlier in the search list. The user | ||
+ | # would accidentally pull and run the attacker' | ||
+ | # intended content. We recommend only adding registries which are completely | ||
+ | # trusted (i.e., registries which don't allow unknown or anonymous users to | ||
+ | # create accounts with arbitrary names). This will prevent an image from being | ||
+ | # spoofed, squatted or otherwise made insecure. | ||
+ | # of these registries, it should be added at the end of the list. | ||
+ | # | ||
+ | # # An array of host[:port] registries to try when pulling an unqualified image, in order. | ||
+ | |||
+ | unqualified-search-registries = [" | ||
+ | |||
+ | # [[registry]] | ||
+ | # # The " | ||
+ | # # (only) the TOML table with the longest match for the input image name | ||
+ | # # (taking into account namespace/ | ||
+ | # # | ||
+ | # # The prefix can also be of the form: *.example.com for wildcard subdomain | ||
+ | # # matching. | ||
+ | # # | ||
+ | # # If the prefix field is missing, it defaults to be the same as the " | ||
+ | # prefix = " | ||
+ | # | ||
+ | # # If true, unencrypted HTTP as well as TLS connections with untrusted | ||
+ | # # certificates are allowed. | ||
+ | # insecure = false | ||
+ | # | ||
+ | # # If true, pulling images with matching names is forbidden. | ||
+ | # blocked = false | ||
+ | # | ||
+ | # # The physical location of the " | ||
+ | # # | ||
+ | # # By default, this is equal to " | ||
+ | # # and the [[registry]] TOML table can only specify " | ||
+ | # # | ||
+ | # # Example: Given | ||
+ | # # | ||
+ | # # | ||
+ | # # requests for the image example.com/ | ||
+ | # # internal-registry-for-example.net/ | ||
+ | # | ||
+ | # # The location can be empty iff prefix is in a | ||
+ | # # wildcarded format: " | ||
+ | # # be used as-is without any rewrite. | ||
+ | # location = internal-registry-for-example.com/ | ||
+ | # | ||
+ | # # (Possibly-partial) mirrors for the " | ||
+ | # # | ||
+ | # # The mirrors are attempted in the specified order; the first one that can be | ||
+ | # # contacted and contains the image will be used (and if none of the mirrors contains the image, | ||
+ | # # the primary location specified by the " | ||
+ | # # user-specified reference, is tried last). | ||
+ | # # | ||
+ | # # Each TOML table in the " | ||
+ | # # as if specified in the [[registry]] TOML table directly: | ||
+ | # # - location | ||
+ | # # - insecure | ||
+ | # [[registry.mirror]] | ||
+ | # location = " | ||
+ | # [[registry.mirror]] | ||
+ | # location = " | ||
+ | # insecure = true | ||
+ | # # Given the above, a pull of example.com/ | ||
+ | # # 1. example-mirror-0.local/ | ||
+ | # # 2. example-mirror-1.local/ | ||
+ | # # 3. internal-registry-for-example.net/ | ||
+ | # # in order, and use the first one that exists. | ||
+ | short-name-mode = " | ||
+ | </ | ||
+ | |||
+ | Commencez par vous connecter au registre **registry.access.redhat.com** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman login registry.access.redhat.com | ||
+ | Username: < | ||
+ | Password: < | ||
+ | Login Succeeded! | ||
+ | </ | ||
+ | |||
+ | Pour vérifier si vous êtes connecté au registre **registry.access.redhat.com**, | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman login registry.access.redhat.com --get-login | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Notez que vous devez vous connecter à chaque registre séparément : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman login registry.redhat.io --get-login | ||
+ | Error: not logged into registry.redhat.io | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman login registry.redhat.io | ||
+ | Username: < | ||
+ | Password: < | ||
+ | Login Succeeded! | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman login registry.redhat.io --get-login | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | Les directives dans le fichier **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ mkdir .config/ | ||
+ | |||
+ | [trainee@redhat9 ~]$ vi .config/ | ||
+ | |||
+ | [trainee@redhat9 ~]$ cat .config/ | ||
+ | unqualified-search-registries = [" | ||
+ | |||
+ | [[registry]] | ||
+ | location = " | ||
+ | insecure = true | ||
+ | blocked = false | ||
+ | </ | ||
+ | |||
+ | Pour vérifier si ce fichier est pris en compte, consultez la sortie de la commande **podman info** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman info | ||
+ | ... | ||
+ | registries: | ||
+ | search: | ||
+ | - registry.access.redhat.com | ||
+ | - registry.redhat.io | ||
+ | - docker.io | ||
+ | store: | ||
+ | configFile: / | ||
+ | containerStore: | ||
+ | number: 0 | ||
+ | paused: 0 | ||
+ | running: 0 | ||
+ | stopped: 0 | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | =====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** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman pull registry.access.redhat.com/ | ||
+ | Trying to pull registry.access.redhat.com/ | ||
+ | Getting image source signatures | ||
+ | Checking if image destination supports signatures | ||
+ | Copying blob 8756f22094d0 done | | ||
+ | ... | ||
+ | Copying config 142e82b6e6 done | | ||
+ | Writing manifest to image destination | ||
+ | Storing signatures | ||
+ | 142e82b6e600e0a2208e32bcffab89cd6257316f93b22a1f12f172756ed7fe53 | ||
+ | </ | ||
+ | |||
+ | Pour examiner l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ su - | ||
+ | Password: | ||
+ | [root@redhat9 ~]# dnf install skopeo -y | ||
+ | ... | ||
+ | [root@redhat9 ~]# exit | ||
+ | logout | ||
+ | [trainee@redhat9 ~]$ | ||
+ | </ | ||
+ | |||
+ | Utilisez maintenant la commande **skopeo inspect** pour examiner l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ skopeo inspect docker:// | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | " | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ], | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Pour lister les images disponibles localement, utilisez la commande **podman images** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman images | ||
+ | REPOSITORY | ||
+ | registry.access.redhat.com/ | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** - Notez que l' | ||
+ | </ | ||
+ | |||
+ | ====2.2 - Créer une Image à l'aide d'un Fichier Containerfile==== | ||
+ | |||
+ | Créez un contexte sous la forme d'un répertoire, | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ mkdir rh13409 | ||
+ | |||
+ | [trainee@redhat9 ~]$ cd rh13409/ | ||
+ | |||
+ | [trainee@redhat9 rh13409]$ vi Containerfile | ||
+ | |||
+ | [trainee@redhat9 rh13409]$ cat Containerfile | ||
+ | FROM registry.access.redhat.com/ | ||
+ | RUN dnf install -y python36 | ||
+ | CMD ["/ | ||
+ | </ | ||
+ | |||
+ | Dans le fichier **Containerfile**, | ||
+ | |||
+ | ^ Commande ^ Description ^ | ||
+ | | **FROM** | Définit l' | ||
+ | | **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' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 rh13409]$ podman build -t python36: | ||
+ | STEP 1/3: FROM registry.access.redhat.com/ | ||
+ | Trying to pull registry.access.redhat.com/ | ||
+ | Getting image source signatures | ||
+ | Checking if image destination supports signatures | ||
+ | Copying blob 148a3ed2f70e done | | ||
+ | Copying config 4f03f39cd4 done | | ||
+ | Writing manifest to image destination | ||
+ | Storing signatures | ||
+ | STEP 2/3: RUN dnf install -y python36 | ||
+ | Updating Subscription Management repositories. | ||
+ | Unable to read consumer identity | ||
+ | subscription-manager is operating in container mode. | ||
+ | |||
+ | This system is not registered with an entitlement server. You can use subscription-manager to register. | ||
+ | |||
+ | Red Hat Enterprise Linux 8 for x86_64 - AppStre | ||
+ | Red Hat Enterprise Linux 8 for x86_64 - BaseOS | ||
+ | Red Hat Universal Base Image 8 (RPMs) - BaseOS | ||
+ | Red Hat Universal Base Image 8 (RPMs) - AppStre | ||
+ | Red Hat Universal Base Image 8 (RPMs) - CodeRea 991 kB/s | 186 kB | ||
+ | Last metadata expiration check: 0:00:01 ago on Wed Oct 30 16:31:36 2024. | ||
+ | Dependencies resolved. | ||
+ | ============================================================================================================== | ||
+ | | ||
+ | ============================================================================================================== | ||
+ | Installing: | ||
+ | | ||
+ | Installing dependencies: | ||
+ | | ||
+ | | ||
+ | | ||
+ | Enabling module streams: | ||
+ | | ||
+ | |||
+ | Transaction Summary | ||
+ | ============================================================================================================== | ||
+ | Install | ||
+ | |||
+ | Total download size: 1.8 M | ||
+ | Installed size: 7.1 M | ||
+ | Downloading Packages: | ||
+ | (1/4): python36-3.6.8-39.module+el8.10.0+20784+ 137 kB/s | 20 kB | ||
+ | (2/4): python3-setuptools-39.2.0-8.el8_10.noarc 2.9 MB/s | 163 kB | ||
+ | (3/4): platform-python-pip-9.0.3-24.el8.noarch. 7.2 MB/s | 1.6 MB | ||
+ | (4/4): python3-pip-9.0.3-24.el8.noarch.rpm | ||
+ | -------------------------------------------------------------------------------- | ||
+ | Total 7.8 MB/s | 1.8 MB | ||
+ | Running transaction check | ||
+ | Transaction check succeeded. | ||
+ | Running transaction test | ||
+ | Transaction test succeeded. | ||
+ | Running transaction | ||
+ | Preparing | ||
+ | Installing | ||
+ | Installing | ||
+ | Installing | ||
+ | Installing | ||
+ | Running scriptlet: python36-3.6.8-39.module+el8.10.0+20784+edafcd43.x86 | ||
+ | Verifying | ||
+ | Verifying | ||
+ | Verifying | ||
+ | Verifying | ||
+ | Installed products updated. | ||
+ | |||
+ | Installed: | ||
+ | platform-python-pip-9.0.3-24.el8.noarch | ||
+ | python3-pip-9.0.3-24.el8.noarch | ||
+ | python3-setuptools-39.2.0-8.el8_10.noarch | ||
+ | python36-3.6.8-39.module+el8.10.0+20784+edafcd43.x86_64 | ||
+ | |||
+ | Complete! | ||
+ | --> ffbfe7e2c52a | ||
+ | STEP 3/3: CMD ["/ | ||
+ | COMMIT python36: | ||
+ | --> aeb6174afefe | ||
+ | Successfully tagged localhost/ | ||
+ | aeb6174afefe34e16037a22efe8d6b9de6f7542dd15e24f33335fd5ba4689dd7 | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 rh13409]$ podman images | ||
+ | REPOSITORY | ||
+ | localhost/ | ||
+ | registry.access.redhat.com/ | ||
+ | registry.access.redhat.com/ | ||
+ | </ | ||
+ | |||
+ | En consultant l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman inspect localhost/ | ||
+ | ... | ||
+ | " | ||
+ | "/ | ||
+ | " | ||
+ | "sleep infinity" | ||
+ | ], | ||
+ | ... | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | =====LAB #3 - Gestion des Conteneurs===== | ||
+ | |||
+ | Un conteneur peut être dans un de cinq états : | ||
+ | |||
+ | ^ Etat ^ Description ^ | ||
+ | | **Created** | Un conteneur qui est créé mais qui n'est pas démarré. | | ||
+ | | **Running** | Un conteneur qui fonctionne avec ses processus. | | ||
+ | | **Stopped** | Un conteneur dont les processus sont arrêtés. | | ||
+ | | **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. | | ||
+ | |||
+ | ====3.1 - Création d'un Conteneur==== | ||
+ | |||
+ | Créez un conteneur dénommé **python36** à partir de la nouvelle image. Notez que l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman create --name python36 aeb6174afefe | ||
+ | f42e19a0627eb457570ca3626c8bb1fff77963542b7dc59ae5d07e86bf1a3fca | ||
+ | </ | ||
+ | |||
+ | Pour visualiser la liste des conteneurs en cours d' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman ps | ||
+ | CONTAINER ID IMAGE | ||
+ | </ | ||
+ | |||
+ | Pour consulter la liste de tous les conteneurs, ajoutez l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE | ||
+ | f42e19a0627e | ||
+ | </ | ||
+ | |||
+ | ====3.2 - Démarrage d'un Conteneur==== | ||
+ | |||
+ | Pour démarrer un conteneur déjà créé, utilisez la commande **podman start** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman start python36 | ||
+ | python36 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps | ||
+ | CONTAINER ID IMAGE | ||
+ | f42e19a0627e | ||
+ | </ | ||
+ | |||
+ | Pour démarrer un conteneur à partir d'une image distante, il convient d' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --name python38 registry.access.redhat.com/ | ||
+ | 85e26c02bfad3b47270b785b74ce225799dea5aff16ebf4f002a51688da2b3a7 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps | ||
+ | CONTAINER ID IMAGE | ||
+ | f42e19a0627e | ||
+ | 85e26c02bfad | ||
+ | </ | ||
+ | |||
+ | ====3.3 - Exécution d'une Commande dans un Conteneur==== | ||
+ | |||
+ | Pour exécuter une commande à l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec python38 ps -ax | ||
+ | PID TTY STAT TIME COMMAND | ||
+ | 1 ? Ss 0:00 / | ||
+ | 2 ? R 0:00 ps -ax | ||
+ | </ | ||
+ | |||
+ | Il est aussi possible d' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec python38 sh -c 'ps -ax > / | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman exec python38 cat / | ||
+ | PID TTY STAT TIME COMMAND | ||
+ | 1 ? Ss 0:00 / | ||
+ | 3 ? S 0:00 sh -c ps -ax > / | ||
+ | 4 ? R 0:00 ps -ax | ||
+ | </ | ||
+ | |||
+ | Créez maintenant le fichier **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ echo "echo 'hello world'" | ||
+ | |||
+ | [trainee@redhat9 ~]$ stat / | ||
+ | File: / | ||
+ | Size: 19 Blocks: 8 IO Block: 4096 | ||
+ | Device: fd00h/ | ||
+ | Access: (0644/ | ||
+ | Context: unconfined_u: | ||
+ | Access: 2024-10-31 09: | ||
+ | Modify: 2024-10-31 09: | ||
+ | Change: 2024-10-31 09: | ||
+ | | ||
+ | |||
+ | Bien évidement ce fichier n' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec python38 stat / | ||
+ | stat: cannot statx '/ | ||
+ | </ | ||
+ | |||
+ | Copiez donc le fichier dans le conteneur et regardez ses caractéristiques : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman cp / | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman exec python38 stat / | ||
+ | File: / | ||
+ | Size: 19 Blocks: 8 IO Block: 4096 | ||
+ | Device: 40h/64d Inode: 115769725 | ||
+ | Access: (0644/ | ||
+ | Access: 2024-10-31 08: | ||
+ | Modify: 2024-10-31 08: | ||
+ | Change: 2024-10-31 08: | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Exécutez le script dans le conteneur avec le shell **bash** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec python38 bash / | ||
+ | hello world | ||
+ | </ | ||
+ | |||
+ | ====3.4 - Suppression des Images et des Conteneurs==== | ||
+ | |||
+ | En essayant de supprimer l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman rmi registry.access.redhat.com/ | ||
+ | Error: image used by 85e26c02bfad3b47270b785b74ce225799dea5aff16ebf4f002a51688da2b3a7: | ||
+ | </ | ||
+ | |||
+ | Arrêtez donc le conteneur **python38** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman stop python38 | ||
+ | WARN[0010] StopSignal SIGTERM failed to stop container python38 in 10 seconds, resorting to SIGKILL | ||
+ | python38 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE | ||
+ | f42e19a0627e | ||
+ | 85e26c02bfad | ||
+ | </ | ||
+ | |||
+ | Supprimez le conteneur **python38** avec la commande **podman rm** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman rm python38 | ||
+ | python38 | ||
+ | </ | ||
+ | |||
+ | Il est maintenant possible de supprimer l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman rmi registry.access.redhat.com/ | ||
+ | Untagged: registry.access.redhat.com/ | ||
+ | Deleted: 142e82b6e600e0a2208e32bcffab89cd6257316f93b22a1f12f172756ed7fe53 | ||
+ | </ | ||
+ | |||
+ | Créez un conteneur **db01** à partir de l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d registry.redhat.io/ | ||
+ | Trying to pull registry.redhat.io/ | ||
+ | Getting image source signatures | ||
+ | Checking if image destination supports signatures | ||
+ | Copying blob 0258a9a5cd06 done | | ||
+ | Copying blob 148a3ed2f70e skipped: already exists | ||
+ | Copying blob 4de1bba6ee61 done | | ||
+ | Copying config b0e9bcdcc3 done | | ||
+ | Writing manifest to image destination | ||
+ | Storing signatures | ||
+ | aea7c40abc0570fb616be14de5642683be5ebbadc95359f4b2d3ec32f1b12ddd | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | aea7c40abc05 | ||
+ | </ | ||
+ | |||
+ | Examinez l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ skopeo inspect docker:// | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Vous noterez que pour lancer un conteneur, il faut spécifier les variables d' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/ | ||
+ | afc0cc8427677eed8cf17ef1ee9669b937ca25ccd322c066ee9c46e070baf3d3 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | aea7c40abc05 | ||
+ | afc0cc842767 | ||
+ | </ | ||
+ | |||
+ | Notez que le conteneur crée avec les variables d' | ||
+ | |||
+ | 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 : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman rm aea | ||
+ | aea | ||
+ | </ | ||
+ | |||
+ | Supprimez le deuxième conteneur en stipulant son nom : | ||
+ | |||
+ | < | ||
+ | [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 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman rm -f boring_ganguly | ||
+ | boring_ganguly | ||
+ | </ | ||
+ | |||
+ | Re-créez un conteneur MariaDB ayant le nom **db1** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --name db1 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 rhel8/ | ||
+ | 90c582b10512c3049ded2937d72c6c4ccfe98a6e40311f44000a7c0425aa219e | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | 90c582b10512 | ||
+ | </ | ||
+ | |||
+ | =====LAB #4 - Gestion du Stockage et du Réseau===== | ||
+ | |||
+ | ====4.1 - Gestion du Stockage Persistant==== | ||
+ | |||
+ | Consultez les deux fichiers **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman unshare cat / | ||
+ | | ||
+ | | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman unshare cat / | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** - La sortie précédente montre que dans le conteneur, l' | ||
+ | </ | ||
+ | |||
+ | Obtenez l'UID et le GID de l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec -it db1 grep mysql / | ||
+ | mysql: | ||
+ | </ | ||
+ | |||
+ | Il convient maintenant de monter le répertoire **/ | ||
+ | |||
+ | Créez donc le répertoire **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ mkdir / | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman unshare chown 27:27 / | ||
+ | |||
+ | [trainee@redhat9 ~]$ ls -l / | ||
+ | total 8 | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 100026 | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | drwxr-xr-x. 2 trainee trainee | ||
+ | </ | ||
+ | |||
+ | Vérifiez que l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ su - | ||
+ | Password: fenestros | ||
+ | |||
+ | [root@redhat9 ~]# getenforce | ||
+ | Permissive | ||
+ | |||
+ | [root@redhat9 ~]# setenforce enforcing | ||
+ | |||
+ | [root@redhat9 ~]# exit | ||
+ | logout | ||
+ | </ | ||
+ | |||
+ | Arrêtez le conteneur **bd1** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman stop db1 | ||
+ | db1 | ||
+ | </ | ||
+ | |||
+ | Créez un conteneur dénommé **bd01** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v / | ||
+ | 959e8039ba2bc11a30bbe0ffb9185c4779aa6c8865a9288767675c5163e119bd | ||
+ | </ | ||
+ | |||
+ | Consultez l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | 90c582b10512 | ||
+ | 959e8039ba2b | ||
+ | </ | ||
+ | |||
+ | Afin de comprendre la nature du problème, consultez les journaux du conteneur avec la commande **podman container logs** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman container logs db01 | ||
+ | ... | ||
+ | 2024-10-31 | ||
+ | 2024-10-31 | ||
+ | 2024-10-31 | ||
+ | 2024-10-31 | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | En notant l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ su - | ||
+ | Password: fenestros | ||
+ | </ | ||
+ | |||
+ | Générez un fichier d' | ||
+ | |||
+ | < | ||
+ | [root@redhat9 ~]# sealert -a / | ||
+ | |||
+ | [root@redhat9 ~]# cat / | ||
+ | ... | ||
+ | -------------------------------------------------------------------------------- | ||
+ | |||
+ | SELinux is preventing / | ||
+ | |||
+ | ***** Plugin catchall (100. confidence) suggests | ||
+ | |||
+ | If you believe that mariadbd should be allowed read write access on the aria_log_control file by default. | ||
+ | Then you should report this as a bug. | ||
+ | You can generate a local policy module to allow this access. | ||
+ | Do | ||
+ | allow this access for now by executing: | ||
+ | # ausearch -c ' | ||
+ | # semodule -X 300 -i my-mysqld.pp | ||
+ | |||
+ | |||
+ | Additional Information: | ||
+ | Source Context | ||
+ | Target Context | ||
+ | Target Objects | ||
+ | Source | ||
+ | Source Path / | ||
+ | Port < | ||
+ | Host < | ||
+ | Source RPM Packages | ||
+ | Target RPM Packages | ||
+ | SELinux Policy RPM selinux-policy-targeted-38.1.35-2.el9_4.2.noarch | ||
+ | Local Policy RPM selinux-policy-targeted-38.1.35-2.el9_4.2.noarch | ||
+ | Selinux Enabled | ||
+ | Policy Type | ||
+ | Enforcing Mode Enforcing | ||
+ | Host Name | ||
+ | Platform | ||
+ | 5.14.0-427.37.1.el9_4.x86_64 #1 SMP | ||
+ | PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024 | ||
+ | x86_64 x86_64 | ||
+ | Alert Count 1 | ||
+ | First Seen 2024-10-31 10:53:10 CET | ||
+ | Last Seen | ||
+ | Local ID c9066e3a-05ae-464e-bbd4-fd94585c6b64 | ||
+ | |||
+ | Raw Audit Messages | ||
+ | type=AVC msg=audit(1730368390.63: | ||
+ | tem_u: | ||
+ | |||
+ | |||
+ | type=SYSCALL msg=audit(1730368390.63: | ||
+ | 6 suid=100026 fsuid=100026 egid=100026 sgid=100026 fsgid=100026 tty=(none) ses=6974 comm=mysqld exe=/ | ||
+ | D=trainee UID=unknown(100026) GID=unknown(100026) EUID=unknown(100026) SUID=unknown(100026) FSUID=unknown(100026) EGID=unknown(100026) SGID=unknown(100026) FSGID=unknown(100026) | ||
+ | |||
+ | Hash: mysqld, | ||
+ | |||
+ | [root@redhat9 ~]# exit | ||
+ | logout | ||
+ | </ | ||
+ | |||
+ | En consultant l' | ||
+ | |||
+ | < | ||
+ | [root@redhat9 ~]# ls -lZ / | ||
+ | drwxr-xr-x. 3 100026 | ||
+ | </ | ||
+ | |||
+ | Pour forcer l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --replace --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v / | ||
+ | 47a5626d51dd02a8a7c769bfd37c4ba763320f731a2ccc71797567817205a20b | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | 90c582b10512 | ||
+ | 47a5626d51dd | ||
+ | </ | ||
+ | |||
+ | Finalement vérifiez le SC du répertoire **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ ls -lZ / | ||
+ | drwxr-xr-x. 3 100026 | ||
+ | </ | ||
+ | |||
+ | ====4.2 - Gestion du Réseau==== | ||
+ | |||
+ | Pour fournir un accès réseau aux conteneurs, les clients doivent se connecter aux ports de l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --replace --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v / | ||
+ | 97f190a660ceba8f62b688781a5df1daef06e3ded241d799b15a8df744049116 | ||
+ | </ | ||
+ | |||
+ | Notez ensuite la prise en charge de cette commande : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman ps -a | grep db01 | ||
+ | 97f190a660ce | ||
+ | </ | ||
+ | |||
+ | Pour voir le mappage des ports, utilisez la commande **podman port -a** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman port -a | ||
+ | 97f190a660ce | ||
+ | 97f190a660ce | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman port db01 | ||
+ | 3306/tcp -> 0.0.0.0: | ||
+ | 3306/tcp -> 0.0.0.0: | ||
+ | </ | ||
+ | |||
+ | 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 : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman --version | ||
+ | podman version 4.9.4-rhel | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman info --format {{.Host.NetworkBackend}} | ||
+ | netavark | ||
+ | </ | ||
+ | |||
+ | Pour modifier le backend utilisé, il convient de modifier la directive **network_backend** dans le fichier **/ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ cat / | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Lors de l' | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman network ls | ||
+ | NETWORK ID NAME DRIVER | ||
+ | 2f259bab93aa | ||
+ | </ | ||
+ | |||
+ | <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' | ||
+ | </ | ||
+ | |||
+ | Regardez les caractéristiques de ce réseau : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman network inspect podman | ||
+ | [ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | Créez maintenant un deuxième réseau appelé **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman network create --gateway 10.87.0.1 --subnet 10.87.0.0/ | ||
+ | db_net | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman network ls | ||
+ | NETWORK ID NAME DRIVER | ||
+ | 556c9797ea6d | ||
+ | 2f259bab93aa | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman network inspect db_net | ||
+ | [ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | Placez le conteneur **db01** dans le réseau **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --replace --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -p 3306:3306 -v / | ||
+ | 36c9f95ae52f76f96c45bb7fd6600cb014adc751059a531bb7bf38f927a11541 | ||
+ | </ | ||
+ | |||
+ | Créez maintenant le conteneur **client** en le plaçant dans le réseau **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman run -d --name client --network db_net registry.access.redhat.com/ | ||
+ | 00b2b82c2adf022badf91f88a9a7f59e71cac705bf4885fa08553681ad1f594c | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | f42e19a0627e | ||
+ | 90c582b10512 | ||
+ | 36c9f95ae52f | ||
+ | 00b2b82c2adf | ||
+ | </ | ||
+ | |||
+ | Installez dans le conteneur **client**, les paquets **iputils** et **iproute** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec -it client dnf install -y iputils iproute | ||
+ | </ | ||
+ | |||
+ | Testez la connectivité du réseau **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec -it client ip a | grep 10.8 | ||
+ | inet 10.87.0.3/ | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman exec -it client ping -c3 db01 | ||
+ | PING db01.dns.podman (10.87.0.2) 56(84) bytes of data. | ||
+ | 64 bytes from 10.87.0.2 (10.87.0.2): | ||
+ | 64 bytes from 10.87.0.2 (10.87.0.2): | ||
+ | 64 bytes from 10.87.0.2 (10.87.0.2): | ||
+ | |||
+ | --- db01.dns.podman ping statistics --- | ||
+ | 3 packets transmitted, | ||
+ | rtt min/ | ||
+ | </ | ||
+ | |||
+ | Testez la résolution des noms **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman exec -it client ping -c3 www.free.fr | ||
+ | PING www.free.fr (212.27.48.10) 56(84) bytes of data. | ||
+ | 64 bytes from www.free.fr (212.27.48.10): | ||
+ | 64 bytes from www.free.fr (212.27.48.10): | ||
+ | 64 bytes from www.free.fr (212.27.48.10): | ||
+ | |||
+ | --- www.free.fr ping statistics --- | ||
+ | 3 packets transmitted, | ||
+ | rtt min/ | ||
+ | </ | ||
+ | |||
+ | Créez le troisième réseau **backend** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman network create backend | ||
+ | backend | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman network ls | ||
+ | NETWORK ID NAME DRIVER | ||
+ | 9c7fcc7b2b5d | ||
+ | 556c9797ea6d | ||
+ | 2f259bab93aa | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman network inspect backend | ||
+ | [ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | Placez les deux conteneurs existants dans ce nouveau réseau : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman network connect backend db01 | ||
+ | |||
+ | [trainee@redhat9 ~]$ podman network connect backend client | ||
+ | </ | ||
+ | |||
+ | Constatez que les deux conteneurs se trouvent dans les deux réseaux, **backend** et **db_net** : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman inspect db01 | ||
+ | [ | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | ... | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ podman inspect client | ||
+ | [ | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | ... | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | =====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 : | ||
+ | |||
+ | < | ||
+ | [trainee@redhat9 ~]$ su - | ||
+ | Password: fenestros | ||
+ | |||
+ | [root@redhat9 ~]# groupadd fenestros && useradd fenestros -c FenestrOs -d / | ||
+ | |||
+ | [root@redhat9 ~]# passwd fenestros | ||
+ | Changing password for user fenestros. | ||
+ | New password: fenestros | ||
+ | BAD PASSWORD: The password contains the user name in some form | ||
+ | Retype new password: fenestros | ||
+ | passwd: all authentication tokens updated successfully. | ||
+ | </ | ||
+ | |||
+ | Devenez l' | ||
+ | |||
+ | < | ||
+ | [root@redhat9 ~]# su - fenestros | ||
+ | |||
+ | [fenestros@redhat9 ~]$ podman info | ||
+ | WARN[0000] The cgroupv2 manager is set to systemd but there is no systemd user session available | ||
+ | WARN[0000] For using systemd, you may need to log in using a user session | ||
+ | WARN[0000] Alternatively, | ||
+ | WARN[0000] Falling back to --cgroup-manager=cgroupfs | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | 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 : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ exit | ||
+ | logout | ||
+ | |||
+ | [root@redhat9 ~]# ssh fenestros@localhost | ||
+ | The authenticity of host ' | ||
+ | ED25519 key fingerprint is SHA256: | ||
+ | This key is not known by any other names | ||
+ | Are you sure you want to continue connecting (yes/ | ||
+ | Warning: Permanently added ' | ||
+ | fenestros@localhost' | ||
+ | Register this system with Red Hat Insights: insights-client --register | ||
+ | Create an account or view all your systems at https:// | ||
+ | Last login: Thu Oct 31 13:04:30 2024 | ||
+ | |||
+ | [fenestros@redhat9 ~]$ podman info | ||
+ | host: | ||
+ | arch: amd64 | ||
+ | buildahVersion: | ||
+ | cgroupControllers: | ||
+ | - memory | ||
+ | - pids | ||
+ | cgroupManager: | ||
+ | cgroupVersion: | ||
+ | conmon: | ||
+ | package: conmon-2.1.10-1.el9.x86_64 | ||
+ | path: / | ||
+ | version: ' | ||
+ | cpuUtilization: | ||
+ | idlePercent: | ||
+ | systemPercent: | ||
+ | userPercent: | ||
+ | cpus: 4 | ||
+ | databaseBackend: | ||
+ | distribution: | ||
+ | distribution: | ||
+ | version: " | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ====5.2 - Création d'un Conteneur de Serveur Web==== | ||
+ | |||
+ | Commencez par créer un répertoire dans l' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ mkdir www | ||
+ | </ | ||
+ | |||
+ | Créez ensuite un conteneur, appelé **webserver** avec un mappage de ports, à partir de l' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ podman run -d --name webserver -p 8080:8080 -v ~/ | ||
+ | Trying to pull registry.access.redhat.com/ | ||
+ | Getting image source signatures | ||
+ | Checking if image destination supports signatures | ||
+ | Copying blob c302a7fbb8d5 done | | ||
+ | Copying blob 148a3ed2f70e done | | ||
+ | Copying blob 4de1bba6ee61 done | | ||
+ | Copying config e11bc11181 done | | ||
+ | Writing manifest to image destination | ||
+ | Storing signatures | ||
+ | e8afda5806a98f378865230e6d5c900c85afc0ea152609602a65d05c60cd68dc | ||
+ | </ | ||
+ | |||
+ | Utilisez la commande **podman generate systemd** pour créer un fichier d' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ podman generate systemd --name webserver --new --files | ||
+ | |||
+ | DEPRECATED command: | ||
+ | It is recommended to use Quadlets for running containers and pods under systemd. | ||
+ | |||
+ | Please refer to podman-systemd.unit(5) for details. | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** - Notez l' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Le fichier est créé dans le répertoire courant : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ cat container-webserver.service | ||
+ | # container-webserver.service | ||
+ | # autogenerated by Podman 4.9.4-rhel | ||
+ | # Thu Oct 31 13:42:12 CET 2024 | ||
+ | |||
+ | [Unit] | ||
+ | Description=Podman container-webserver.service | ||
+ | Documentation=man: | ||
+ | Wants=network-online.target | ||
+ | After=network-online.target | ||
+ | RequiresMountsFor=%t/ | ||
+ | |||
+ | [Service] | ||
+ | Environment=PODMAN_SYSTEMD_UNIT=%n | ||
+ | Restart=on-failure | ||
+ | TimeoutStopSec=70 | ||
+ | ExecStart=/ | ||
+ | --cidfile=%t/ | ||
+ | --cgroups=no-conmon \ | ||
+ | --rm \ | ||
+ | --sdnotify=conmon \ | ||
+ | --replace \ | ||
+ | -d \ | ||
+ | --name webserver \ | ||
+ | -p 8080:8080 \ | ||
+ | -v / | ||
+ | ExecStop=/ | ||
+ | --ignore -t 10 \ | ||
+ | --cidfile=%t/ | ||
+ | ExecStopPost=/ | ||
+ | -f \ | ||
+ | --ignore -t 10 \ | ||
+ | --cidfile=%t/ | ||
+ | Type=notify | ||
+ | NotifyAccess=all | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=default.target | ||
+ | </ | ||
+ | |||
+ | Pour que systemd puisse prendre en charge le service, le fichier d' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ mkdir -p ~/ | ||
+ | |||
+ | [fenestros@redhat9 ~]$ mv container-webserver.service ~/ | ||
+ | </ | ||
+ | |||
+ | Pour créer le service, utilisez la commande **systemctl --user daemon-reload**. Notez que l' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ systemctl --user daemon-reload | ||
+ | </ | ||
+ | |||
+ | Vérifiez le statut du service : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ systemctl --user status container-webserver.service | ||
+ | ○ container-webserver.service - Podman container-webserver.service | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | </ | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ loginctl show-user fenestros | ||
+ | UID=1001 | ||
+ | GID=1001 | ||
+ | Name=fenestros | ||
+ | Timestamp=Thu 2024-10-31 13:09:25 CET | ||
+ | TimestampMonotonic=240322297212 | ||
+ | RuntimePath=/ | ||
+ | Service=user@1001.service | ||
+ | Slice=user-1001.slice | ||
+ | Display=7200 | ||
+ | State=active | ||
+ | Sessions=7200 | ||
+ | IdleHint=no | ||
+ | IdleSinceHint=1730379006672000 | ||
+ | IdleSinceHintMonotonic=242763627399 | ||
+ | Linger=no | ||
+ | </ | ||
+ | |||
+ | 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** : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ loginctl enable-linger | ||
+ | |||
+ | [fenestros@redhat9 ~]$ loginctl show-user fenestros | ||
+ | UID=1001 | ||
+ | GID=1001 | ||
+ | Name=fenestros | ||
+ | Timestamp=Thu 2024-10-31 13:09:25 CET | ||
+ | TimestampMonotonic=240322297212 | ||
+ | RuntimePath=/ | ||
+ | Service=user@1001.service | ||
+ | Slice=user-1001.slice | ||
+ | Display=7200 | ||
+ | State=active | ||
+ | Sessions=7200 | ||
+ | IdleHint=no | ||
+ | IdleSinceHint=1730379080672000 | ||
+ | IdleSinceHintMonotonic=242837627399 | ||
+ | Linger=yes | ||
+ | </ | ||
+ | |||
+ | Créez un fichier **index.html** dans le répertoire **$HOME/ | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ echo "Hello World" > ~/ | ||
+ | </ | ||
+ | |||
+ | Supprimez le conteneur actuel **webserver** en utilisant l' | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | e8afda5806a9 | ||
+ | |||
+ | [fenestros@redhat9 ~]$ podman rm -f webserver | ||
+ | webserver | ||
+ | </ | ||
+ | |||
+ | Activez et démarrez le service utilisateur **container-webserver** : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ systemctl --user enable --now container-webserver | ||
+ | Created symlink / | ||
+ | |||
+ | [fenestros@redhat9 ~]$ systemctl --user status | ||
+ | ● container-webserver.service - Podman container-webserver.service | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | Main PID: 235072 (conmon) | ||
+ | Tasks: 16 (limit: 48799) | ||
+ | | ||
+ | CPU: 132ms | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | [fenestros@redhat9 ~]$ podman ps -a | ||
+ | CONTAINER ID IMAGE COMMAND | ||
+ | ed306cecef9e | ||
+ | </ | ||
+ | |||
+ | Déconnectez-vous du compte fenestros et vérifiez que le serveur Web fonctionne : | ||
+ | |||
+ | < | ||
+ | [fenestros@redhat9 ~]$ exit | ||
+ | logout | ||
+ | Connection to localhost closed. | ||
+ | |||
+ | [root@redhat9 ~]# curl http:// | ||
+ | Hello World | ||
+ | </ | ||
+ | |||
+ | ----- | ||
+ | Copyright © 2024 Hugh Norris |