K-7.ch

I'll be back

Podman, un moteur de conteneur "deamon less"


Loqo de Podman

Aujourd’hui, un petit article pour vous présenter un petit logiciel dont je suis devenu fan : Podman.

Podman est un moteur de conteneur. Il permet de gérer des conteneurs ainsi que les images desquels ils sont lancés. Il se place en concurrent de Docker tout en proposant une grande compatibilité avec ce celui-ci.

Podman propose plusieurs avantages par rapport à Docker:

  • Root less
  • Deamon Less
  • Support des images Docker et OCI
  • API de la ligne de commande très proche de celle de Docker
  • Support du mécanisme de POD
  • Importation et exportation de la déclaration POD au format Kubernetes
  • Accès à distance en via le protocole varlink

Nous allons regarder un peu plus en détail certains de ces points.

Root less

Contrairement à Docker, Podman peut tourner avec des droits utilisateurs. Pas besoin d’être root.

En mode utilisateur, seul la partie réseau est plus limitée : les conteneurs n’ont pas d’adresse IP dédiée dans ce cas. Sinon, les autres fonctionnalités sont supportées, que ce soit les volumes, les redirections de ports, etc.

Un processus peut être considéré comme root à l’intérieur d’un conteneur, mais simple utilisateur de point de vue de l’hôte. Cela règle plusieurs problèmes de sécurités qu’on peut rencontrer avec Docker.

Deamon Less

Docker est construit autour d’un daemon qui s’occupe de tout :

  • Construire les images
  • Télécharger les images
  • Lancer et gérer les conteneurs
  • Gérer les images locales

La commande docker n’est au finale qu’un client qui se connecte au daemon pour permettre à l’utilisateur de le contrôler.

Podamn est conçu différemment : Il s’agit d’un outil en ligne de commande qui délègue son travail à d’autre logiciel et qui s’arrête quand il a terminé. Dès qu’on a lancé un conteneur, Podman s’arrête. Dès qu’on a fini de construire une image, Podman s’arrête. Et il ne se charge pas lui-même d’effectuer le travail. Quand on construit une image avec Podman, Podman fait appelle à Buildha (un outil de construction de conteneur). Quand on lance un conteneur, Podman fait appelle à Runc (Un gestionnaire de conteneur).

Support des images Docker et OCI

Pour exécuter des conteneurs, Podman support 2 format d’images :

  • Le format Docker
  • Le format OCI

Ainsi, avec Podman, il est parfaitement possible d’exécuter des conteneurs à partir d’une image construite avec Docker.

C’est pareil dans l’autre sens : Podman peut construire des images au format Docker ou OCI. Ainsi, des images construites avec Podman peuvent être utilisé avec Docker.

De plus, podman support l’API des registres Docker. On peut rechercher et télécharger des images directement depuis le Docker Hub.

API de la ligne de commande très proche de celle de Docker

Que ce soit pour lancer un conteneur, télécharger ou construire une image, les options et paramètres de la commande podman sont très similaires à ceux de la commande docker.

Par exemple, pour lancer un conteneur basé sur l’image de Fedora, voici la commande avec Docker:

docker run -it --rm fedora:latest bash

Et voici la même action avec la commande équivalente pour Podman:

podman run -it --rm fedora:latest bash

À tel point qu’on peut créer l’alias suivante :

alias docker=podman

Support du mécanisme de POD

Un concept que Podman propose, à la différence de Docker, est le système de POD.

Un pod est un groupe de conteneurs pouvant être gérés comme un tout. Il est constitué :

  • Du ou des conteneurs du POD
  • D’un conteneur de gestion, qui s’occupe de stopper ou redémarrer le POD
  • D’un localhost partagé par tous les conteneurs du POD
  • D’un namespace partagé par tous les conteneurs du POD

Chacun des conteneurs d’un POD peuvent avoir leurs volumes mais la publication des ports vers l’hôte se définit au niveau du POD (quand il y en a un).

Le système de POD proposé par Podman est très similaire à celui proposé par Kubernetes.

Petite précision : Un conteneur, avec Podman, n’est pas obligé d’appartenir à un POD. Les POD sont là pour simplifier la création d’un service reposant sur plusieurs conteneurs. Par exemple un site web et sa base de donnée.

Importation et exportation des POD au format Kubernetes

Étant donné que Podman supporte un système de POD très similaire à Kubernetes, il est possible d’exporter la configuration d’un POD dans un format supporter par Kubernetes. Il est également possible d’importer la configuration d’un POD destiné à Kuberetes.

C’est très pratique pour les développeu·rs·ses qui souhaitent tester localement un POD avant de le déployer sur une infrastructure Kubernetes. Podman permet de le faire sans avoir besoin d’installer et de configurer un cluster Kubernetes chez soi.

Installer Podman

Podman est directement disponible dans les dépôts officiels d’un grand nombre de distributions :

  • Fedora
  • CentOS
  • openSUSE
  • Arch Linux
  • Manjaro Linux

Il n’est, hélas, pas encore sur les dépôts de Debian. Mais le Kubic project propose des dépôts pour Debian 10.

Pour plus d’information sur comment installer Podman, je vous renvoie sur la documentation officiel.

Lancement d’un conteneur

Une fois installé, on peut lancer un conteneur avec la commande suivante :

podman run -it fedora:latest /bin/bash

Cette commande, podman run, lance un conteneur basé sur l’image indiquée. Ici, l’image est fedora. Plus précisément, la version ayant le tag latest. Si l’image n’est pas déjà présente localement, elle sera téléchargée. Les drapeaux -i et -t, respectivement, gardent le STDIN ouvert et créent un pseudo TTY. Le dernier argument est le programme qu’on exécute dans le conteneur, ici bash. À noter que podman donnera un nom, choisi au hasard, à notre conteneur. Pour spécifier un nom manuellement, on peut ajouter le drapeau --name= à notre commande run. Pour plus d’infos sur le lancement de conteneur, je vous invite à lire la page de manuel podman-run(1).

Il est possible de récupérer une image à l’avance avec la commande suivante :

podman pull debian:latest

Dans cet exemple, nous téléchargeons l’image de Debian à sa dernière version. Pour plus d’informations sur la récupération d’images, je vous invite à lire la page de manuel podman-pull(1).

Pour rechercher une image, il faut utiliser la commande suivante :

podman search traefik

Dans cet exemple, nous recherchons une image pour le logiciel Traefik. Pour plus d’information sur la recherche d’image, je vous renvoie à la page de manuel podman-search(1).

Construction de conteneur

Il est possible de construire une image à partir d’un Dockerfile avec la commande suivante :

podman build . -t mon-image:version

Ici, la commande podman build est suivit du chemin vers un dossier contenant un Dockerfile ainsi que du drapeau -t permettant d’ajouter un tag à notre image. On utilise ce tag pour indiquer le nom et la version de l’image. Pour plus d’infos sur la construction de conteneur, je vous invite à lire la page de manuel podman-build(1).

L’image qu’on a construite peut être utilisée pour lancer un conteneur, mais elle peut également être publiée sur un registre. Pour cela, nous pouvons utiliser cette commande :

podman push imageID docker://registry.example.com/repository:tag

Dans cet exemple, imageID correspond à l’identifiant de l’image que nous souhaitons pousser et docker://registry.example.com/repository:tag indique le registre de destination ainsi que le tag auquel sera publié notre image.

Pour plus d’informations sur comment publier une image, je vous invite à lire la page de manuel podman-push(1).

Il est également possible d’exporter et d’importer des images. Cela peut servir à construire une image sur son ordinateur avant de la déployer sur son serveur sans devoir utiliser de registre.

Pour exporter une image, nous pouvons utiliser cette commande :

podman export -o my_image.tar imageID:version

L’option -o indique le nom du fichier vers lequel exporter. Si on se spécifie pas cette option, l’image sera exportée sur la sortie standard de la commande. Le paramètre imageID:version correspond à l’identifiant de l’image et de la version que vous souhaitez exporter.

L’importation se fait avec la commande suivante :

podman import my_image.tar

Pour plus d’information sur l’importation et l’exportation d’image, je vous invite à lire les pages de manuel respectifs podman-export(1) et podman-import(1).

Intégration avec Systemd

Afin de faciliter l’intégration avec Systemd, Podman propose de générer un fichier d’unité Systemd de type service permettant de contrôler un conteneur.

Pour générer le fichier .service, lancez la commande suivante :

podman generate systemd mystifying_sanderson

Avec cette ligne de commande, Podman sortira sur sa sortie standard le contenu d’un fichier d’unité Systemd. Il suffit de rediriger le texte vers un fichier .service et de passer le dit fichier à Systemd.

POD

Pour créer un POD avec Podman, nous pouvons lancer la commande suivante :

podman pod create --name=podID

Remplacez podID par le nom de votre pod.

Une fois le POD créé, nous pouvons créer des conteneurs et le attacher au POD. Pour cela, ajoutez l’option --pod suivit de nom de votre POD à votre commande de création de conteneur.

Par exemple :

podman run --pod podID -it fedora:latest /bin/bash

Toutes les commandes de gestion des PODs commencent par podman pod:

  • podman pod ls: Liste les PODs
  • podman pod stop podID: Stoppe le POD correspondant au podID
  • etc

Pour plus d’infos sur les PODs, je vous invite à lire la page de manuel podman-pod(1) ainsi que les pages correspondantes aux commandes de gestion des PODs.

Exportation d’un POD pour Kubernetes

Il est possible de générer un fichier de déclaration de POD pour Kubernetes à partir de Podman et d’un POD existant. Pour cela, vous pouvez exécuter la commande suivante :

sudo podman generate kube -f mypod.yml podID

Remplacez mypod.yml par le nom du fichier que vous souhaitez et podID par l’identifiant du POD de votre choix. Vous obtenez un fichier au format YAML que vous pouvez utiliser pour déployer votre POD sur une infrastructure Kubernetes.

Vous pouvez également créer un POD à partir d’un fichier YAML décrivant un POD dans un format destiné à Kubrenetes. Pour ça, exécutez la commande suivante :

podman paly kube mypod.yml

mypod.yml correspondant à votre fichier déclarant le POD.

Pour plus d’information, je vous invite à lire les page de manuel pour podman-generate-kube(1) et podman-play-kube(1).

Aller plus loin

Podman est un excellent outil que j’utilise quotidiennement à la place de Docker. Si vous souhaitez en savoir plus, je vous invite à lire :

Je vous conseille également quelques outils pour accompagner Podman :

  • Podman Compose: Un équivalent à Docker Compose pour Podman
  • Skopeo: Un outil de gestion d’image et d’exploration de registres

Voilà, nous arrivons à la fin de l’article. Qui n’était pas si petit que cela.