Podman - Deploiement Des Conteneurs

Podman et Skopeo permettent de gérer les conteneurs et les images de conteuneurs.

Utilitaires pour conteneurs

Le paquet container-tools permet de télécharger, exécuter et comparer des conteneurs (et contient podman et skopeo) :

$ dnf install container-tools

Information sur le paquet :

$ dnf info container-tools
Updating Subscription Management repositories.
Last metadata expiration check: 0:52:07 ago on Sun 27 Oct 2024 01:21:26 PM +00.
Installed Packages
Name : container-tools
Version : 1
Release : 14.el9
Architecture : noarch
Size : 0.0
Source : container-tools-1-14.el9.src.rpm
Repository : @System
From repo : rhel-9-for-x86_64-appstream-rpms
Summary : A meta-package witch container tools such as podman, buildah, skopeo, etc.
License : MIT
Description : Latest versions of podman, buildah, skopeo, runc, conmon, CRIU, Udica, etc as well
: as dependencies such as container-selinux built and tested together, and updated.

Skopeo

La commande skopeo inspect affiche les informations d’image de conteneur (versions, ports, métadonnées, paquetages inclus,…) :

$ skopeo inspect docker://registry.access.redhat.com/ubi8/python-38
{
"Name": "registry.access.redhat.com/ubi8/python-38",
"Digest": "sha256:74e5b2d063d424cb06f8e41ef1983a94b1cb890e62ec656c52e81074be21c15e",
"RepoTags": [
[...]
"1-86-source",
"1-9",
"1-9.1591210169",
"1-94",
"1-94-source",
"1-96",
"latest"
[...]
"name": "ubi8/python-38",
"release": "131",
"summary": "Platform for building and running Python 3.8 applications",
"url": "https://access.redhat.com/containers/#/registry.access.redhat.com/ubi8/python-38/images/1-131",
[...]

Podman

Podman n’utilise pas de daemon pour fonctionner, il n’est pas nécessaire d’avoir un compte root pour utiliser les conteneurs.

Commandes courantes

Commandes courantes de Podman.

Commandes Podman Description
podman build Crée une image de conteneur avec un fichier de conteneurs
podman run Exécute une commande dans un nouveau conteneur
podman images Liste les images du stockage local
podman ps Affiche des informations des conteneurs
podman inspect Affiche la config d’un conteneur, image, volume, réseau, pod
podman pull Télécharge une image à partir d’un registre
podman cp Copie des fichiers/répertoires entre un conteneur et le système local
podman exec Exécute une commande dans un conteneur en cours d’exécution
podman rm Supprime un ou plusieurs conteneurs
podman rmi Supprime une ou plusieurs images stockées localement
podman search Recherche une image dans un registre

Les images

La commande podman info affiche les informations des images :

$ podman info
[...]
registries:
search:
- registry.access.redhat.com
- registry.redhat.io
- docker.io
store:
configFile: /etc/containers/storage.conf
containerStore:
number: 42
paused: 5
running: 26
stopped: 11
[...]

La commande podman search recherche une image dans registries.conf :

$ podman search python
NAME DESCRIPTION
registry.access.redhat.com/ubi7/python-38 Python 3.8 platform for building and running applications
registry.redhat.io/rhel8/python-38 Platform for building and running Python 3.8 applications
[...]

La commande podman pull permet de télécharger l’image :

$ podman pull registry.access.redhat.com/ubi8/python-38
Trying to pull registry.access.redhat.com/ubi8/python-38:latest...
Getting image source signatures
Checking if image destination supports signatures
Copying blob b664526afe9e done
[...]

La commande podman images affiche les images locales :

$ podman images
REPOSITORY					TAG 	IMAGE ID	CREATED 	SIZE
registry.access.redhat.com/ubi8/python-38 latest b25ee6afd458 1 hour ago 901 MB

Création d’images

Il est possible de créer une image de conteneur à partir d’un fichier de conteneur.

Ce fichier de conteneur permet de créer l’image de conteneur dans le répertoire /python36-app :

$ cat myContainerFile
FROM registry.access.redhat.com/ubi8/ubi:latest
RUN dnf install -y python3
CMD ["/bin/bash", "-c", "sleep infinity"]

Paramètres :

  • FROM registry.access.redhat.com/ubi8/ubi:latest : image qui sera utilisé
  • RUN dnf install -y python3 : installe Python3
  • CMD ["/bin/bash", "-c", "sleep infinity"] : exécute un sleep infini pour empêcher la fermeture du conteneur

La commande podman build permet de compiler l’image, l’option -t sert à indiquer le nom et la balise :

$ podman build -t NAME:TAG DIR

Paramètres :

  • NAME : Nom de l’image
  • TAG : Balise de l’image. Si pas spécifiée, met automatiquement latest
  • DIR : Chemin du répertoire de travail :
    • le fichier de conteneur doit se trouver dans le répertoire de travail
    • si c’est le répertoire courant, on utilise le “.”
    • si répertoire différent du répertoire actuel : option -f
$ podman build -t python36:1.0 .
STEP 1/3: FROM registry.access.redhat.com/ubi8/ubi:latest
STEP 2/3: RUN dnf install -y python36
[...]
STEP 3/3: CMD ["/bin/bash", "-c", "sleep infinity"]
COMMIT python36:1.0
--> 2ac6b82088b
Successfully tagged localhost/python36:1.0
b5407ffc94cb4664526afe9880f17064526afe9e2506b8b6880f17064526afe9

La commande podman images permet de vérifier que l’image créée :

$ podman images
REPOSITORY					TAG 		IMAGE ID	CREATED		SIZE
localhost/python36 1.0 b5407ffc94cb 3 minute ago 266 MB
registry.access.redhat.com/ubi8/python-38 latest a33d92f90990 1 hour ago 901 MB

La commande podman inspect permet d’afficher les informations de l’image :

$ podman inspect localhost/python36:1.0
[...]
"Cmd": [
"/bin/bash",
"-c",
"sleep infinity"
],
[...]
{
"created": "2024-10-26T19:47:52.708227513Z",
"created_by": "/bin/sh -c dnf install -y python36",
"comment": "FROM registry.access.redhat.com/ubi8/ubi:latest"
},
[...]

Les conteneurs

Etats des conteneurs

Un conteneur (et ses processus) peut être dans l’un des états suivants :

  • Created : conteneur créé mais pas démarré
  • Running : conteneur qui s’exécute
  • Stopped : conteneur arrêté
  • Paused : conteneur en pause ( pas pris en charge pour les rootless)
  • Deleted : conteneur inactif (dead).

La commande podman ps liste les conteneurs en cours d’exécution et podman ps -a liste tous les conteneurs

Créer des conteneurs

La commande podman create permet de créer un conteneur avec l’ID de l’image :

$ podman create --name python36 dd6ca291f097
c54c7ee281581c198cb96b07d78a0f94be083ae94dacbae69c05bd8cd354bbec
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54c7ee28158 localhost/python36:1.0 /bin/bash -c slee... 5 seconds ago Created python36

La commande podman start démarre le conteneur :

$ podman start python36
python36
$ podman start <ID>
python36
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54c7ee28158 localhost/python36:1.0 /bin/bash -c slee... 6 minutes ago Up python36

Exécuter des conteneurs

La commande podman run permet de créer et exécuter le conteneur en une seule étape, l’option -d (detach) permet d’exécuter le conteneur en arrière-plan.

Si une commande est déjà définie dans le fichier de conteneur (sleep infinity), il n’est pas nécessaire d’éxécuter le conteneur avec une commande mais si lancée quand même, cela empêchera la fermeture du conteneur :

$ podman run -d --name python38 registry.access.redhat.com/ubi8/python-38 sleep infinity
a60f71a1dc1b997f5ef244aaed232e5de71dd1e8a2565428ccfebde73a2f9462
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c54c7ee28158 localhost/python36:1.0 /bin/bash -c slee... 36 minutes ago Up python36
a60f71a1dc1b registry.access.redhat.com/ubi8/python-38:latest sleep infinity 32 seconds ago Up 33 seconds ago python38

La commande podman exec permet d’afficher les processus en cours d’exécution dans le conteneur python36 :

$ podman exec python38 ps -ax PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity
7 ? R 0:00 ps -ax

La commande sh -c permet d’encapsuler la commande à exécuter dans le conteneur, le caractère > peut être interprété directement par Podman et pas comme argument de l’option podman exec :

$ podman exec python38 sh -c 'ps -ax > /tmp/process-data.log'
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity
7 ? R 0:00 ps -ax

Comparaison de version python installée sur le système et dans les conteneurs :

$ python3 --version
Python 3.9.10
$ podman exec python36 python3 --version
Python 3.6.8
$ podman exec python38 python3 --version
Python 3.8.8

Copie de fichiers entre système et conteneurs

La commande podman cp copie les fichiers et les répertoires entre le système et le conteneur :

$ podman cp /tmp/hello.sh python38:/tmp/hello.sh

Vérification du fichier copié :

$ podman exec python38 stat /tmp/hello.sh
File: /tmp/hello.sh
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 3bh/59d Inode: 12280058 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ default) Gid: ( 0/ root)
Access: 2024-02-25 90:06:42.000000000 +0000
Modify: 2024-02-25 90:06:42.000000000 +0000
Change: 2024-02-25 90:12:04.552212154 +0000
Birth: 2024-02-25 90:12:04.552212154 +0000

Une fois le script copié dans le conteneur, il peut y être exécuté :

$ podman exec python38 bash /tmp/hello.sh
hello world

Suppression de conteneurs et images

Les commandes :

  • podman rm : supprimer des conteneurs
  • podman rmi : supprimer des images

Avant de supprimer une image il faut supprimer le conteneur en cours d’éxécution :

$ podman rmi registry.access.redhat.com/ubi8/python-38
Error: Image used by
a60f71a1dc1b997f5ef244aaed232e5de71dd1e8a2565428ccfebde73a2f9462: image is in use by a container

Arrêter le conteneur avec podman stop :

$ podman stop python38

Supprimer le conteneur avec podman rm :

$ podman rm python38
a60f71a1dc1b997f5ef244aaed232e5de71dd1e8a2565428ccfebde73a2f9462

Supprimer l’image avec podman rmi :

$ podman rmi registry.access.redhat.com/ubi8/python-38
Untagged: registry.access.redhat.com/ubi8/python-38:latest
Deleted: a33d92f90990c9b1bad9aa98fe017e48f30c711b49527dcc797135352ea57d12

/!\ Résumé des commandes

Commandes :

$ podman build	  // Crée une image de conteneur avec un fichier de conteneurs 
$ podman run // Exécute une commande dans un nouveau conteneur
$ podman images // Liste les images du stockage local
$ podman ps // Affiche des informations des conteneurs
$ podman inspect // Affiche la config d'un conteneur, image, volume, réseau, pod
$ podman pull // Télécharge une image à partir d'un registre
$ podman cp // Copie des fichiers/répertoires entre un conteneur et le système local
$ podman exec // Exécute une commande dans un conteneur en cours d'exécution
$ podman rm // Supprime un ou plusieurs conteneurs
$ podman rmi // Supprime une ou plusieurs images stockées localement
$ podman search // Recherche une image dans un registre

$ skopeo inspect docker://registry.access.redhat.com/ubi8/python-38

$ podman info
$ podman search python-38
$ podman pull registry.access.redhat.com/ubi8/python-38
$ podman images
$ podman build -t NAME:TAG DIR
$ podman build -t python36:1.0 .
$ podman inspect localhost/python36:1.0
$ podman create --name python36 dd6ca291f097
$ podman ps
$ podman ps -a
$ podman start python36
$ podman start <ID>
$ podman run -d --name python38 registry.access.redhat.com/ubi8/python-38 sleep infinity
$ podman exec python38 ps -ax
$ podman exec python38 sh -c 'ps -ax > /tmp/process-data.log'
$ podman exec python36 python3 --version
$ podman cp /tmp/hello.sh python38:/tmp/hello.sh
$ podman exec python38 bash /tmp/hello.sh
$ podman stop python38
$ podman rm python38
$ podman rmi registry.access.redhat.com/ubi8/python-38

Fichiers :

/etc/containers/storage.conf
/home/<userName>/.config/containers

Cas pratique

Installation du paquetage container-tools :

[aline@SERVER01 ~]$ sudo dnf install container-tools
[sudo] password for aline:
Updating Subscription Management repositories.
Last metadata expiration check: 4:44:45 ago on Mon 28 Oct 2024 02:26:38 AM +00.
[...]
Is this ok [y/N]: y
[...]
Complete!

Création du répertoire /home/aline/.config/containers :

[aline@SERVER01 ~]$ mkdir -p /home/aline/.config/containers

Création du fichier /home/aline/.config/containers/registries.conf avec le contenu suivant :

unqualified-search-registries = ['registry.my.compagny.org']
[[registry]]
location = "registry.my.compagny.org"
insecure = true
blocked = false

Vérification que le registre est bien ajouté :

[aline@SERVER01 ~]$ podman info
[...]
registries:
registry.my.compagny.org:
Blocked: false
Insecure: true
Location: registry.my.compagny.org
MirrorByDigestOnly: false
Mirrors: null
Prefix: registry.my.compagny.org
search:
- registry.my.compagny.org
[...]

Connexion au registre :

[aline@SERVER01 ~]$ podman login registry.my.compagny.org
Username: aline
Password: MyAwesomePa55W0rD!
Login Succeeded!

Recherche du conteneur python-38 dans le registre registry.my.compagny.org :

[aline@SERVER01 ~]$ podman search registry.my.compagny.org/
NAME                                      DESCRIPTION
[...]
registry.my.compagny.org/ubi8/python-38 registry.my.compagny.org/...
registry.my.compagny.org/ubi8/httpd-24 registry.my.compagny.org/...
registry.my.compagny.org/rhel8/php-74 registry.my.compagny.org/...

Examination de l’image :

[aline@SERVER01 ~]$ skopeo inspect docker://registry.my.compagny.org/ubi8/python-38
[...]
"DESCRIPTION": "Python 3.8 available as container is a base platform for building and running various Python 3.8 applications and frameworks.
[...]

Extraction de l’image de conteneur python-38 :

[aline@SERVER01 ~]$ podman pull registry.my.compagny.org/ubi8/python-38
Trying to pull registry.my.compagny.org/ubi8/python-38:latest...
Getting image source signatures
Copying blob 7d98d813d54f done |
Copying blob 7aadc5092c3b done |
Copying blob da802df85c96 done |
Copying blob ad1c7cfc347f done |
Copying blob 3cb0c7824817 done |
Copying blob 6d4976a28162 done |
Copying blob 7fd1c94ea9ec done |
Copying config a4cb00e848 done |
Writing manifest to image destination
a4cb00e84832fc88a38893b00b15826ac0dc444e9874fe0353e2d73674477d1c

Vérification que le conteneur est téléchargé dans le référentiel d’images local :

[aline@SERVER01 ~]$ podman images
REPOSITORY                              TAG         IMAGE ID      CREATED     SIZE
registry.my.compagny.org/ubi8/python-38 latest a4cb00e84832 9 days ago 1.04 GB

Démarrage du conteneur python38, l’option -d est pour detached :

[aline@SERVER01 ~]$ podman run -d --name python38 registry.my.compagny.org/ubi8/python-38 sleep infinity
a79490db60fe903a663815def3dde8e11083047cdda288838f772487b76457fa

Vérification que le conteneur a bien été créé :

[aline@SERVER01 ~]$ podman ps
CONTAINER ID  IMAGE                            COMMAND         CREATED         STATUS         PORTS       NAMES
a79490db60fe docker.io/library/python:latest sleep infinity 22 seconds ago Up 22 seconds python38

Examination du fichier de conteneur dans le répertoire /home/aline/python39 :

[aline@SERVER01 ~]$ cat /home/aline/python39/Containerfile
FROM registry.my.compagny.org/ubi9-beta/ubi:latest
RUN echo -e '[rhel-9.0-for-x86_64-baseos-rpms]\nbaseurl = http://content.example.com/rhel9.0/x86_64/dvd/BaseOS\nenabled = true\ngpgcheck =
false\nname = Red Hat Enterprise Linux 9.0 BaseOS (dvd)\n[rhel-9.0-for-x86_64-appstream-rpms]\nbaseurl = http://content.example.com/rhel9.0/x86_64/dvd/AppStream
\nenabled = true\ngpgcheck = false\nname = Red Hat Enterprise Linux 9.0 Appstream (dvd)'>/etc/yum.repos.d/rhel_dvd.repo
RUN yum install --disablerepo=* --enablerepo=rhel-9.0-for-x86_64-baseos-rpms --enablerepo=rhel-9.0-for-x86_64-appstream-rpms -y python3

Création de l’image de conteneur à partir du fichier de conteneurs :

[aline@SERVER01 ~]$ podman build -t python39:1.0 /home/aline/python39/.
STEP 1/4: FROM registry.my.compagny.org/ubi9-beta/ubi:latest
[...]
STEP 2/4: RUN echo -e '[rhel-9.0-for-x86_64-baseos-rpms] ...
[...]
STEP 3/4: RUN yum install --disablerepo=* --enablerepo=rhel-9.0-for-x86_64-baseosrpms --enablerepo=rhel-9.0-for-x86_64-appstream-rpms -y python3
[...]
STEP 4/4: CMD ["/bin/bash", "-c", "sleep infinity"]
[...]
Successfully tagged localhost/python39:1.0
e0e68c195925beafe3b2ad7a54fe1e5673993db847276bc62d5f9d109e9eb499

Vérification que l’image de conteneur existe dans le référentiel d’images local :

[aline@SERVER01 ~]$ podman images
REPOSITORY                              TAG     IMAGE ID      CREATED         SIZE
localhost/python39 1.0 80e68c195925 3 minutes ago 266 MB
registry.my.compagny.org/ubi8/python-38 latest 671cc3cb4298 5 days ago 901 MB
registry.my.compagny.org/ubi9-beta/ubi latest fca12da1dc30 4 months ago 235 MB

Inspection du conteneur python39 :

[aline@SERVER01 ~]$ podman inspect localhost/python39:1.0
[...]
"comment": "FROM registry.my.compagny.org/ubi9-beta/ubi:latest"
[...]
"created_by": "/bin/sh -c yum install --disablerepo=*
--enablerepo=rhel-9.0-for-x86_64-baseos-rpms --enablerepo=rhel-9.0-for-x86_64-appstream-rpms -y python3"
[...]
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/bash\", \"-c\", \"sleep infinity\"]",
[...]

Création du conteneur python39 :

[aline@SERVER01 ~]$ podman create --name python39 localhost/python39:1.0
3db4eabe9043224a7bdf195ab5fd810bf95db98dc2919aa92cef7b94489e1aae

Démarrage du conteneur python39 :

[aline@SERVER01 ~]$ podman start python39
python39

Vérification que le conteneur est en cours d’exécution ;

[aline@SERVER01 ~]$ podman ps
CONTAINER ID  IMAGE                                           COMMAND               CREATED         STATUS  PORTS   NAMES
004756b52d3d registry.my.compagny.org/ubi8/python-38:latest sleep infinity 33 minutes ago Up python38
3db4eabe9043 localhost/python39:1.0 /bin/bash -c slee... 18 minutes ago Up python39

Copie du script python /home/aline/script.py dans le répertoire /tmp des deux conteneurs :

[aline@SERVER01 ~]$ podman cp /home/aline/script.py python39:/tmp/script.py
[aline@SERVER01 ~]$ podman cp /home/aline/script.py python38:/tmp/script.py

Exécution du script Python dans les deux conteneurs :

[aline@SERVER01 ~]$ podman exec -it python39 python3 /tmp/script.py

This script was not run on the correct version of Python
Expected version of Python is 3.8
Current version of python is 3.9
[aline@SERVER01 ~]$ podman exec -it python38 python3 /tmp/script.py

This script was correctly run on Python 3.8

Exécution du script Python sur l’hôte :

[aline@SERVER01 ~]$ python3 /home/aline/script.py
This script was not run on the correct version of Python
Expected version of Python is 3.8
Current version of python is 3.9

Arrêt les deux conteneurs :

[aline@SERVER01 ~]$ podman stop python39 python38
[...]
python38
python39

Suppression des deux conteneurs :

[aline@SERVER01 ~]$ podman rm python39 python38
3db4eabe9043224a7bdf195ab5fd810bf95db98dc29193392cef7b94489e1aae
004756b52d3d3326545f5075594cffa858afd474b903288723a3aa299e72b1af

Suppression des deux images de conteneurs :

[aline@SERVER01 ~]$ podman rmi localhost/python39:1.0 registry.my.compagny.org/ubi8/python-38:latest registry.my.compagny.org/ubi9-beta/ubi
Untagged: localhost/python39:1.0
Untagged: registry.my.compagny.org/ubi8/python-38:latest
Deleted: 80e68c195925beafe3b2ad7a54fe1e5673993db847276bc62d5f9d109e9eb499
Deleted: 219e43f6ff96fd11ea64f67cd6411c354dacbc5cbe296ff1fdbf5b717f01d89a
Deleted: 671cc3cb42984e338733ebb5a9a68e69e267cb7f9cb802283d3bc066f6321617

Documentation

MAN containersregistries.conf(5)
MAN podman(1)
MAN podman-build(1)
MAN podman-cp(1)
MAN podman-exec(1)
MAN podman-images(1)
MAN podman-inspect(1)
MAN podman-ps(1)
MAN podman-pull(1)
MAN podman-rm(1)
MAN podman-rmi(1)
MAN podman-run(1)
MAN podman-search(1)
MAN podmanstop(1)

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/building_running_and_managing_containers/index#starting-withcontainers_building-running-and-managing-containers

> Partager <