Passer

Comment installer containerd localement  et construire de jolies images multi-plateformes ?

Pourquoi ?

J’ai rédigé un petit article intitulé « Comment installer Podman localement avec Vagrant » pour remplacer l’installation de Docker Desktop. Dans cet article, j’ai indiqué que j’allais effectuer le même test, mais avec Containerd. Ainsi, nous allons suivre les mêmes étapes que dans l’article précédent, mais avec Containerd en adaptant légèrement le processus pour découvrir de nouvelles choses. Au programme : Vagrant, Ansible, Containerd et une petite image Docker pour les architectures amd64 et arm64 😁.

La stack technologique

Je ne vais pas réexpliquer les technologies présentées dans l’article précédent : VirtualBox, Vagrant et Ansible, qui sont utilisées de la même manière.

Containerd est un outil permettant d’exécuter des conteneurs compatibles OCI. Nous allons donc avoir une machine virtuelle sous VirtualBox avec Containerd installé dessus, ainsi qu’une commande à distance qui nous permettra de gérer Containerd depuis notre machine cliente. Tout cela sera construit grâce à Vagrant et Ansible 🫰.

Les prérequis sont identiques à ceux mentionnés dans l’article précédent, donc rien à faire de plus (ou suivre les mêmes étapes !).

L’infrastructure containerd

Nous allons récupérer le dépôt Git contenant nos sources Vagrant et Ansible afin de construire l’infrastructure pour Containerd.

Ensuite, nous allons nous connecter à la machine créée avec Vagrant pour vérifier que Containerd et Nerdctl sont correctement installés, et pour lancer un petit conteneur de test.

Note 1

Si vous voulez voir les étapes d’installation de Containerd, de Nerdctl (la CLI pour administrer Containerd), de Buildkit et de Binfmt (émulateur d’architecture pour Docker), ils sont dans le playbook utilisé, vous pouvez le consulter. Cela vous permettra de posséder tous les outils nécessaires pour générer des images Docker multi-architecture.

Nerdctl

Première mauvaise nouvelle… nerdctl n’a pas la capacité de gérer containerd à distance. Nous allons essayer de le tromper 🙃 pour voir comment cela se passe. Pour cela, il est possible d’utiliser SSH pour lancer des commandes à distance et PowerShell pour masquer cela. 

Nous allons récupérer notre fichier de profil PowerShell pour y ajouter la fonction avec la commande et l’alias souhaité.

Nous pouvons maintenant effectuer un petit test en utilisant notre alias précédemment créé.

Cela fonctionne assez bien pour une utilisation classique 👍

Note 1

La fonction « nerdctl » créée en PowerShell est assez basique : elle va récupérer notre chemin actuel, le transformer pour correspondre au répertoire monté via Vagrant qui contient nos dépôts locaux (vous pouvez consulter le fichier Vagrantfile avec l’entrée « containerd.vm.synced_folder »). Par conséquent, petite limitation, la commande ne fonctionnera que dans le répertoire racine et les sous-répertoires de nos dépôts (mais c’est tout ce dont j’ai besoin pour accéder aux sources de mes applications). Ensuite, nous invoquons SSH avec la clé privée définie dans Vagrant via Ansible, nous nous positionnons sur le chemin défini précédemment, et nous pouvons lancer nerdctl via SSH en lui passant tous les paramètres donnés à distance.

Construire une image

Essayons de construire une image Docker ultra-simple (voir le Dockerfile).

Et elle fonctionne plutôt bien, il faut le reconnaître 😅🤣 L’informatique, c’est vraiment cool !

Nous pouvons vérifier qu’il est possible d’exécuter un conteneur Linux amd64 et d’émuler de l’arm64 sans aucun problème.

Allons un peu plus loin et essayons de construire cette même image mais avec une architecture multiple, amd64 et arm64.

Là, on touche un petit quelque chose, non ? 😺🔥 Ou est-ce juste mon côté geek ?

Note 1

Dans le monde professionnel, compte tenu des adaptations à apporter pour faire tourner « nativement » Containerd sur un poste Windows 10 (avec une vision « dev »), j’aurais tendance à orienter mon équipe vers des solutions telles que Docker Desktop, Podman Desktop ou encore Rancher Desktop. En natif Linux, pourquoi pas, cela fonctionne bien.

Nerdctl compose

Il est temps de construire une petite application. 

Pour cela, nous allons utiliser une API et une interface Web mises à disposition par HashiCorp dans le cadre d’une démo d’un service mesh utilisant Consul (https://github.com/hashicorp/demo-consul-101/). Nous utiliserons uniquement l’application de base avec une API qui compte les appels effectués et les affiche via un tableau de bord. 

J’ai choisi cette application car les packages des deux services sont compilés en amd64 et en arm64 et sont disponibles sur Git 👏. 

Nous allons commencer par créer les images associées à nos deux services (vous pouvez voir ce qui est fait dans les Dockerfiles, nous utiliserons un « builder » pour télécharger l’application pour la bonne architecture et la copier dans notre image finale).

Nous devrions maintenant avoir nos images pour les deux architectures ciblées. 

Nous pourrions lancer ces deux images comme nous l’avons fait pour les images précédentes avec ces commandes dans deux terminaux.

Cependant, je vous encourage à regarder le fichier « docker-compose.yml » et à tester la commande « compose » fournie avec Nerdctl.

Il ne reste plus qu’à tester l’API et l’interface utilisateur Web et à effectuer plusieurs appels à celles-ci.

Voilà 😌.

En conclusion

Nous arrivons à la fin de cet article. 

Des informations supplémentaires sont disponibles dans les fichiers du dépôt, en particulier pour la partie vagrant, ansible ainsi que les fichiers Dockerfile et docker-compose.yml.

Nous avons vu comment utiliser containerd et sa ligne de commande nerdctl pour exécuter des conteneurs, construire des images pour amd64 et arm64 et lancer plusieurs conteneurs via nerdctl compose. 

Cool ?

Ressources

Containerd

Containerd Website : https://containerd.io/

Containerd Github : https://github.com/containerd/containerd

Nerdctl Github : https://github.com/containerd/nerdctl

Nerdctl Commands Refs : https://github.com/containerd/nerdctl/blob/main/docs/command-reference.md

Nerdctl Multi-Platform : https://github.com/containerd/nerdctl/blob/main/docs/multi-platform.md

Hashicorp demo-consul-101

Github : https://github.com/hashicorp/demo-consul-101

Docker Building Multi-Platform

Docs : https://docs.docker.com/build/building/multi-platform/

GitLab

Repo : https://gitlab.com/thibault.desaules/dear-vagrant-please-build-my-containerd-local-environment

Auteurs

Thibault Desaules

DevOps Engineer - Devoteam Innovative Tech France

I have loved "IT" since I was a kid :) building computers, compiling kernels, lighting up Arduino's led, launching containers and deploying infras on cloud. But my real concern: Supporting developers in their infra issues, giving them the tools to develop their applications efficiently and promoting the Cloud because it opens so many possibilities.