Aller au contenu

Podman le moteur de conteneur alternatif à Docker

Mise à jour :

logo podman

Les conteneurs sont devenus essentiels pour les environnements de développement, permettant le déploiement d’applications de manière rapide, portable et reproductible. Historiquement dominé par Docker, ce domaine a vu émerger d’autres outils répondant à des besoins spécifiques, notamment en matière de sécurité et de flexibilité.

Podman, acronyme de POD Manager, est une alternative open source qui se distingue par sa conception sans démon (daemonless), son exécution sans privilèges root (rootless) et son intégration native avec les pods, un concept clé de Kubernetes. Développé par Red Hat et soutenu par une large communauté, Podman se veut à la fois une solution moderne et compatible avec les outils existants comme Docker.

Pourquoi Podman est apparu

Il y a quelques années, Docker était très critiqué pour son manque de sécurité, principalement en raison de son architecture client-serveur avec un démon central (dockerd) qui doit s’exécuter en tant que root. Cette configuration posait des problèmes de sécurité importants.

En revanche, Podman a été conçu pour fonctionner sans démon (daemonless). Chaque commande exécutée avec Podman crée un processus isolé, ce qui élimine le besoin d’un démon central et améliore la sécurité globale du système.

Docker nécessite des privilèges root pour le démon, ce qui peut poser des risques de sécurité. Podman, quant à lui, permet une exécution rootless par défaut, réduisant ainsi les risques associés aux privilèges élevés.

De plus, Docker ne gère que des conteneurs individuels. Podman, en revanche, supporte nativement le concept de pods, emprunté à Kubernetes. Un pod dans Podman est composé d’un ou plusieurs conteneurs regroupés dans un espace de noms, un réseau et un contexte de sécurité uniques, offrant une gestion plus flexible et sécurisée des conteneurs.

AspectDockerPodman
ArchitectureClient-serveur avec démon (dockerd)Sans démon (daemonless)
SécuritéPrivilèges root nécessairesExécution rootless par défaut
Gestion des conteneursVia le démon DockerConteneurs OCI directement
Support des PodsNonOui, nativement
Syntaxe des commandesdocker <commande>podman <commande> (compatible Docker)
Intégration KubernetesOutils supplémentaires nécessairesIntégration native via Podman Play
PerformancesSurcharge possible due au démonPlus léger sans démon central
MigrationAlias, compatibilité Dockerfiles, registresAlias, compatibilité Dockerfiles, registres

C’est quoi un pod pour Podman ?

Un pod dans Podman est un groupe de conteneurs qui partagent les mêmes ressources, notamment les espaces de noms, le réseau et le contexte de sécurité, similaire au concept de pod dans Kubernetes. Chaque pod inclut un conteneur spécial appelé “infra” ou “pause”, qui maintient les espaces de noms associés au pod et permet à Podman de connecter d’autres conteneurs au pod. Ce conteneur “infra” ne fait rien d’autre que de rester en veille, mais il est essentiel pour la gestion des ressources partagées au sein du pod.

L’utilisation de pods présente plusieurs avantages, notamment la capacité de regrouper des conteneurs qui doivent interagir étroitement. Par exemple, si vous avez plusieurs conteneurs nécessitant l’accès à une base de données MariaDB, vous pouvez les placer dans un même pod. Ainsi, ces conteneurs peuvent communiquer entre eux via l’adresse localhost du pod, sans exposer la base de données sur un réseau accessible, renforçant ainsi la sécurité.

En résumé, les pods dans Podman offrent une gestion flexible et sécurisée des conteneurs, en permettant à plusieurs conteneurs de partager des ressources communes tout en maintenant une isolation appropriée.

Installation de Podman

Installation de Podman sur Linux

Podman est largement pris en charge sur les principales distributions Linux, et peut être installé via les gestionnaires de paquets intégrés de ces systèmes. Toutefois, il arrive que les versions disponibles dans les dépôts officiels ne soient pas les plus récentes. Si vous avez besoin des dernières fonctionnalités ou correctifs, il est possible de compiler Podman directement depuis son code source.

Installation depuis les dépôts officiels

Les dépôts des distributions Linux fournissent souvent une version de Podman qui est testée pour garantir sa stabilité dans l’environnement concerné. Voici comment procéder pour les distributions populaires :

  1. Ubuntu/Debian :

    Terminal window
    sudo apt update
    sudo apt install -y podman
  2. Fedora (la distribution native de Podman, toujours à jour) :

    Terminal window
    sudo dnf install -y podman
  3. CentOS/RHEL : Activez le dépôt extras ou EPEL (selon la version) :

    Terminal window
    sudo yum install -y epel-release
    sudo yum install -y podman
  4. Arch Linux : Podman est disponible dans les dépôts communautaires :

    Terminal window
    sudo pacman -S podman
  5. openSUSE : Utilisez zypper pour installer Podman :

    Terminal window
    sudo zypper install podman

Installer la dernière version en compilant le code source**

Si la version dans votre gestionnaire de paquets est obsolète ou que vous souhaitez accéder aux dernières fonctionnalités, vous pouvez installer Podman depuis son code source.

Installation de Podman sous MacOs et Windows

Voici le texte corrigé :

Podman fonctionne sur Linux, MacOS, et Windows, mais il est important de noter que sur MacOS et Windows, il repose sur un environnement Linux virtualisé pour exécuter les conteneurs. Contrairement à Linux, où Podman peut fonctionner directement sur le système, MacOS et Windows ne disposent pas d’une infrastructure Linux native pour supporter les conteneurs. Podman résout ce problème en déployant une machine virtuelle Linux minimaliste à l’aide de l’outil intégré podman machine.

Cette machine virtuelle fournit :

  1. Un noyau Linux pour assurer la compatibilité avec les conteneurs.
  2. Un environnement isolé pour exécuter des applications conteneurisées sans impacter le système hôte.

Avec Podman Machine, l’installation et la gestion de cette VM sont automatisées, simplifiant considérablement la configuration.

Installation sur MacOS

  1. Installer Podman via Homebrew :

    Terminal window
    brew install podman
  2. Créer une VM Linux avec Podman Machine :

    Terminal window
    podman machine init

    Cela initialise une machine virtuelle basée sur une distribution Linux légère.

  3. Démarrer la machine virtuelle :

    Terminal window
    podman machine start
  4. Vérifier l’installation et la VM : Vérifiez que Podman est installé et que la VM est en cours d’exécution :

    Terminal window
    podman --version
    podman machine list

    Vous devriez voir une sortie similaire à :

    Terminal window
    NAME STATE LAST UP CPUS MEMORY DISK
    podman-machine-default running ... 1 2048 MB 10.0 GB
  5. Utilisation : Une fois la machine virtuelle démarrée, vous pouvez utiliser Podman pour exécuter des conteneurs comme sur un système Linux natif.

Installation sur Windows

  1. Installer Podman Desktop : Téléchargez Podman Desktop depuis le site officiel. Ce logiciel facilite l’installation et l’utilisation de Podman sur Windows.

  2. Configurer la machine virtuelle : Une fois installé, utilisez Podman Machine pour créer et démarrer une VM Linux :

    Terminal window
    podman machine init
    podman machine start
  3. Vérifier la configuration : Vérifiez que Podman est opérationnel et que la machine virtuelle fonctionne :

    Terminal window
    podman --version
    podman machine list
  4. Interopérabilité : La machine virtuelle permet d’exécuter des commandes Podman identiques à celles utilisées sur un système Linux.

Vérification de l’installation de Podman

Il suffit de lancer la commande suivante :

Terminal window
podman --version
podman version 4.9.3

Commandes de base de Podman

Comme dis plus haut, La cli de Podman est très très proche de celles de Docker. Donc ceux qui connaissent Docker peuvent passer à la section sur la gestion des Pods.

Création d’une image

La création des images est gérée par Buildah qui est intégré comme l’est BuildKit dans Docker. La commande build de Podman permet de construire des images.

Je ne vais re-documenter cette partie, car elle est déjà disponible [ici]((/docs/conteneurs/images-conteneurs/build/buildah/).

Gestion des images

Rechercher des images dans les registry

Pour trouver des images dans la plupart des registry, on utilise la commande search :

Terminal window
podman search alpine
NAME DESCRIPTION
docker.io/library/alpine A minimal Docker image based on Alpine Linux...
docker.io/alpinelinux/docker-cli Simple and lightweight Alpine Linux image wi...
docker.io/alpinelinux/alpine-gitlab-ci Build Alpine Linux packages with Gitlab CI
docker.io/alpinelinux/gitlab-runner-helper Helper image conteneur gitlab-runner-helper...
docker.io/alpinelinux/rsyncd
docker.io/alpinelinux/alpine-drone-ci Build Alpine Linux packages with drone CI
docker.io/alpinelinux/unbound...

Pour obtenir la liste des images officielles, on ajoute l’option --filter is-official :

Terminal window
podman search --filter is-official alpine
NAME DESCRIPTION
docker.io/library/alpine A minimal Docker image based on Alpine Linux...

Pour obtenir la liste des tags disponibles, on ajoute l’option --list-tags :

Terminal window
podman search --list-tags --limit 10 docker.io/library/alpine
NAME TAG
...
NAME TAG
docker.io/library/alpine 2.6
docker.io/library/alpine 2.7
docker.io/library/alpine 20190228
docker.io/library/alpine 20190408
docker.io/library/alpine 20190508
docker.io/library/alpine 20190707
docker.io/library/alpine 20190809
docker.io/library/alpine 20190925
docker.io/library/alpine 20191114
docker.io/library/alpine 20191219
...

Télécharger une image

Pour télécharger l’image Ubuntu possédant le tag 3.18.4 depuis le Docker Hub, on utilise la commande pull :

Terminal window
podman pull docker.io/library/alpine:3.18.4
Trying to pull docker.io/library/alpine:3.18.4...
Getting image source signatures
Copying blob 96526aa774ef skipped: already exists
Copying config 8ca4688f4f done
Writing manifest to image destination
8ca4688f4f356596b5ae539337c9941abc78eda10021d35cbc52659c74d9b443

Lister les images

Pour afficher toutes les images disponibles localement, on utilise la commande images :

Terminal window
podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/ubuntu jammy e4c58958181a 3 weeks ago 80.4 MB
docker.io/library/alpine 3.18 8ca4688f4f35 4 weeks ago 7.63 MB
docker.io/library/alpine 3.18.4 8ca4688f4f35 4 weeks ago 7.63 MB

Obtenir des informations sur une image

On utilisera la commande image inspect :

Terminal window
podman image inspect docker.io/library/alpine:3.18
[
{
"Id": "8ca4688f4f356596b5ae539337c9941abc78eda10021d35cbc52659c74d9b443",
"Digest": "sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978",
"RepoTags": [
"docker.io/library/alpine:3.18",
"docker.io/library/alpine:3.18.4"
],
"RepoDigests": [
"docker.io/library/alpine@sha256:48d9183eb12a05c99bcc0bf44a003607b8e941e1d4f41f9ad12bdcc4b5672f86",
"docker.io/library/alpine@sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978"
],
"Parent": "",
"Comment": "",
"Created": "2023-09-28T21:19:27.801479409Z",
"Config": {
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh"
]
},
"Version": "20.10.23",
"Author": "",
"Architecture": "amd64",
"Os": "linux",
"Size": 7629894,
"VirtualSize": 7629894,
"GraphDriver": {
"Name": "overlay",
"Data": {
"UpperDir": "/home/bob/.local/share/conteneurs/storage/overlay/cc2447e1835a40530975ab80bb1f872fbab0f2a0faecf2ab16fbbb89b3589438/diff",
"WorkDir": "/home/bob/.local/share/conteneurs/storage/overlay/cc2447e1835a40530975ab80bb1f872fbab0f2a0faecf2ab16fbbb89b3589438/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:cc2447e1835a40530975ab80bb1f872fbab0f2a0faecf2ab16fbbb89b3589438"
]
},
"Labels": null,
"Annotations": {},
"ManifestType": "application/vnd.docker.distribution.manifest.v2+json",
"User": "",
"History": [
{
"created": "2023-09-28T21:19:27.686110063Z",
"created_by": "/bin/sh -c #(nop) ADD file:756183bba9c7f4593c2b216e98e4208b9163c4c962ea0837ef88bd917609d001 in / "
},
{
"created": "2023-09-28T21:19:27.801479409Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/sh\"]",
"empty_layer": true
}
],
"NamesHistory": [
"docker.io/library/alpine:3.18.4",
"docker.io/library/alpine:3.18"
]
}
]

Détruire des images

Pour détruire les images locales, on utilise la commande rmi :

Terminal window
podman rmi docker.io/library/alpine:3.18

Gestion des conteneurs

Lancer une image de conteneur

Pour lancer par exemple une image de conteneur alpine on utilise la commande run :

Terminal window
podman run alpine:3.18.4

Il ne se passe rien, c’est normal ! Notre image ne possède pas d’instruction CMD ou ENTRYPOINT.

Lancer le conteneur en mode interactif

Pour lancer une exécution interactive, c’est-à-dire qu’on se retrouve avec l’invite de commande du conteneur, on utilise l’option -it :

Terminal window
podman run -it alpine:3.18.4 sh
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.18.4
PRETTY_NAME="Alpine Linux v3.18"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
/ # exit

Pour sortir, il suffit soit de taper la commande exit ou la séquence de touche [CTRL] + [D].

Le mode interactif est très utile dans les phases de construction des images ainsi que dans celui du DEBUG.

Lancer le conteneur en tâche de fond

Pour lancer une image de conteneur en tache de fond, il faut utiliser l’option -dt. Pour cela, nous aurons besoin d’un conteneur httpd :

Terminal window
podman search --filter is-official httpd
NAME DESCRIPTION
docker.io/library/httpd The Apache HTTP Server Project

Maintenant lançons le en exposant le port 80 :

Terminal window
podman run -dt -p 8080:80/tcp docker.io/library/httpd:2.4.58-alpine3.18

Testons :

Terminal window
curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

Ça fonctionne.

Nommer votre conteneur

Pour fixer le nom, il faut ajouter l’option --name :

Terminal window
podman run --name my-httpd -dt -p 8080:80/tcp docker.io/library/httpd:2.4.58-alpine3.18

Lister les conteneurs en cours d’exécution

Pour lister les conteneurs en cours, il faut utiliser commande ps :

Terminal window
podman ps
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92c251fdfae8 docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 12 seconds ago Up 12 seconds 0.0.0.0:8080->80/tcp my-httpd

Stopper/Démarrer un conteneur

Pour stopper un conteneur, il faut utiliser commande stop :

Terminal window
podman stop my-httpd
my-httpd

Vérifions :

Terminal window
podman ps
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Pour vérifier que notre conteneur juste stoppé, il faut utiliser l’option -a à la commande ps :

Terminal window
podman ps -a
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36d9f97def24 docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago epic_lichterman
22cb6ad44fae docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago strange_borg
9a537d03e575 docker.io/library/alpine:3.18.4 sh 2 hours ago Exited (127) 2 hours ago sad_keller
f1276c998d63 docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 19 minutes ago Exited (0) 13 minutes ago 0.0.0.0:8080->80/tcp sharp_carson
77515a5ecd1c docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 13 minutes ago Exited (0) 12 minutes ago 0.0.0.0:8080->80/tcp thirsty_kirch
92c251fdfae8 docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 8 minutes ago Exited (0) 2 minutes ago 0.0.0.0:8080->80/tcp my-httpd

Relançons le conteneur my-httpd :

Terminal window
podman start my-httpd
podman ps
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92c251fdfae8 docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 11 minutes ago Up 3 seconds 0.0.0.0:8080->80/tcp my-httpd

Afficher les logs d’un conteneur

Pour afficher les logs du conteneur, on utilise la commande logs :

Terminal window
curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>
podman logs my-httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
[Mon Oct 30 12:24:55.305997 2023] [mpm_event:notice] [pid 1:tid 140152919587656] AH00489: Apache/2.4.58 (Unix) configured -- resuming normal operations
[Mon Oct 30 12:24:55.306229 2023] [core:notice] [pid 1:tid 140152919587656] AH00094: Command line: 'httpd -D FOREGROUND'
[Mon Oct 30 12:30:28.407362 2023] [mpm_event:notice] [pid 1:tid 140152919587656] AH00492: caught SIGWINCH, shutting down gracefully
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
[Mon Oct 30 12:36:14.377993 2023] [mpm_event:notice] [pid 1:tid 139817935989576] AH00489: Apache/2.4.58 (Unix) configured -- resuming normal operations
[Mon Oct 30 12:36:14.378099 2023] [core:notice] [pid 1:tid 139817935989576] AH00094: Command line: 'httpd -D FOREGROUND'
10.0.2.100 - - [30/Oct/2023:12:40:34 +0000] "GET / HTTP/1.1" 200 45

Se connecter à un conteneur en cours d’exécution

Pour se connecter à un conteneur tournant en tache de fond :

Terminal window
podman exec -it my_httpd sh

Détruire un conteneur

Pour détruire un conteneur, il faut utiliser la commande rm :

Terminal window
podman rm my-httpd
Error: cannot remove conteneur 92c251fdfae828c9cfaefea19e3bb7f858ca146c3e06159cf33e7a7035fb7d54 as it is running - running or paused conteneurs cannot be removed without force: conteneur state improper

Cela n’a pas fonctionné, car le conteneur est en cours d’utilisation. Pour forcer la destruction, il faut ajouter l’option -f :

Terminal window
> podman rm -f my-httpd
my-httpd
>
> podman ps
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
> podman ps -a
conteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36d9f97def24 docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago epic_lichterman
22cb6ad44fae docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago strange_borg
9a537d03e575 docker.io/library/alpine:3.18.4 sh 2 hours ago Exited (127) 2 hours ago sad_keller
f1276c998d63 docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 31 minutes ago Exited (0) 25 minutes ago 0.0.0.0:8080->80/tcp sharp_carson
77515a5ecd1c docker.io/library/httpd:2.4.58-alpine3.18 httpd-foreground 25 minutes ago Exited (0) 24 minutes ago 0.0.0.0:8080->80/tcp thirsty_kirch

Faire le ménage

Attention, Podman comme Docker utilise pas mal d’espace disque. Heureusement, nous avons des commandes pour contrôler l’évolution de l’utilisation de l’espace disque. À commencer par la commande system ps.

Terminal window
podman system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 2 142.5MB 72.73MB (51%)
conteneurs 5 0 58.02kB 58.02kB (100%)
Local Volumes 0 0 0B 0B (0%)

Pour faire de la place, on utilise la commande system prune :

Terminal window
podman system prune
WARNING! This command removes:
- all stopped conteneurs
- all networks not used by at least one conteneur
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted conteneurs
22cb6ad44fae9cdbfa4a13ace7d0ceab874784daef4293238c1531e0b2e81777
36d9f97def247f6d18b01fb3febc415ac4b10ac627fdfefddd685aecfde04841
77515a5ecd1cd4108b27cab2ddc019fa50f2e424eb5d6bbd92fd89b9809eb85f
9a537d03e5757db86075431343a467d54781ffe9b61259159f80b2979e79f188
f1276c998d632a083a01f3efaa901b4da8348467f2fbe03d29bd8a2aaecea83c
Total reclaimed space: 58.02kB
podman system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 2 142.5MB 72.73MB (51%)
conteneurs 0 0 0B 0B (0%)
Local Volumes 0 0 0B 0B (0%)

Gestion des Pods sous Podman

Pour rappel, les pods sont des groupes de conteneurs qui partagent des ressources. Les pods Podman sont la fonctionnalité qui distingue Podman de Docker. Pour gérer les pods, il faut utiliser la commande podman pod.

Créer un pod

Pour créer un pod, il faut utiliser la commande create auquel on ajoute l’option --name pour le nommer :

Terminal window
podman pod create --name myFirstPod -p 8080:80
00f19ca19416163b0a0b393a8697821e5d1e6c99ead0182f62a7c01fe2290d4f

L’exposition des ports se fait au niveau du pod et non du conteneur.

Attacher un conteneur à un pod

Pour attacher un conteneur à un pod, il faut, au moment du lancement du conteneur, ajouter l’option --pod :

Terminal window
podman run --pod myFirstPod --name my-hhtpd -dt docker.io/library/httpd:2.4.58-alpine3.18

Testons :

Terminal window
curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

Cela fonctionne.

Les autres commandes

Les autres commandes sont identiques que celles utilisées pour la gestion des conteneurs.

Lister les pods

Pour lister les pods en cours, on utilise la commande ls :

Terminal window
podman pod ls
POD ID NAME STATUS CREATED INFRA ID # OF conteneurS
00f19ca19416 myFirstPod Created 37 seconds ago 990508ed24d5 1

Problèmes courants

Podman est conçu pour être exécuté sans privilèges root. Cependant, certaines configurations peuvent nécessiter des ajustements pour fonctionner correctement sans privilèges root.

Des problèmes peuvent survenir lors de la configuration des réseaux de conteneurs. Il peut être nécessaire de configurer manuellement les réseaux ou de s’assurer que certaines règles de pare-feu sont correctement configurées.

Bien que Podman soit compatible avec les commandes et les images Docker, il peut y avoir des cas où des ajustements sont nécessaires pour faire fonctionner certaines images Docker sans modifications.

Conclusion

Que de progrès depuis mon dernier test. L’utilisation de Podman sur un compte ne possédant pas les privilèges root fonctionne plutôt bien. Podman est devenu une alternative crédible à Docker.

Plus d’infos