Podman le moteur de conteneur alternatif à Docker
Mise à jour :
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.
Aspect | Docker | Podman |
---|---|---|
Architecture | Client-serveur avec démon (dockerd) | Sans démon (daemonless) |
Sécurité | Privilèges root nécessaires | Exécution rootless par défaut |
Gestion des conteneurs | Via le démon Docker | Conteneurs OCI directement |
Support des Pods | Non | Oui, nativement |
Syntaxe des commandes | docker <commande> | podman <commande> (compatible Docker) |
Intégration Kubernetes | Outils supplémentaires nécessaires | Intégration native via Podman Play |
Performances | Surcharge possible due au démon | Plus léger sans démon central |
Migration | Alias, compatibilité Dockerfiles, registres | Alias, 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 :
-
Ubuntu/Debian :
Terminal window sudo apt updatesudo apt install -y podman -
Fedora (la distribution native de Podman, toujours à jour) :
Terminal window sudo dnf install -y podman -
CentOS/RHEL : Activez le dépôt extras ou EPEL (selon la version) :
Terminal window sudo yum install -y epel-releasesudo yum install -y podman -
Arch Linux : Podman est disponible dans les dépôts communautaires :
Terminal window sudo pacman -S podman -
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 :
- Un noyau Linux pour assurer la compatibilité avec les conteneurs.
- 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
-
Installer Podman viaHomebrew :
Terminal window brew install podman -
Créer une VM Linux avec Podman Machine :
Terminal window podman machine initCela initialise une machine virtuelle basée sur une distribution Linux légère.
-
Démarrer la machine virtuelle :
Terminal window podman machine start -
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 --versionpodman machine listVous devriez voir une sortie similaire à :
Terminal window NAME STATE LAST UP CPUS MEMORY DISKpodman-machine-default running ... 1 2048 MB 10.0 GB -
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
-
Installer Podman Desktop : Téléchargez Podman Desktop depuis le site officiel ↗. Ce logiciel facilite l’installation et l’utilisation de Podman sur Windows.
-
Configurer la machine virtuelle : Une fois installé, utilisez Podman Machine pour créer et démarrer une VM Linux :
Terminal window podman machine initpodman machine start -
Vérifier la configuration : Vérifiez que Podman est opérationnel et que la machine virtuelle fonctionne :
Terminal window podman --versionpodman machine list -
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 :
podman --versionpodman 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
:
podman search alpineNAME DESCRIPTIONdocker.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 CIdocker.io/alpinelinux/gitlab-runner-helper Helper image conteneur gitlab-runner-helper...docker.io/alpinelinux/rsyncddocker.io/alpinelinux/alpine-drone-ci Build Alpine Linux packages with drone CIdocker.io/alpinelinux/unbound...
Pour obtenir la liste des images officielles, on ajoute l’option --filter is-official
:
podman search --filter is-official alpineNAME DESCRIPTIONdocker.io/library/alpine A minimal Docker image based on Alpine Linux...
Pour obtenir la liste des tags disponibles, on ajoute l’option --list-tags
:
podman search --list-tags --limit 10 docker.io/library/alpineNAME TAG...NAME TAGdocker.io/library/alpine 2.6docker.io/library/alpine 2.7docker.io/library/alpine 20190228docker.io/library/alpine 20190408docker.io/library/alpine 20190508docker.io/library/alpine 20190707docker.io/library/alpine 20190809docker.io/library/alpine 20190925docker.io/library/alpine 20191114docker.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
:
podman pull docker.io/library/alpine:3.18.4Trying to pull docker.io/library/alpine:3.18.4...Getting image source signaturesCopying blob 96526aa774ef skipped: already existsCopying config 8ca4688f4f doneWriting manifest to image destination8ca4688f4f356596b5ae539337c9941abc78eda10021d35cbc52659c74d9b443
Lister les images
Pour afficher toutes les images disponibles localement, on utilise la commande
images
:
podman imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/library/ubuntu jammy e4c58958181a 3 weeks ago 80.4 MBdocker.io/library/alpine 3.18 8ca4688f4f35 4 weeks ago 7.63 MBdocker.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
:
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
:
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
:
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
:
podman run -it alpine:3.18.4 sh/ # cat /etc/os-releaseNAME="Alpine Linux"ID=alpineVERSION_ID=3.18.4PRETTY_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
:
podman search --filter is-official httpdNAME DESCRIPTIONdocker.io/library/httpd The Apache HTTP Server Project
Maintenant lançons le en exposant le port 80 :
podman run -dt -p 8080:80/tcp docker.io/library/httpd:2.4.58-alpine3.18
Testons :
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
:
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
:
podman psconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES92c251fdfae8 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
:
podman stop my-httpdmy-httpd
Vérifions :
podman psconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Pour vérifier que notre conteneur juste stoppé, il faut utiliser l’option -a
à
la commande ps
:
podman ps -aconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES36d9f97def24 docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago epic_lichterman22cb6ad44fae docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago strange_borg9a537d03e575 docker.io/library/alpine:3.18.4 sh 2 hours ago Exited (127) 2 hours ago sad_kellerf1276c998d63 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_carson77515a5ecd1c 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_kirch92c251fdfae8 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
:
podman start my-httpdpodman psconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES92c251fdfae8 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
:
curl http://localhost:8080<html><body><h1>It works!</h1></body></html>
podman logs my-httpdAH00558: 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 messageAH00558: 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 gracefullyAH00558: 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 messageAH00558: 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 :
podman exec -it my_httpd sh
Détruire un conteneur
Pour détruire un conteneur, il faut utiliser la commande rm
:
podman rm my-httpdError: 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
:
> podman rm -f my-httpdmy-httpd>> podman psconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES> podman ps -aconteneur ID IMAGE COMMAND CREATED STATUS PORTS NAMES36d9f97def24 docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago epic_lichterman22cb6ad44fae docker.io/library/alpine:3.18.4 /bin/sh 2 hours ago Exited (0) 2 hours ago strange_borg9a537d03e575 docker.io/library/alpine:3.18.4 sh 2 hours ago Exited (127) 2 hours ago sad_kellerf1276c998d63 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_carson77515a5ecd1c 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
.
podman system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 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
:
podman system pruneWARNING! 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] yDeleted conteneurs22cb6ad44fae9cdbfa4a13ace7d0ceab874784daef4293238c1531e0b2e8177736d9f97def247f6d18b01fb3febc415ac4b10ac627fdfefddd685aecfde0484177515a5ecd1cd4108b27cab2ddc019fa50f2e424eb5d6bbd92fd89b9809eb85f9a537d03e5757db86075431343a467d54781ffe9b61259159f80b2979e79f188f1276c998d632a083a01f3efaa901b4da8348467f2fbe03d29bd8a2aaecea83cTotal reclaimed space: 58.02kBpodman system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 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 :
podman pod create --name myFirstPod -p 8080:8000f19ca19416163b0a0b393a8697821e5d1e6c99ead0182f62a7c01fe2290d4f
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
:
podman run --pod myFirstPod --name my-hhtpd -dt docker.io/library/httpd:2.4.58-alpine3.18
Testons :
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
:
podman pod lsPOD ID NAME STATUS CREATED INFRA ID # OF conteneurS00f19ca19416 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.