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. |
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 |
{ |
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 |
[...] |
La commande podman search
recherche une image dans registries.conf
:
$ podman search python |
NAME DESCRIPTION |
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... |
La commande podman images
affiche les images locales :
$ podman images |
REPOSITORY TAG IMAGE ID CREATED SIZE |
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 |
Paramètres :
FROM registry.access.redhat.com/ubi8/ubi:latest
: image qui sera utiliséRUN dnf install -y python3
: installe Python3CMD ["/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’imageTAG
: Balise de l’image. Si pas spécifiée, met automatiquement latestDIR
: 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 |
La commande podman images
permet de vérifier que l’image créée :
$ podman images |
REPOSITORY TAG IMAGE ID CREATED SIZE |
La commande podman inspect
permet d’afficher les informations de l’image :
$ podman inspect localhost/python36:1.0 |
[...] |
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écuteStopped
: 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 |
$ podman ps |
$ podman ps -a |
La commande podman start
démarre le conteneur :
$ podman start python36 |
$ podman start <ID> |
$ podman ps |
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 |
$ podman ps |
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 |
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 |
Comparaison de version python installée sur le système et dans les conteneurs :
$ python3 --version |
$ podman exec python36 python3 --version |
$ podman exec python38 python3 --version |
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 |
Une fois le script copié dans le conteneur, il peut y être exécuté :
$ podman exec python38 bash /tmp/hello.sh |
Suppression de conteneurs et images
Les commandes :
podman rm
: supprimer des conteneurspodman 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 |
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 |
/!\ Résumé des commandes
Commandes :
$ podman build // Crée une image de conteneur avec un fichier de conteneurs |
Fichiers :
/etc/containers/storage.conf |
Cas pratique
Installation du paquetage container-tools
:
[aline@SERVER01 ~]$ sudo dnf install container-tools |
[sudo] password for aline: |
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'] |
Vérification que le registre est bien ajouté :
[aline@SERVER01 ~]$ podman info |
[...] |
Connexion au registre :
[aline@SERVER01 ~]$ podman login registry.my.compagny.org |
Username: aline |
Recherche du conteneur python-38 dans le registre registry.my.compagny.org :
[aline@SERVER01 ~]$ podman search registry.my.compagny.org/ |
NAME DESCRIPTION |
Examination de l’image :
[aline@SERVER01 ~]$ skopeo inspect docker://registry.my.compagny.org/ubi8/python-38 |
[...] |
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... |
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 |
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 |
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 |
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 |
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 |
Inspection du conteneur python39 :
[aline@SERVER01 ~]$ podman inspect localhost/python39:1.0 |
[...] |
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 |
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 |
Exécution du script Python dans les deux conteneurs :
[aline@SERVER01 ~]$ podman exec -it python39 python3 /tmp/script.py |
[aline@SERVER01 ~]$ podman exec -it python38 python3 /tmp/script.py |
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 |
Arrêt les deux conteneurs :
[aline@SERVER01 ~]$ podman stop python39 python38 |
[...] |
Suppression des deux conteneurs :
[aline@SERVER01 ~]$ podman rm python39 python38 |
3db4eabe9043224a7bdf195ab5fd810bf95db98dc29193392cef7b94489e1aae |
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 |
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)