Les images Podman constituent une solution efficace pour encapsuler et déployer des applications dans des conteneurs, en intégrant le code, les dépendances, les bibliothèques et les configurations nécessaires. Elles garantissent une consistance entre les différents environnements (développement, test, production) grâce à leur immutabilité, améliorant ainsi la sécurité et réduisant les incompatibilités. La conception en couches optimise les mises à jour et la distribution, tandis que la portabilité assure une exécution difficulé sur diverses plateformes
Rechercher une image
Pour rechercher une image sur les registres publics, on utilise la sous commandes search :
# podman search nom_image
# podman search httpd --filter=is-official
Exemple de registres très connus :
Télécharger une image
Pour télécharger une image à partir d'un registres public, on utilise la sous commande pull :
# podman pull nom_image
Consulter les images locales
Tout d'abord, on peut identifier le répertoire où sont stockées localement les images téléchargées avec la commande suivante :
# podman info | grep "graphRoot:"
On peut ensuite lister les images présentes localement :
# podman image ls
# podman image ls --noheading
# podman image ls -q
On peut également utiliser la commande suivante :
# podman images
Si on souhaite lister les commandes dockerfile ayant servi à créer l'image, on utilisera la commande suivante :
# podman history nom_image
Créer une image
Pour créer une image, on utilise un fichier Dockerfile
pour définir les étapes de création, puis on construit cette image avec Podman. Un fichier Dockerfile contient des commandes telles que FROM, RUN, COPY qui à chaque fois qu'elles sont exécutées lors de la création, ajoutent une couche à l'image. Certaines commandes telles que CMD, EXPOSE ou VOLUME, ne créent pas de nouvelles couches et ne font que modifier la configuration du conteneur. Les couches d'une image sont donc organisées en couches successives ce qui permet lorsqu'elles sont communes à plusieurs images d'optimiser l'occupation de l'espace de stockage en ne conservant qu'une seule occurrence. Pour créer une image simple, on peut suivre les étapes suivantes :
- Créer un Dockerfile :
FROM ubuntu:latest
Ici on part d'une image Ubuntu basique, on met à jour et on installe nginx. Notons que le fait d'utiliser && permet d'économiser une couche en ne lançant qu'une seule fois la commande RUN. Enfin, on définit la commande par défaut avec CMD pour exécuter nginx.
RUN apt-get update && apt-get install -y nginx
CMD ["nginx", "-g", "daemon off;"] - Construire l'image en lançant la commande suivante :
# podman build -t myNewImage .
Le "." définit le contexte de build. Si on ne précise pas le répertoire du Dockerfile, Podman le cherche dans le répertoire du contexte de build, en l'occurrence le répertoire courant.
Si on veut aller chercher le Dockerfile à un autre endroit, on peut utiliser la commande suivante :# podman build -t myNewImage -f /tmp/myDockerfile .
- Vérifier l'image créée avec la commande suivante :
# podman images
- Lancer un conteneur basée sur l'image créée :
# podman run -d myContainer myNewImage
Notes sur les couches
- Les couches des images sont en lecture seule
- Les couches communes à plusieurs images sont partagées au sein d'un même registre
- Un conteneur est une instance d'image et possède également une couche spécifique qui est en lecture et écriture. Quand on modifie le conteneur, cela modifie sa couche.
- Il faut faire attention aux informations sensibles se trouvant dans les couches. En effet, ce n'est pas parce-qu'une information ne se trouve plus dans le conteneur exécuté à partir d'une image que cette information a complètement disparu des couches de l'image.
Modifier une image
Il est possible de modifier une image sans avoir besoin de la reconstruire complètement. Pour cela, on peut modifier un conteneur issu de cette image puis "commiter" ce conteneur vers une nouvelle image, par exemple :
- Ouvrir un shell dans le conteneur myContainer :
# podman exec -ti myContainer bash
- Effectuer une modification dans le conteneur, par exemple créer un fichier :
$ touch /tmp/myFile
- Visualiser les modifications apportées à la couche spécifique du conteneur :
# podman diff myContainer
- Créer une nouvelle image à partir du conteneur en appliquant les modifications :
# podman commit myContainer myNewImage
Partager une image
Pour partager une image sur un registre, on peut suivre les étapes suivantes :
- Se connecter à un registre si nécessaire, par exemple docker.io :
# podman login docker.io
- Taguer l'image pour suivre les conventions de nommage du registre :
# podman tag myLocImg:myTag docker.io/myReg/myImg:myTag
- Télécharger l'image vers le registre :
# podman push docker.io/myReg/myImg:myTag
Supprimer une image
Pour supprimer une image locale, on utilise la commande suivante :
# podman rmi myImage
Sauvegarder une image
Pour sauvegarder une image Podman, on peux utiliser la commande podman save
. Cette commande permet d'exporter une image de conteneur, ainsi que toutes ses métadonnées, dans un fichier archive (généralement au format tar). On utilise généralement cette commande d'avantage pour partager ou déplacer une image entre différents environnements ou systèmes.
Pour sauvegarder une image, on utilisera la commande suivante :
# podman save -o myFile.tar myImage
Pour charger une image préalablement sauvegardée, on utilisera la commande suivante :
# podman load -i myFile.tar
Exporter une image
La commande podman export
est utilisée pour exporter le système de fichiers d'un conteneur spécifique vers un fichier archive au format tar. Cette commande est différente de podman save
, qui est utilisée pour sauvegarder une image de conteneur. podman export
se concentre sur un conteneur en cours d'exécution ou arrêté et permet d'extraire le contenu de son système de fichiers.
Pour exporter le système de fichier d'un conteneur, on peut utiliser la commande suivante :
# podman export myContainer > myContainer.tar