Disponible depuis Juin 2018 dans ses premières versions, Podman, est depuis Avril 2020 dans sa version 1.9.

Avec l'arrêt du support de Docker dans Red Hat Enterprise Linux 8 et CentOS 8, la popularité de Podman est grandissante.  Un vrai pas vers l'avant pour le monde de la conteneurisation ? Est-ce que je dois remplacer mon installation Docker par Podman ?

Comme il n'est plus toujours évident de s'y retrouver dans ce florilège de technologies et de changement parfois rapides, nous allons essayer d'avoir une première approche de Podman et de son intérêt ( ou pas ) pour vous !

Tout d'abord, Podman c'est quoi ? Pourquoi un nouvel outil ? C'était vraiment nécessaire ? À quels besoins réponds t-il ?

Podman

Podman est donc un nouveau moteur de conteneur open-source qui fonctionne de manière transparente avec les conteneurs ainsi que les pods ( groupe de conteneurs déployés ensemble sur le même hôte : on retrouve ici un héritage de Kubernetes ).

Podman à une approche différente dans sa gestion des conteneurs, car il ne dépend pas en fait d'un démon. Mais lance à la place des conteneurs et des pods en tant que processus enfants. Podman est l'outil CLI ( à l'image de votre commande docker ) pour interagir avec libpod, une bibliothèque qui permet à d'autres outils de gérer des pods et des conteneurs :

https://github.com/containers/libpod

Ce nouvel outil se place très clairement en concurrent de Docker mais propose une excellente compatibilité avec l'environnement de son concurrent. Au point où il est même écrit sur le site officiel de réaliser un alias de sa commande Docker avec Podman :

$ alias docker=podman
http://docs.podman.io/en/latest/

Globalement, tout ce qui est réalisable avec Docker, peut se faire avec Podman, quelques exemples :

podman pull = docker pull

podman images = docker images

podman run = docker run

Parmi ces principaux avantages mis en avant :

  • Aucun daemon,
  • Possibilité de lancer des conteneurs sans droit administrateur,
  • Gestion des POD,
  • Respect des normes OCI,
  • Une API REST.

Mes premiers conteneurs

Je travaille essentiellement sous Debian alors... allons-y pour une installation sur cet OS. Mais sachez que la documentation est exhaustive sur les différents OS :

Podman Installation
Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System. Containers can either be run as root or in rootless mode.

Debian

# Debian 10
echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/Release.key | sudo apt-key add -

sudo apt-get update -qq
sudo apt-get -qq -y install podman

Sur mon VPS, j'ai dû activer l'option suivante :

sudo sysctl kernel.unprivileged_userns_clone=1

Firstly, a kernel is required that has support for User Namespaces (a kernel with CONFIG_USER_NS). All Arch Linux kernels have support for CONFIG_USER_NS. However, due to more general security concerns, the default Arch kernel does ship with User Namespaces enabled only for the root user.

Une fois l'installation terminée et l'option activée :

debian@my-host:~$ podman info
host:
  arch: amd64
  buildahVersion: 1.14.9
  cgroupVersion: v1
  conmon:
    package: 'conmon: /usr/libexec/podman/conmon'
    path: /usr/libexec/podman/conmon
    version: 'conmon version 2.0.16, commit: '
  cpus: 1
  distribution:
    distribution: debian
    version: "10"
    ....

Une première instance ? Allons-y :

debian@my-host:~$ podman run --rm debian /bin/echo Hello World.
Hello World.

Exactement la même commande qu'avec Docker ! Et pour lancer un simple serveur web :

debian@my-host:~$ podman run -d -p 8080:80 nginx

Et pour vérifier le bon fonctionnement :

debian@my-host:~$ curl http://127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Je lance toutes ces commandes à l'aide de mon compte non-root : Debian. Ces conteneurs sont donc rootless.  Je peux le constater avec la commande suivante :

debian@my-host:~$ ps aux
debian   16025  0.0  0.0   4644  2920 pts/0    S    07:47   0:00 /usr/bin/slirp4netns --disable-host-loopback --mtu 65520 --enable-sandbox
debian   16028  0.0  0.8 748268 35052 pts/0    Sl   07:47   0:00 containers-rootlessport
debian   16035  0.0  0.8 592608 34980 pts/0    Sl   07:47   0:00 containers-rootlessport-child
debian   16045  0.0  0.0  80108  2036 ?        Ssl  07:47   0:00 /usr/libexec/podman/conmon --api-version 1 -c b1540d6c679bdf4b47e549884a6
debian   16056  0.0  0.1  10632  5396 ?        Ss   07:47   0:00 nginx: master process nginx -g daemon off;
100100   16068  0.0  0.0  11088  2560 ?        S    07:47   0:00 nginx: worker process

Si je souhaite par exemple utiliser le port 80 de ma machine hôte sans mon compte root :

debian@my-host:~$ podman run -d -p 80:80 nginx
Error: failed to expose ports via rootlessport: "listen tcp 0.0.0.0:80: bind: permission denied\n"

Je peux bien évidemment arrêter mon conteneur à l'aide de la commande :

podman stop

et ensuite le supprimer :

podman rm mycontainer

Comme vous pouvez le constater, ces commandes sont exactement les mêmes que pour gérer vos conteneurs à l'aide de Docker !

Je ne souhaite pas rentrer plus dans le détail aujourd'hui de certaines commandes, il nous reste énormément de choses à voir autour de Podman :

  • Comment je créé un Pod ?
  • Build une image ?
  • Mes fichiers docker-compose.yaml?

Mais chacun de ces points méritent des explications approfondies et non un simple survol 😀

Alors finalement, au premier abord, Podman est-il intéressant ?


Podman est un outil très intéressant et qui promet de belles choses. Je reste très excité, voir même impatient, que le projet avance à grand pas afin de voir jusqu'où nous pourrons aller avec cet outil car il promet des choses intéressantes. Les quelles ?

  • D'un point de vue sécurité forcément, le rootless est un atout majeur pour la sécurité des infrastructures,
  • Pouvoir gérer des POD sans passer par Kubernetes,
  • Podman nous rappelle une chose essentielle  Containers ≠ Docker ...
  • Et ainsi se rappeler ceux que sont vraiment les containers ( Oui oui on parlera de runc dans un prochain article ).

Alors est-ce que je dois migrer ou essayer Podman dès maintenant ?

  • Si vous êtes un développeur, sous Windows ou MacOS encore plus, je dirais clairement : pas pour le moment. Podman est encore jeune et vous n'allez peut-être pas retrouver facilement tout vos outils favoris ( exemple Traefik : https://github.com/containous/traefik/issues/5730 ).
  • Si vous êtes un DevOps convaincu et que vous souhaitez préparer un éventuel future, essayer le très clairement. Diverses outils arrivent, où sont déjà utilisés, et il va falloir y regarder de plus près. Docker à populariser les containers et les services du Docker Hub sont encore très utilisés, mais de nombreuses sociétés comme RedHat ( avec Buildah par exemple ) ou encore Google avec Kaniko souhaitent promouvoir d'autres outils pour travailler avec les conteneurs.

Mais attention, avec deux jours de retard, n'oublions pas le précèdent que nous offre encore très récemment CoreOS. Un super projet dont la mise à l'arrêt est un peu rapide ( pour rappel l'annonce de la fin du support était lancé en février de cette année ... ) :

CoreOS
CoreOS Container Linux will no longer receive updates after May 26, 2020.

De mon côté je vais forcément l'essayer, et même m'amuser avec ! Mais tout en gardant - pour l'instant - l'essentiel de mes conteneurs avec Docker.

Pour ceux qui souhaitent aller plus loin immédiatement, voici quelques liens utiles :

  • podman-compose pour remplacer docker-compose : https://github.com/containers/podman-compose
  • Podman sur MacOS c'est possible : https://developers.redhat.com/blog/2020/02/12/podman-for-macos-sort-of/
  • La v2 de Podman est la nouvelle API que j'attends impatiement : https://podman.io/blogs/2020/04/16/podman-v2-announce.html
  • Skopeo dont je parlerais bientôt : https://github.com/containers/skopeo
  • Buildah pour constuire ses images au format OCI : https://buildah.io/

En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter  ou via les commentaires ! C'est toujours un plaisir d'avoir des retours ! 😇