- Docker a longtemps été critiqué pour des problèmes de failles de sécurité et de consommation de ressources liés à son architecture à démon en arrière-plan (
dockerd)
- Podman adopte une architecture sans démon, ce qui permet aux conteneurs de s’exécuter directement avec les permissions de l’utilisateur, réduisant la surface d’attaque et renforçant la stabilité
- Grâce à l’intégration avec systemd, à une conception pensée pour Kubernetes et à la prise en charge d’outils séparés fondés sur la philosophie Unix comme Buildah/Skopeo, l’exploitation gagne en efficacité
- La compatibilité élevée avec la CLI Docker permet à la plupart des workflows existants de fonctionner tels quels avec un simple
alias docker=podman
- Même en production, la sécurité et la gestion des ressources deviennent plus simples, et pour les nouveaux projets, Podman s’impose comme une option plus rationnelle et tournée vers l’avenir
Les limites de Docker et les problèmes de sécurité
- Docker repose sur une architecture où le démon
dockerd s’exécute en permanence avec les privilèges root
- Si une faille du démon est découverte, l’ensemble de l’hôte peut être exposé
- Exemples marquants d’incidents de sécurité
- 2019 : évasion de conteneur runC (CVE-2019-5736)
- 2022 : faille Linux Dirty Pipe, évasion via cgroups v1
- 2024 : runC « Leaky Vessels », faille BuildKit
- 2024 : campagne de cryptojacking via exposition de l’API Docker
- La répétition de ces incidents a mis en lumière le risque fondamental d’une architecture basée sur un démon
L’architecture daemonless de Podman
- Podman n’utilise pas de démon en arrière-plan
- Lors de l’exécution de
podman run, le conteneur fonctionne comme processus enfant direct de la commande lancée
- En mode rootless, même les privilèges root à l’intérieur du conteneur ne correspondent, sur l’hôte, qu’aux droits d’un utilisateur ordinaire
- Avantages
- Sécurité renforcée : en cas d’évasion de conteneur, l’étendue des dégâts est réduite
- Stabilité accrue : si un conteneur s’arrête, les autres ne sont pas affectés
- Efficacité des ressources : l’absence de démon résident réduit l’usage mémoire
Les fonctionnalités distinctives de Podman
- Intégration avec systemd
podman generate systemd permet de générer automatiquement un fichier d’unité systemd
- Les services peuvent être gérés avec les commandes standard
systemctl
- Affinité avec Kubernetes
- La notion de Pod est intégrée nativement, ce qui facilite le développement d’applications multi-conteneurs
podman generate kube permet de générer directement du YAML Kubernetes
- Philosophie Unix
- Podman se concentre sur l’exécution des conteneurs, tandis que la construction d’images est assurée par Buildah et la gestion des registres par Skopeo
- Il est ainsi possible d’utiliser des outils optimisés selon leur objectif
Migration et compatibilité
- Le passage de Docker à Podman se fait presque sans interruption
- La CLI étant compatible, on peut généralement remplacer
docker par podman tel quel
- Les Dockerfile existants continuent de fonctionner sans modification
- Différences à connaître
- En mode rootless, il est impossible de binder des ports inférieurs à 1024 → un reverse proxy est recommandé
- Il faut gérer les permissions des volumes
- Les outils dépendant du socket Docker peuvent utiliser le mode de compatibilité API Docker de Podman
Mise en pratique et bénéfices
- Après adoption de Podman en environnement de production
- La charge liée aux contrôles de sécurité diminue, avec une sécurité rootless appliquée par défaut
- Les schémas d’utilisation des ressources deviennent plus simples et plus prévisibles
- Docker reste très répandu, mais pour les nouveaux projets ou lorsqu’on a de la latitude dans ses choix techniques, Podman est plus adapté
- Intégration naturelle avec les mécanismes d’administration Linux
- Architecture orientée Kubernetes
- Fournit un environnement d’exécution de conteneurs plus sûr et plus rationnel
Résumé du guide de migration FastAPI
- Les Dockerfile existants peuvent être utilisés tels quels
- Remplacement simple avec
podman build et podman run
- Enregistrement comme service systemd avec
podman generate systemd
- Les Pods permettent de prendre en charge des environnements multi-services comme les bases de données
- Le workflow Docker Compose peut être géré avec
podman-compose ou via une conversion avec kompose
8 commentaires
Ici, il est écrit qu’une transition sans interruption de service est possible, mais dans un environnement de production réel, il y a pas mal de bizarreries. Par exemple, sur macOS, comme la configuration par défaut utilise la compression
zstd, l’image construite a tendance à occuper pas mal d’espace dans le registre...Docker, Podman, tout pareil....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
En réalité, la compatibilité avec Docker n’est pas si bonne, donc l’ergonomie n’est pas terrible…
Je suis passé à Podman en pensant au mode rootless, puis je suis finalement revenu à Docker.
Comme l’a dit quelqu’un d’autre, si c’est pour l’utiliser avec Kubernetes, autant utiliser directement
containerd.Je me demande si, puisque Docker Compose ne fonctionne pas bien et que l’avantage mis en avant est une bonne compatibilité avec Kubernetes, il ne vaudrait pas mieux utiliser directement Kubernetes.
J’ai aussi essayé de l’utiliser, mais comme ça ne fonctionnait pas d’un coup et qu’on ne peut pas non plus faire soi-même le mapping des ports inférieurs à 1024, j’utilise finalement une combinaison de k3s et de nerdctl pour construire les images.
J’avais envie de faire le changement depuis un moment, mais quand j’ai essayé auparavant, contrairement à ce que disaient les développeurs, beaucoup trop de projets
docker composene fonctionnaient tout simplement pas correctement...Docker ne prend même pas en charge le réseau.
Je crois savoir que, comme Docker, il prend aussi en charge les fonctionnalités réseau.
Y a-t-il encore des points qui ne fonctionnent pas correctement ?
Avis Hacker News
chrootet de jail. Mon code de déploiement exécutait le logiciel hors de l’environnement jail et surveillait, viaptrace, les fichiers ouverts par le processus. À partir de cette sortie, j’extrayais une liste de dépendances pour en faire un paquet. Au final, le déploiement était petit, immuable et plus sûr. Quand Docker est arrivé, ça m’a rappelé cette ancienne méthode, et je me suis demandé s’il existait un outil similaire qui surveille réellement l’usage des fichiers d’un conteneur Docker pour réduire la distributiongit push live masterpour déployer. J’ai beaucoup utilisé Docker, mais c’était malgré tout le déploiement le plus simple. Je vois bien les avantages de Docker, mais configurer du HTTP sur Ubuntu ou OpenBSD n’est pas si difficile. Je me demande si la reproductibilité propre à Docker vaut vraiment toute cette surcharge de gestionLien vers le code concerné
--connectionpour cibler l’environnement voulu. Si besoin, Podman peut même créer automatiquement une VM pour toi (via lima). Podman Desktop propose aussi une couche de compatibilité Docker qui atténue les problèmes de compatibilitépodman generate systemdmentionnée dans l’article est désormais deprecated. L’alternative, ce sont les Podman Quadlets, qui fonctionnent un peu comme undocker-compose.yamldéfini à l’intérieur d’un fichier d’unité systemd/devnécessaires et d’exposer un programme très limité sur un réseau isoléici,
ici,
ici