Correction le 14/02 : Les formats d’images

Podman est un moteur et gestionnaire de conteneurs libre, développé par RedHat.

Il fonctionne sans démon (contrairement à Docker), il est plus sécurisé (pas de démon qui s’exécute en root) et plus léger donc plus facile à intégrer dans des serveurs à ressources limitées (Raspberry, par exemple).

Il peut être piloté par Kubernetes comme d’autres moteurs.

De grandes promesses, donc.

Installation

Il est présent dans tous les gestionnaires de paquets classiques comme APT, RPM, YUM, …

Les détails sont ici, mais c’est très simple.

Rootless c’est quoi ?

Un des avantages de Podman est qu’il est rootless. Il ne demande pas à ce que l’utilisateur soit root, privilégié ou dans un groupe particulier,

Chaque utilisateur gère ses propres conteneurs (réseau, stockage, environnement, …).

Stockage

Cela signifie aussi que chacun gère son stockage dans son coin : ~/.local/share/containers/

Par exemple, si toto utilise une image Wordpress (750Mo sur la balance !) et que titi a la même idée, le système de fichiers peut se remplir bien vite.

Réseau

D’un point de vue réseau, ça veut dire que l’utilisateur n’a plus accès aux ports réservés (< 1024).

Résolution des noms d’images

Avec Docker, quand on utilise une image du Docker Hub, on ne précise pas le nom de domaine, uniquement le nom de l’image.

docker pull debian:stable
# équivaut à
docker pull docker.io/debian:stable
# et pour un autre registry on précise le nom de domaine :
docker pull quay.io/centos/centos

Avec Podman, il y a des noms d’images connus, indiqués dans /etc/containers/registries.conf.d/shortnames.conf.

Au-delà de ça, il faut ajouter les registries pour pouvoir utiliser des URLs courtes dans /etc/containers/registries.conf.

# /etc/containers/registries.conf
# a minima on met docker.io
unqualified-search-registries=["docker.io"]
# on peut même en mettre un peu plus
#unqualified-search-registries=["docker.io", "registry.access.redhat.com", "registry.fedoraproject.org", "quay.io"]

Ce qui nous permet de faire :

podman pull nextcloud

Ca ressemble à du Docker

La CLI

Ce qui frappe dès le départ, c’est que la CLI Podman est à ce point similaire à Docker qu’on peut utiliser les mêmes commandes (un alias de docker vers podman fonctionne bien) :

alias docker=podman
# Perso j'ai toujours aliasé docker en 'dk' donc :
alias dk=podman

Et vos commandes Docker habituelles fonctionnent avec ou sans alias :

podman pull debian:stable
# ou
dk pull debian:stable
dk run -it debian:stable bash
dk run -d "sleep 5h"
dk logs mon-container
dk ps
...

Le format d’images

Un format d’images de containers a été standardisé, c’est le format OCI.

Cela permet d’avoir un standard pour distribuer et récupérer les images dans des registries.

Par défaut, Podman utilise ce format pour construire les images.

On si besoin préciser qu’on veut le format Docker :

# Par défaut :
podman build --format oci ...
# Au format Docker manifest v2 :
podman build --format docker ...

Le Dockerfile est le même :

# Dockerfile
FROM debian:stable
RUN apt update && apt -y install nginx
EXPOSE 80/tcp
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

Et le build fonctionne pareil :

podman build -t my-nginx .

Particularité : La notion de Pods

C’est un concept venu de Kubernetes, un pod est un ensemble de containers avec des ressources en commun.

# Créer un pod
podman pod create my-pod
# Créer un conteneur attaché à un pod
podman run -d --pod my-pod alpine:latest sleep 1h
podman run -d --pod my-pod -p8080:80 docker.io/nginx

Et de la même façon qu’on le fait avec les conteneurs, on peut gérer les pods :

podman pod start my-pod
podman pod ls my-pod
podman pod stop my-pod
podman pod rm my-pod

Podman Compose

Comme Docker Compose, on peut installer un Podman Compose avec un module python :

python3 -m pip install podman-compose

Une fois fait, on peut l’utiliser de la même manière que docker-compose, avec le même format de fichier :

# docker-compose.yml
version: '3.5'

networks:
  public:

services:

  shadow:
    image: "docker.io/nginx:alpine"
    hostname: shadow
    container_name: shadow
    restart: on-failure:3
    ports:
      - 8080:80
      - 8443:443
    volumes:
      - ./MY-VOLUME:/usr/share/nginx/html
    networks:
      - public

Les mêmes commandes (on peut encore faire un alias) :

alias docker-compose=podman-compose
# Perso j'ai toujours aliasé docker-compose en 'dkc', donc :
alias dkc=podman-compose
dkc up -d
echo "Hello World!" > MY-VOLUME/index.html
dkc ps

Et on vérifie : http://localhost:8080