Podman est disponible dans sa version 2 depuis quelques semaines maintenant sur Github. Il existe même un paquet RPM pour Fedora. Mais voila, ma machine principale utilise Ubuntu 20.04 ! Comment compiler Podman v2 sur Ubuntu 20.04 ?

Lors de ce tutoriel, nous allons voir comment réaliser cette installation !

Préambule

Avant toute chose, j'utilise Podman avec une machine virtuelle légère gérée par Multipass ( lui même compilé afin d'utiliser la dernière version et me passer de snap ).

En réalité je fais cela avec énormément de mes outils. Par le passé j'installais Docker directement sur mon hôte, et je conteneurisais tout mes outils. Maintenant je virtualise également mon installation Docker et/ou de containers. Pourquoi ?

Cela me permet d'avoir mes outils en mode portatif, donc sans aucune dépendance avec mon système d'exploitation, ou vraiment peu. Grâce à cela, je peux ré-installer ma machine voire même changer d'OS avec peu d'impact. Sans compter la sécurité que cela apporte, même si pour être honnête, ceci n'a jamais était mon objectif principal.

En tout cas, si dockerizer vos applications vous intéresse, la caverne d’Alibaba se trouve ici :

jessfraz/dockerfiles
Various Dockerfiles I use on the desktop and on servers. - jessfraz/dockerfiles

Et pour la virtualisation d'application avec GUI, il existe ce type de solution :

https://techsparx.com/linux/multipass/display-gui-on-mac.html

Si cela vous intéresse, nous aurons l'occasion de revenir plus tard sur ces sujets ! 😉

Compilons maintenant Podman en version 2 !

Je compile, tu compiles, nous compilons...

Pour réaliser ce tutoriel, j'ai suivi la documentation présente sur le site officiel :

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.

Et surtout de la partie Building from scratch.

J'ai dû toutefois apporter à cette documentation quelques modifications que je vais préciser ici.

On commence par les dépendances. Pas le choix, vous devez me faire confiance sur la liste :

sudo apt install -y btrfs-progs \
conmon \
git \
golang-go \
go-md2man \
iptables \
libassuan-dev \
libbtrfs-dev \
libc6-dev \
libdevmapper-dev \
libglib2.0-dev \
libgpgme-dev \
libgpg-error-dev \
libprotobuf-dev \
libprotobuf-c-dev \
libseccomp-dev \
libselinux1-dev \
libsystemd-dev \
make \
pkg-config \
runc \
slirp4netns \
uidmap

👉 Par rapport à la documentation officielle je modifie le nom des paquets suivants :

  • brtfs-tools  ➡️ btrfs-progs
  • libprotobuf-c0-dev ➡️ libprotobuf-c-dev

Enfin j'ajoute les dépendances suivantes :

  • conmon
  • slirp4netns

Ces paquets ne sont pas indispensables à la compilation de Podman 2. Par contre à l'utilisation vous obtiendrez les messages d'erreurs suivants :

ubuntu@podmanv2:~$ podman info
Error: could not find a working conmon binary (configured options: [/usr/libexec/podman/conmon /usr/local/libexec/podman/conmon /usr/local/lib/podman/conmon /usr/bin/conmon /usr/sbin/conmon /usr/local/bin/conmon /usr/local/sbin/conmon /run/current-system/sw/bin/conmon]): invalid argument

ou

ERRO[0011] could not find slirp4netns, the network namespace won't be configured: exec: "slirp4netns": executable file not found in $PATH 

Voilà pour les dépendances ! 👈

Il est ensuite nécessaire d'initialiser la variable GOPATH :

Cette variable d'environnement est utilisée pour spécifier des répertoires en dehors de GOROOT qui contiennent la source des projets Go et leurs binaires.

Pour plus d'explication sur ce sujet :

golang/go
The Go programming language. Contribute to golang/go development by creating an account on GitHub.

J'initialise donc la variable :

lfache@Midgar:~$ export GOPATH=~/go && mkdir -p $GOPATH

Maintenant récupérons nos sources :

lfache@Midgar:~$ git clone \
https://github.com/containers/libpod/ \
$GOPATH/src/github.com/containers/libpod

Et lançons enfin notre compilation :

lfache@Midgar:~$ cd $GOPATH/src/github.com/containers/libpod
lfache@Midgar:~$ make BUILDTAGS="selinux seccomp"

Si tout se passe bien, vous pouvez installer Podman v2 :

lfache@Midgar:~$ sudo make install PREFIX=/usr

Mais si vous essayez de lancer votre premier container, vous allez obtenir une erreur :

lfache@Midgar:~$ podman run --rm debian /bin/echo Hello World.
Error: unable to pull debian: open /home/lfache/.config/containers/policy.json: no such file or directory

ou même :

lfache@Midgar:~$ podman run --rm debian /bin/echo Hello World.
Error: unable to pull debian: image name provided is a short name and no search registries are defined in the registries config file.

En réalité, cela nous permet de mettre en avant deux fichiers de configuration :

  • policy.json :
containers/image
Work with containers’ images. Contribute to containers/image development by creating an account on GitHub.
  • registries.conf :
containers/image
Work with containers’ images. Contribute to containers/image development by creating an account on GitHub.

Il est donc nécessaire de créer ces deux fichiers.

Soit dans votre $HOME , ou dans /etc/containers.

Ces fichiers permettent de spécifier les registres d'images à utiliser ainsi que les politiques de sécurité associées à la récupération des images.

Je vais créer les fichiers dans mon $HOME :

lfache@Midgar:~$ mkdir -p ~/.config/containers
lfache@Midgar:~$ curl -L -o ~/.config/containers/registries.conf \
https://raw.githubusercontent.com/projectatomic/registries/master/registries.fedora
lfache@Midgar:~$ curl -L -o ~/.config/containers/policy.json \
https://raw.githubusercontent.com/containers/skopeo/master/default-policy.json

Nous sommes enfin prêts pour lancer un container.

lfache@Midgar:~$ podman run -d -p 8080:80 nginx
lfache@Midgar:~$ 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>

Vous ne devriez avoir aucun soucis pour lancer vos containers avec la version 2 de Podman !

Mais j'aime vraiment automatiser les choses alors ...

Bonus : Multipass + Cloud-init

Je vais mettre en pratique un article que j'ai mis en ligne très récemment afin de déployer une instance Ubuntu 20.04 et compiler Podman v2 directement à la création de mon instance. Pour cela je vais utiliser cloud-init :

Introduction à Cloud-init
Lors de précédents articles, nous avons vu comment installer et déployer des applications à l’aide de Docker, et de cloud providers. Faut-il que je réalise mon installation de Docker à chaque création d’instance ? Comment garantir une homogénéité dans mes installations ? Gagner du temps ?

Créons tout simplement un fichier cloud-config avec les commandes que nous venons de voir :

Je réalise quelques modifications car l'utilisateur effectuant les opérations est root lors du cloud-init. De ce fait certaines variables sont différentes ou ajoutées.

Ce fichier demande sûrement à être amélioré mais il réalise ce que je lui demande :

lfache@Midgar:~$ multipass launch focal -c 8 -m 8G \
-n podmanv2 --cloud-init cloud-config.yaml

Je créé ma machine virtuelle avec :

  • -c : 8 CPUs
  • -m : 8Go de mémoire

🚩 Attention si la mémoire n'est pas suffisante, votre compilation risque d'échouer 🚩

Enfin on vérifie le fonctionnement :

lfache@Midgar:~$ multipass exec podmanv2 -- podman --version
podman version 2.0.0-dev

Vous voilà maintenant prêt pour compiler Podman dans sa dernière version sur Ubuntu 20.04 ! Vous n'avez plus d'excuses pour ne pas l'essayer avec sa dernière API REST 😀

Bien évidement il est fort possible que des bugs soient encore présents dans cette version. Mais pour réaliser quelques tests standard, cela ne devrait poser aucun problème.

En tout cas cette installation me servira de base pour mon prochain article autour de Podman et l'utilisation des Pods !

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 ! 😇