hmichael@tronyxworld.be:~$

Docker / Podman & Moby sous Fedora 32

Avec la sortie de Fedora 32 beaucoup d’utilisateurs se sont retrouvés dans l’impossibilité d’utiliser docker.

Mais pourquoi Docker ne fonctionne plus ?

Et surtout, que faire pour continuer à utiliser nos containers sous Fedora 32 ?

Les problèmes

Commençons par identifier les problèmes qui empêchent le fonctionnement de Docker.

1. Pas de paquet

Il n’existe pas officiellement de paquet RPM pour Fedora 32.

Il reste cependant possible d’installer le paquet depuis le repo de Fedora 31 mais lorsque vous allez executer votre container vous aurez un retour d’erreur semblable à celui ci-dessous :

$ docker run hello-world
Docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown.
ERRO[0000] error waiting for container: context canceled

2. Les cgroups

Fedora 32 est la première distribution à utiliser les cgroups en version 2 et Docker ne le supporte pas encore.

Petit rappel rapide le cgroup permet de contrôler un ensemble de processus avec leur niveau de priorité sur les ressources machine CPU/RAM/Network/Disques etc…

Par exemple dans le cadre d’un serveur web on pourra regrouper les services httpd, SQL et php dans un cgroup tout en lui attribuant la priorité sur l’accès CPU/Disques/Network afin qu’ils restent prioritaire sur les autres processus et ainsi maximiser les performances.

3. Le parefeu

Fedora 32 a migré de iptables vers nftables comme backend pour le daemon firewalld comme expliqué ici.

Ce changement rend impossible la communication entre les containers sur votre machine ni vers l’extérieur.

Les solutions

1. Docker

Si on avait déjà docker d’installé il est conseillé de repartir sur une installation fraîche :

$ sudo dnf remove docker docker-*
$ sudo dnf config-manager --disable docker-*
$ sudo rm /etc/yum.repos.d/docker-ce.repo

On repasse en version 1 pour les cgroups :

$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

On édite /etc/firewalld/firewalld.conf pour repasser sur iptables en modifiant la directive FirewallBackend comme ci-dessous :

FirewallBackend=iptables

On passe à l’installation de Docker avec l’activation du daemon :

$ sudo rpmkeys --import https://download.docker.com/linux/fedora/gpg
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
$ sudo dnf install --enablerepo=docker-ce-stable --releasever=31 docker-ce-cli docker-ce docker-compose -y
$ sudo systemctl enable docker --now

Dernière chose à faire pour lancer nos containers sans passer par sudo :

$ sudo usermod -aG docker $USER
$ newgrp docker
$ sudo systemctl reboot

Après le reboot pour faire prendre en compte toutes les modifications on fait un test pour valider le fonctionnement :

$ docker run hello-world

Cela vous retournera un simple “Hello from docker” si vous avez bien suivi les manipulations.

2. Moby-engine

Moby est une réimplementation libre de Docker sans trademark et qui offre les même fonctions en plus d’être disponible directement dans les dépôts de Fedora.

Pour ceux qui souhaiteraient tenter l’expérience voici comment faire.

Nettoyage d’une installation préalable :

$ sudo dnf remove docker docker-*
$ sudo dnf config-manager --disable docker-*
$ sudo rm /etc/yum.repos.d/docker-ce.repo

On repasse en version 1 pour les cgroups :

$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

On active les règles de parefeu qui vont bien pour nftables :

$ sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
$ sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
$ sudo systemctl restart firewalld.service

On installe moby et on active le service :

$ sudo dnf install moby-engine docker-compose -y
$ sudo systemctl enable docker --now

Dernière chose à faire pour lancer nos containers sans passer par sudo :

$ sudo usermod -aG docker $USER
$ newgrp docker
$ sudo systemctl reboot

Comme écrit ci-dessus, après reboot on va simplement faire docker run hello-world pour vérifier que tout fonctionne correctement.

Pour l’utilisation rien ne change que ce soit les options, arguments ni même le mot clé docker.

3. Podman

Podman est l’alternative à Docker supportée par RedHat.

Il prend en charge les cgroups v2 et n’a pas de soucis avec la migration vers nftables.

Installation :

$ sudo dnf install podman -y

Pour vérifier que cela fonctionne :

$ podman run hello-world

Ici encore ce seront les mêmes options et arguments qu’avec docker mais on utilisera podman au lieu du mot clé docker.

Comme indiqué sur le site de podman la manière la plus simple pour migrer de docker vers podman est de l’installer et de faire alias docker=podman.

Vous l’aurez donc compris c’est exactement la même chose pour l’usage en CLI.

Mais podman offre d’autres avantages :

  • Pas besoin de daemon pour fonctionner.
  • Une meilleure intégration avec systemd.
  • Séparation des UID.
  • Inutile d’exécuter nos containers sous root.
  • Possibilité d’exécuter des pods comme kubernetes. (un ensemble de containers)

Mot de la fin

Cet article touche à sa fin vous connaissez les causes qui empêchaient docker de fonctionner, vous pouvez également contourner le problème et vous repartez même avec deux alternatives.

En résumé il est toujours possible d’utiliser docker mais son avenir dans la famille RedHat n’est pas au beau fixe il serait peut-être bon d’envisager une migration vers moby-engine voir podman si vous évoluez dans l’écosystème de RedHat.

Pour ma part j’ai migré vers podman.

Je vous remercie de m’avoir lu et je vous dis à une prochaine !