URL: https://linuxfr.org/users/postroutine/journaux/alternatives-a-docker-ou-presque Title: Alternatives à Docker (ou presque) Authors: Yuul B. Alwright Date: 2023年03月16日T18:25:35+01:00 License: CC By-SA Tags: docker, podman et conteneur Score: 43 # Alternatives à Docker (ou presque) Bonjour nal. Récemment, Docker Inc a fait une annonce concernant la fin de la gratuité de certains comptes sur son Hub. Une annonce qui a fait parler d'elle car tout le monde n'est pas d'accord avec leur décision. Je ne vais pas revenir dessus car il y a déjà [un journal ici qui en parle](https://linuxfr.org/users/bortzmeyer/journaux/docker-supprime-l-acces-gratuit-aux-groupes-et-organisations). Sur les réseaux sociaux, j'ai vu plusieurs personnes demander s’il existait des alternatives. Je vais donc en profiter pour écrire ce petit journal où j'en liste quelque unes que je connais et, pour certaines, utilise très régulièrement. Dans ce journal, je ne vais présenter que des logiciels libres, pas de services. Et je me dépêche avant qu'il ne soit trolldi. ## Avant de commencer Une bonne partie des solutions que je vais lister ici viennent de la Containers Organization. Il ne s'agit pas d'une entreprise mais d'une collection de logiciels libres en lien avec les conteneurs. Ces logiciels sont hébergés sur Github mais n'appartiennent pas à Microsoft. ## Moteur de conteneur: Podman Commençons par le commencement: Le moteur de conteneur. Je sais que les récentes critiques sont dirigées contre le Hub de Docker, mais j'ai lu plusieurs personnes demander des alternatives concernant le moteur. Podman est un moteur de conteneur sous licence Apache 2.0 écrit en Go. Pour plus d'infos: * [Site web](https://podman.io/) * [Comment démarrer](https://podman.io/getting-started/) * [Documentation](https://docs.podman.io/en/latest/markdown/podman-kube-generate.1.html) * [Code source](https://github.com/containers/podman) ### Fonctionnalités Tout comme Docker, il propose de: * Télécharger des images * Construire des images * Envoyer des images * Lancer et gérer des conteneurs * Etc Mais également: * Rootless: Podman peut entièrement fonctionner au niveau utilisateur * Daemonless: Podman est un outil en ligne de commande, il délègue son travail et s'arrête une fois terminé * [Gestion des Pods](https://docs.podman.io/en/latest/markdown/podman-pod.1.html): Des groupes de conteneurs gérés comme une seule unité * [Mise à jour automatique des conteneurs avec rollback](https://docs.podman.io/en/latest/markdown/podman-auto-update.1.html) * Une intégration optionnelle avec Systemd * [Peut créer des Pods à partir d'un fichier Kube pour Kubernetes](https://docs.podman.io/en/latest/markdown/podman-kube.1.html) * [Peut également créer un fichier Kube pour Kubernetes à partir d'un Pod](https://docs.podman.io/en/latest/markdown/podman-kube-generate.1.html) ### Compatibilité avec Docker À propos de la compatibilité des deux outils. Concernant les images, vous pouvez lancer des conteneurs Podman à partir d'images Docker. Vous pouvez également générer des images Docker avec Podman. Vous pouvez également simuler un socket Docker. Et ainsi utiliser des logiciels prévus pour contrôler directement Docker au travers de son socket. Pour les fonctionnalités communes entre Docker et Podman, les commandes sont les mêmes. À tel point qu'on peut créer un `alias docker=podman`. J'ai utilisé Podman pendant 2 ans dans un précédent job où mes collègues utilisaient toutes et tous Docker. Aucun problème de compatibilité. ### Podman et Systemd L'intégration entre Podman et Systemd peut se faire de différentes façons. Pour commencer, à partir de tout conteneur ou pod, vous pouvez demander à Podman de générer un fichier de service Systemd. Ce fichier pourra vous servir à gérer le démarrage, redémarrage et arrêt de votre conteneur ou pod depuis Systemd, comme n'importe quel autre service. Vous avez même une option pour que le fichier de service crée et supprime automatiquement le conteneur ou pod. Ainsi, votre fichier `.service` pourra être ré-utilisé sur n'importe quelle machine avec Systemd et Podman. Ensuite, il est aussi possible d'utiliser Systemd dans un conteneur. Pour lancer facilement un logiciel accompagné de son fichier `.service`. Par exemple, si vous devez conteneuriser un logiciel vous-même mais que vous n'avez pas le temps de le compiler, comprendre comment le lancer, etc. Si, par chance, une des principales distributions GNU/Linux package déjà votre logiciel, vous pouvez simplement créer un fichier `Containerfile` ou `Dockerfile` qui va: - Utiliser l'image de la distribution choisie - Installer le package de votre logiciel - Activer son service - Déclarer les dossiers où iront les données comme des volumes - Indiquer que la commande par défaut du conteneur sera `systemd` Et voilà, il vous suffira de construire votre image à partir de votre `Containerfile` ou `Dockerfile`. Votre logiciel est conteneurisé. Pour bénéficier des mises à jour, il faut reconstruire l'image. Finalement, depuis la version 4.4.0, Quadlet a été intégré à Podman. Il s'agit d'un outil qui propose de créer des services Systemd utilisant Podman pour exécuter les logiciels. Mais cette fois en écrivant directement un simple fichier texte dont la syntaxe est très proche de celle de Systemd. Par exemple, pour lancer un conteneur Python et lui demander d'attendre 60 seconde: ```ini [Unit] Description=A minimal container [Container] Image=centos Exec=sleep 60 [Service] Restart=always ``` Oui, l'exemple est un peu nul, mais c'est un exemple simple. Vous avez plus qu'à sauvegarder votre fichier dans `/etc/containers/systemd/`, télécharger ou construire votre image et faire un `systemctl daemon-reload`. Voilà, votre service est prêt à fonctionner. Bon, j'ai peut-être été trop verbeux sur ce point. Revenons à quelque chose de plus court. ## Gestion d'une stack de conteneurs: podman-compose ## Un des outils très pratiques pour gérer plusieurs conteneurs Docker est docker-compose. Il est possible, avec Podman, d'utiliser docker-compose en activant la simulation du socket Docker. Mais on peut également utiliser podman-compose. Son utilisation est très similaire à docker-compose. Il supporte les formats compose-file v2 et v3. Il exécute directement la commande podman, il n'est pas nécessaire d'activer le socket. Podman-compose est un logiciel libre, écrit avec Python et sous licence GPLv2. Plus d'infos: * [Code source](https://github.com/containers/podman-compose) ## Construction des images: Buildah ## Parfois, on a voulu juste construire une image. Rien de plus. Pour ça, il y a Buildah. Son rôle est justement de construire des images et, optionnellement, de les envoyer vers un registre d'images. Il s'agit d'un logiciel libre, écrit avec Go et sous licence Apache 2.0. Pour plus d'infos: * [Site web](https://buildah.io/) * [Tutoriels](https://github.com/containers/buildah/tree/main/docs/tutorials) * [Documentation](https://github.com/containers/buildah/tree/main/docs/tutorials) * [Code source](https://github.com/containers/buildah) ## Registre d'images: Docker Distribution et Pulp Sur ce point, je ne vais pas présenter un service mais deux logiciels qu'on peut utiliser pour auto-héberger la distribution d'images pour conteneurs. On peut le faire à titre personnel où mutualiser ses ressources et personnes avec d'autres organisations. Par exemple [via un chaton](https://www.chatons.org/) ? ### Docker Distribution Ici, je vais parler du projet Distribution de Docker. Il s'agit d'un logiciel libre sous licence Apache 2.0, écrit lui aussi avec Go. Oui, il s'agit d'un logiciel de chez Docker. Mais il s'agit d'un logiciel libre. S’il prend une mauvaise direction, il pourra toujours être forké. Il implémente l'API [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec). Il est donc possible d'avoir d'autres logiciels qui soient compatibles. L'avantage de ce logiciel est qu'il est simple à déployer et utiliser. Si une organisation héberge déjà son site web, il devrait être facile d'héberger la distribution de ses images avec ce logiciel. Pour plus d'infos: * [Documentation](https://docs.docker.com/registry/) * [Code source de Distribution](https://github.com/distribution/distribution) ### Pulp ### Pulp est un logiciel libre proposant d’héberger des dépôts de paquets: * Image de conteneurs avec API Docker Registry HTTP API V2-compatible * Paquets Python * Ruby gems * Paquets RPM * Paquets DEB * Collections et rôles Ansible * OSTree packages * Chef cookbooks * Maven packages * Fichiers Vous pouvez l'utiliser pour vos dépôts personnels mais également pour faire des miroirs de dépôts existants. Pour les images de conteneur, vous pouvez également demander à Pulp de les construire à partir d'un fichier `Containerfile`. Je ne l'ai pas encore utilisé, donc je ne sais pas s’il est adapté pour des dépôts publics. Il est écrit avec Python et est distribué sous licence GPLv2. Pour plus d'infos: * [Site web](https://pulpproject.org/) * [Documentation](https://pulpproject.org/docs/) * [Code source](https://github.com/pulp/pulpcore) ## Format d'images: OCI ## Pour le format des images des conteneurs, il existe l'OCI Image Format. [Spécifications](https://github.com/opencontainers/image-spec) Ce format d'image est supporté par Podman et Buildah ## Gérer des registres d'images: Skopeo ## Skopeo est un petit logiciel qui vous servira à effectuer différentes opérations sur des images hébergées sur des registres. Fonctionnalités: * Copie d'images depuis et vers différents sources ou destination * Type de sources et destinations proposées: * Stockage local * Registre implémentant l'API Docker Registry HTTP API V2 * Dossier local * Archive * Inspection des propriétés d'une image, sans avoir à la télécharger * Suppression d'image d'un registre * Synchronisation entre deux registres Il s'agit d'un logiciel libre sous licence Apache 2.0, écrit lui aussi avec Go. Pour plus d'infos: * [Code source](https://github.com/containers/skopeo) * [Documentation](https://github.com/containers/skopeo/tree/main/docs) ## Application de bureau: Podman Desktop ## On arrive à l'application de bureau. Podman Desktop est un logiciel libre écrit principalement avec TypeScript et sous licence Apache 2.0. Disponible pour Windows, Mac OS et GNU/Linux, il propose: * Construction et gestion d'images * Exécution et gestion de conteneur et Pod * Exécution de Pod sur Podman ou Kubernetes * Conversion de Pod pour être lancé sur Kubernetes * Gestion des volumes * Gestion de plusieurs moteurs de conteneurs: Podman, [CRC](https://github.com/crc-org/crc), [Machines Podman Lima](https://github.com/lima-vm/lima) et Docker * Gestion des registres OCI * Support de proxy * Système d'extensions Je ne l'ai utilisé qu'une fois, pour voir à quoi ressemblait son interface. Pour plus d'infos: * [Site web](https://podman-desktop.io/) * [Documentation](https://podman-desktop.io/docs/intro) * [Code source](https://github.com/containers/podman-desktop) ## Ansible: Collection Podman ## Si vous utilisez Ansible pour gérer le déploiement et la configuration de votre parc, vous pouvez utiliser la collection officielle `containers.podman`. Écrite avec Python et sous licence GPLv3, elle propose de nombreux modules pour gérer vos ressources Podman ou obtenir des informations à leur sujet. Cette collection propose également 2 extensions de connexion, pour Podman et Buildah, ainsi qu'une extension become utilisant Podman unshare. Pour plus d'infos: * [Documentation](https://docs.ansible.com/ansible/latest/collections/containers/podman/index.html) * [Code source](https://github.com/containers/ansible-podman-collections) ## Interface web: Cockpit-podman ## Pour terminer, une petite extension pour [Cockpit](https://cockpit-project.org/), l’interface web pour serveur. Il s'agit d'un logiciel libre principalement écrit avec JavaScript et Python et sous licence LGPLv2.1. Cette interface est un limité à quelques fonctionnalités: * Téléchargement et gestion d'images * Création et gestion de Pods et conteneurs Pour plus d'infos: * [Code source](https://github.com/cockpit-project/cockpit-podman) ## Conclusion ## Il existe plusieurs alternatives aux solutions de Docker Inc offrant une bonne compatibilité et même des fonctionnalités supplémentaires. Le modèle du "conteneur à processus unique basé sur un environnement reproductible" offre de nombreux avantages et il serait dommage d'y renoncer suite aux décisions de Docker Inc. PS: Ce journal a sûrement de nombreuses "fautes" de français. En réalité, ce ne sont pas des fautes mais un moyen de faire vivre la langue. Car seules les langues mortes sont figées. (Je suis déjà loin :p)