Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 1410 minIntermédiaire

Podman, LXC et Kubernetes : les alternatives à Docker

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • faire tourner une image avec Podman, sans démon ni root ;
  • gérer un conteneur comme un service systemd avec Quadlet ;
  • distinguer conteneur d'application et conteneur système ;
  • choisir entre Podman et Docker, et entre podman-compose et docker compose ;
  • dire quand un orchestrateur comme Kubernetes devient utile.

3 exercices corrigés

Docker n'est pas le seul outil de conteneurs : Podman fait tourner les mêmes images sans démon et sans root, LXC fournit des conteneurs système qui se comportent comme de petites machines, et Kubernetes orchestre des conteneurs sur plusieurs serveurs. Ce chapitre présente chacun, avec ses commandes de base et ses cas d'usage, pour que tu saches choisir et justifier ton choix.

Le standard OCI : les images sont interchangeables

Les formats d'image et d'exécution sont normalisés par l'OCI (Open Container Initiative). Une image construite par docker build se lance avec Podman, avec Kubernetes, avec containerd, ou en conteneur d'application sur Proxmox VE 9. Changer d'outil ne demande donc pas de reconstruire les images ; seules les commandes et la façon de les gérer changent.

Podman : sans démon et sans root

Podman, développé par Red Hat, reprend presque toutes les commandes de Docker, avec deux différences de conception :

  • pas de démon : chaque commande podman lance le conteneur directement, comme un processus enfant ; il n'y a pas de service root permanent, ni de socket qui donne les pleins pouvoirs ;
  • sans root par défaut : un utilisateur ordinaire lance ses conteneurs dans son propre espace de noms utilisateur, comme le mode rootless de Docker, mais sans rien configurer.

Sur Debian 13, Podman (version 5.4) s'installe depuis les dépôts de la distribution :

bash
sudo apt install podman
podman run --rm docker.io/library/alpine:3.24 cat /etc/os-release

Les commandes sont les mêmes : podman ps, podman logs, podman exec, podman build, podman volume, podman network. Le paquet podman-docker ajoute même une commande docker qui appelle Podman.

Les pods. Podman sait regrouper plusieurs conteneurs dans un pod qui partage le même réseau (ils se joignent par localhost), comme Kubernetes :

bash
podman pod create --name gestion -p 8080:8080
podman run -d --pod gestion --name front ghcr.io/sorbier/sorbier-frais-front:2.4.0

Compose. La commande podman compose lit un compose.yaml en s'appuyant sur un outil Compose installé à côté (docker-compose ou podman-compose). Podman peut aussi exposer une API compatible avec celle de Docker (systemctl --user enable --now podman.socket), que les outils prévus pour Docker utilisent sans le savoir.

Quadlet : des conteneurs gérés par systemd. Sans démon, qui relance les conteneurs au démarrage du serveur ? systemd. Avec Quadlet, on décrit un conteneur dans un petit fichier, et systemd en fait un service :

text
# ~/.config/containers/systemd/wiki.container
[Unit]
Description=Wiki interne

[Container]
Image=docker.io/library/nginx:1.30-alpine
PublishPort=127.0.0.1:8081:80
Volume=wiki-pages:/usr/share/nginx/html

[Service]
Restart=always

[Install]
WantedBy=default.target
bash
systemctl --user daemon-reload
systemctl --user start wiki.service
systemctl --user status wiki.service

Le conteneur se gère alors comme n'importe quel service : journalctl --user -u wiki, démarrage automatique, dépendances. Pour qu'il démarre sans session ouverte, active loginctl enable-linger pour l'utilisateur, comme pour Docker rootless.

Podman ou Docker : le comparatif

CritèreDockerPodman
ArchitectureUn démon dockerd, en root, et un socket qui le pilotePas de démon : chaque conteneur est un processus lancé par la commande
Sans rootPossible (mode rootless), à configurerPar défaut pour un utilisateur ordinaire
Commandesdocker run, docker build…Les mêmes, préfixées par podman
Composedocker compose, intégré et completpodman compose, qui délègue à un outil installé à côté
Démarrage automatiquePolitique restart: gérée par le démonsystemd, avec les fichiers Quadlet
Pods (plusieurs conteneurs, un réseau)NonOui, et export ou import de fichiers Kubernetes (podman kube generate, podman kube play)
Application de bureauDocker Desktop, payant au-delà de 250 salariés ou 10 millions de dollars de chiffre d'affairesPodman Desktop, libre et gratuit
ÉcosystèmeLe plus large : tutoriels, outils, intégrations CI, Docker HubImages identiques (OCI), outils un peu moins nombreux

Lequel choisir ? Pour une application de plusieurs services décrite dans un compose.yaml, déployée par une équipe qui connaît Docker, Docker Engine reste le plus simple : tout est intégré et documenté. Podman se justifie quand la sécurité prime (pas de démon root ni de socket à protéger), sur les distributions Red Hat où il est l'outil fourni, ou pour des services isolés gérés par systemd. Au BTS, savoir argumenter ce choix compte plus que l'outil retenu.

podman-compose ou docker compose ? podman-compose est une réécriture en Python de Compose, disponible dans les dépôts de Debian (sudo apt install podman-compose) : il lance les services directement avec Podman et suffit pour un fichier simple, mais il ne prend pas en charge toute la spécification Compose. Pour un fichier riche (conditions depends_on, profils, secrets…), la solution la plus fidèle consiste à activer l'API compatible de Podman (systemctl --user enable --now podman.socket) et à y brancher le vrai Compose de Docker, en indiquant le socket dans DOCKER_HOST (unix://$XDG_RUNTIME_DIR/podman/podman.sock). Dans les deux cas, podman compose choisit lui-même l'outil installé.

LXC et Incus : des conteneurs système

Docker et Podman font tourner des conteneurs d'application : un processus principal, une application. LXC fait tourner des conteneurs système : un système Linux complet, avec son init (systemd), ses services, ses comptes, qu'on administre comme une petite VM, mais qui partage le noyau de l'hôte. Ce sont les CT de Proxmox VE. Incus, issu de LXD, ajoute une gestion confortable des conteneurs système et des VM, en ligne de commande et par une API.

Conteneur d'application (Docker, Podman)Conteneur système (LXC, Incus, CT Proxmox)
ContenuUne application et ses dépendancesUn système complet avec init et services
Mise à jourOn remplace l'imageOn met à jour les paquets à l'intérieur (apt upgrade)
Durée de vieJetable, recréé souventDurable, comme un serveur
UsageLivrer et faire tourner une applicationHéberger un service « à l'ancienne » avec moins de ressources qu'une VM

Kubernetes et Docker Swarm : orchestrer plusieurs serveurs

Docker et Compose gèrent les conteneurs d'un seul hôte. Quand une application doit tourner sur plusieurs serveurs, survivre à la panne de l'un d'eux, s'étendre automatiquement selon la charge et se mettre à jour sans coupure, il faut un orchestrateur :

OrchestrateurPrincipeQuand
Docker SwarmIntégré à Docker : docker swarm init, puis docker stack deploy -c compose.yaml gestion déploie un fichier Compose sur un groupe de serveursPetites grappes de serveurs, équipes qui connaissent déjà Compose
KubernetesLe standard du marché : on décrit l'état voulu (Deployments, Services, Ingress) en YAML, et le cluster le maintient en permanence ; des distributions légères comme K3s existentGrandes plateformes, cloud, nombreuses équipes

Pour une PME comme Sorbier, avec quelques applications internes, Compose sur une VM bien sauvegardée suffit largement ; la disponibilité vient de Proxmox (redémarrage de la VM sur un autre nœud). Kubernetes apporte beaucoup, mais demande des compétences et une exploitation à la hauteur : c'est un projet en soi.

Choisir

BesoinOutil
Faire tourner une application de plusieurs services sur un serveurDocker Engine et Compose
Même chose, sans démon root, avec des services systemdPodman et Quadlet
Développer sur son poste Windows ou macOSDocker Desktop, ou Podman Desktop
Héberger un service classique de façon légère sur ProxmoxUn CT LXC
Plusieurs serveurs, haute disponibilité au niveau des conteneursKubernetes, ou Swarm pour rester simple

Exercices

Exercice 1 sur 3 Docker ou Podman ? Réussi À revoir

Le responsable sécurité d'un client refuse « tout démon qui tourne en root » sur ses serveurs Debian 13. L'application à déployer est livrée sous forme d'images OCI. Que proposes-tu, et que deviennent les commandes de l'équipe ?

Voir la réponseMasquer la réponse de l'exercice 1

Podman, installé depuis les dépôts Debian, utilisé sans root sous un compte de service dédié : pas de démon, pas de socket root, et les images OCI fonctionnent telles quelles. Les conteneurs sont déclarés en fichiers Quadlet et gérés par systemd (systemctl --user), avec loginctl enable-linger pour le démarrage automatique.

Les commandes changent peu : podman à la place de docker, avec les noms d'images complets ; podman compose peut reprendre un compose.yaml existant. Docker en mode rootless serait une autre réponse acceptable.

Tu avais trouvé ?

Exercice 2 sur 3 Conteneur d'application ou conteneur système ? Réussi À revoir

Classe chaque situation : conteneur d'application (Docker, Podman) ou conteneur système (LXC).

  1. Un serveur Samba que l'équipe administre avec apt, systemctl et ses habitudes de serveur Linux.
  2. L'API sorbier-frais, mise à jour chaque semaine par la CI.
  3. Une instance de Grafana à remplacer par la nouvelle version en une commande.
Voir la réponseMasquer la réponse de l'exercice 2
  1. Conteneur système (CT LXC) : l'équipe veut un « petit serveur » complet, administré comme les autres.
  2. Conteneur d'application : chaque version est une image, remplacée et revenue en arrière en une commande.
  3. Conteneur d'application : l'image officielle de Grafana, avec ses données dans un volume, se met à jour en changeant d'étiquette.

Tu avais trouvé ?

Exercice 3 sur 3 Faut-il Kubernetes ? Réussi À revoir

Un stagiaire propose de migrer les trois applications internes de Sorbier, qui tournent sur srv-gestion avec Compose, vers un cluster Kubernetes de trois nœuds « pour la haute disponibilité ». Donne deux arguments pour et trois arguments contre, puis ta recommandation.

Voir la réponseMasquer la réponse de l'exercice 3

Pour : un nœud en panne n'arrête pas les applications (les conteneurs repartent sur les autres) ; les mises à jour se font sans coupure, progressivement.

Contre : la complexité (réseau, stockage partagé, certificats, mises à jour du cluster) demande des compétences que l'équipe de trois personnes n'a pas ; il faut au moins trois serveurs de plus à maintenir et à sécuriser ; le besoin est déjà en partie couvert par Proxmox, qui peut redémarrer la VM srv-gestion sur un autre nœud en cas de panne.

Recommandation : garder Compose sur une VM, et améliorer la disponibilité avec les outils existants (haute disponibilité de Proxmox, sauvegardes testées, supervision). Kubernetes deviendra pertinent si le nombre d'applications et les exigences de disponibilité augmentent fortement.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Exercices corrigés Docker type BTS SIORevoir le sommaire du cours