Une introduction à Podman

1. Introduction

Dans ce tutoriel, nous examinerons Podman (abréviation de «Pod Manager»), ses fonctionnalités et son utilisation.

2. Podman

Podman est un outil de gestion de conteneurs open source pour le développement, la gestion et l'exécution de conteneurs OCI. Jetons un coup d'œil à certains des avantages de Podman, par rapport à d'autres outils de gestion de conteneurs:

  • Les images créées par Podman sont compatibles avec d'autres outils de gestion de conteneurs . Les images créées par Podman adhèrent à la norme OCI et peuvent donc être poussées vers d'autres registres de conteneurs tels que Docker Hub
  • Il peut être exécuté en tant qu'utilisateur normal sans nécessiter de privilèges root. Lorsqu'il est exécuté en tant qu'utilisateur non root, Podman crée un espace de noms utilisateur dans lequel il acquiert l'autorisation root. Cela lui permet de monter des systèmes de fichiers et de configurer les conteneurs requis
  • Il offre la possibilité de gérer les pods. Contrairement aux autres outils d'exécution de conteneurs, Podman permet à l'utilisateur de gérer les pods (un groupe d'un ou plusieurs conteneurs qui fonctionnent ensemble). Les utilisateurs peuvent effectuer des opérations telles que créer, répertorier, inspecter les pods

Cependant, il existe certaines limitations à Podman:

  • Il ne fonctionne que sur les systèmes basés sur Linux. Actuellement, Podman ne fonctionne que sur les systèmes d'exploitation basés sur Linux et n'a pas de wrapper pour Windows et macOS.
  • Il n'y a pas d'alternative à Docker Compose. Podman ne prend pas en charge la gestion locale de plusieurs conteneurs, comme ce que fait Docker Compose. Une implémentation de Docker Compose utilisant le backend Podman est en cours de développement dans le cadre du projet podman-compose , mais ce travail est toujours en cours.

3. Comparaison avec Docker

Maintenant que nous avons compris ce qu'est Podman et quels sont ses avantages et ses limites, comparons-le à Docker, l'un des outils de gestion de conteneurs les plus utilisés.

3.1. Interface de ligne de commande (CLI)

Podman propose le même ensemble de commandes exposé par le client Docker. En d'autres termes, il existe un mappage un à un entre les commandes de ces deux utilitaires.

Cependant, les commandes telles que podman ps et podman images n'afficheront pas les conteneurs ou les images créés à l'aide de Docker. En effet, le référentiel local de Podman est / var / lib / containers par opposition à / var / lib / docker maintenu par Docker.

3.2. Modèle de conteneur

Docker utilise une architecture client-serveur pour les conteneurs, tandis que Podman utilise le modèle traditionnel de fork-exec commun à tous les processus Linux. Les conteneurs créés à l'aide de Podman sont le processus enfant du processus Podman parent. C'est la raison pour laquelle lorsque la commande de version est exécutée pour Docker et Podman, Docker répertorie les versions du client et du serveur, tandis que Podman ne répertorie que sa version.

Exemple de sortie pour la version docker :

Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:11:19 2017 OS/Arch: linux/amd64 Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:09:53 2017 OS/Arch: linux/amd64 Experimental: false

Exemple de sortie pour la version podman :

Version: 0.3.2-dev Go Version: go1.9.4 Git Commit: "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96" Built: Mon Mar 5 11:10:35 2018 OS/Arch: linux/amd64

Étant donné que Podman lui-même s'exécute en tant que processus, il ne nécessite aucun processus démon en arrière-plan. Contrairement à Podman, Docker nécessite un processus démon, le démon Docker, pour coordonner les demandes d'API entre le client et le serveur .

3.3. Mode sans racine

Comme mentionné précédemment, Podman n'a pas besoin d'un accès root pour exécuter ses commandes. Docker, d'autre part, étant dépendant du processus démon, nécessite des privilèges root ou oblige l'utilisateur à faire partie du groupe docker pour pouvoir exécuter les commandes Docker sans privilège root .

$ sudo usermod -aG docker $USER

4. Installation et utilisation

Commençons par installer Podman. La commande podman info affiche les informations du système Podman et permet de vérifier l'état de l'installation.

$ podman info

Cette commande affiche les informations relatives à l'hôte telles que la version du noyau, l'espace d'échange utilisé et disponible ainsi que les informations relatives à Podman telles que les registres auxquels il a accès pour extraire et pousser des images, le pilote de stockage qu'il utilise, l'emplacement de stockage et autres:

host: MemFree: 546578432 MemTotal: 1040318464 SwapFree: 4216320000 SwapTotal: 4216320000 arch: amd64 cpus: 2 hostname: base-xenial kernel: 4.4.0-116-generic os: linux uptime: 1m 2.64s insecure registries: registries: [] registries: registries: - docker.io - registry.fedoraproject.org - registry.access.redhat.com store: ContainerStore: number: 0 GraphDriverName: overlay GraphOptions: null GraphRoot: /var/lib/containers/storage GraphStatus: Backing Filesystem: extfs Native Overlay Diff: "true" Supports d_type: "true" ImageStore: number: 0 RunRoot: /var/run/containers/storage

Jetons un coup d'œil à certaines des commandes de base de Podman.

4.1. Créer une image

Tout d'abord, nous allons examiner la création d'une image à l'aide de Podman. Commençons par créer un Dockerfile avec le contenu suivant:

FROM centos:latest RUN yum -y install httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] EXPOSE 80 

Créons maintenant l'image à l'aide de la commande build :

$ podman build .

Ici, nous tirons d'abord l'image de base de CentOS, installons Apache par-dessus, puis l'exécutons en tant que processus de premier plan avec le port 80 exposé. Nous pouvons accéder au serveur Apache en exécutant cette image et en mappant le port exposé à un port hôte.

La commande build transmet récursivement tous les dossiers disponibles dans le répertoire context. Le répertoire de travail actuel devient par défaut le contexte de construction lorsqu'aucun répertoire n'est spécifié. Par conséquent, il est conseillé de ne pas avoir de fichiers et de dossiers non requis pour la création d'image, dans le répertoire contextuel.

4.2. Liste des images disponibles

La commande images podman répertorie toutes les images disponibles. Il prend également en charge diverses options pour filtrer les images.

$ podman images

This command lists all the images available in the local repository. It contains the information on which repository the image was pulled from, the tag, its image id, created time and size.

REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB  
    

4.3. Running Images

The run command creates a container of a given image and then runs it. Let's run the CentOS image we have created earlier

$ podman run -p 80:80 -dit centos

This command first checks if there is a local image available for CentOS. If the image isn't present locally, it tries to pull the image from the registries that were configured. If the image isn't present in the registries, it shows an error about unable to find the image.

The above run command specifies to map the exposed 80 port of the container to the port 80 of the host and the dit flag specifies to run the container in detached and interactive mode. The id of the container created will be the output.

4.4. Deleting Images

The rmi command removes the images present in the local repository. Multiple images can be removed by providing their ids as space-separated in the input. Specifying the -a flag removes all the images

$ podman rmi 785188cd988c

4.5. Listing the Containers

All the available containers including the ones which aren't running can be listed using the ps -a command. Similar to the images command, this can also be used with various options.

$ podman ps -a

The output for the above command lists all the containers with the information such as image it was created from, the command used to launch it, it's status, ports it's running on and the name assigned to it.

CONTAINER ID IMAGE COMMAND CREATED AT STATUS PORTS NAMES eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov

4.6. Deleting Containers

The rm command removes the containers. This command does not remove the containers in running or paused state. They need to be first stopped and then removed.

$ podman stop eed30719cd37 $ podman rm eed30719cd37

4.7. Creating Pods

The pod create command creates a pod. The create command supports different options.

$ podman pod create

The pod create command creates a pod with an infra container by default associated with it unless explicitly set with infra flag as false.

$ podman pod create --infra = false

Infra container allows Podman to connect various containers in the pod.

4.8. Listing Pods

The pod list command displays all the available pods

$ podman pod list

The output of this command displays the information such as the pod id, its name, number of associated containers, the id of the infra container if available:

POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667

All the available Podman commands and their usage can be found in the official documentation.

5. Conclusion

In this tutorial, we've looked at the basics of Podman and its features, its comparison to Docker and a few of the commands available.

As usual, the code sample used in this article is available over GitHub.