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 :
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 :
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 :
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 :
- registries.conf :
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 :
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 ! 😇