Aller au contenu

Containerd

Mise à jour :

Containerd est un moteur de conteneurs léger, rapide et robuste, idéal pour gérer vos workloads en conteneurs. Initialement intégré à Docker, il est aujourd’hui un projet clé soutenu par la CNCF et parfaitement adapté à Kubernetes. Ce guide vous permettra d’apprendre à l’installer, le configurer et l’utiliser efficacement.

Un peu d’histoire

Containerd a vu le jour en 2015 comme un composant central de Docker, conçu pour gérer l’exécution et la supervision des conteneurs. À l’époque, Docker combinait plusieurs fonctionnalités : le build d’images, la gestion des conteneurs, et l’orchestration. Pour simplifier son architecture, Docker a choisi de découpler certaines de ces responsabilités, donnant naissance à containerd en tant que moteur dédié à la gestion des conteneurs.

En 2017, Docker a fait un pas décisif en transférant containerd à la Cloud Native Computing Foundation (CNCF). Cette décision a renforcé l’indépendance et l’adoption de containerd, le plaçant au centre de l’écosystème cloud-native. Depuis, il est devenu le runtime privilégié pour des outils comme Kubernetes, remplaçant l’ancien Docker-shim avec le support natif de l’interface CRI (Container Runtime Interface).

Aujourd’hui, containerd est utilisé par les principaux fournisseurs de services cloud et s’impose comme une référence incontournable dans la gestion des conteneurs grâce à sa stabilité et ses performances éprouvées. Une belle trajectoire pour un projet né dans l’ombre de Docker !

Quelles différences entre Docker et containerd ?

Bien que Docker et containerd soient souvent associés, leurs objectifs et fonctionnalités diffèrent sensiblement. Docker est une plateforme complète de gestion de conteneurs, regroupant des outils pour la création d’images, leur gestion, et leur orchestration. À l’inverse, containerd se concentre uniquement sur l’exécution des conteneurs, en servant de moteur minimaliste et performant.

Docker repose en grande partie sur containerd pour ses tâches d’exécution des conteneurs. Cependant, il y ajoute des fonctionnalités comme le build d’images avec Dockerfile, la gestion avancée des réseaux, et des outils comme Docker Compose pour orchestrer des applications multi-conteneurs. Docker vise à fournir une solution tout-en-un, accessible aux développeurs et facile à prendre en main.

De son côté, containerd est conçu pour être léger et modulaire, privilégiant l’intégration dans des environnements cloud-native comme Kubernetes. Son adoption massive s’explique notamment par son support natif de l’interface CRI (Container Runtime Interface), simplifiant son utilisation dans des clusters Kubernetes, où Docker est désormais déprécié.

Un autre point de divergence est l’interface utilisateur. Docker offre une CLI riche et conviviale, tandis que containerd propose des outils minimalistes comme ctr ou nerdctl, principalement destinés aux administrateurs et développeurs expérimentés.

En résumé, Docker est idéal pour démarrer avec les conteneurs ou pour des workflows complets, tandis que containerd s’adresse aux utilisateurs cherchant un runtime performant, modulaire, et parfaitement adapté à l’écosystème cloud-native.

Fonctionnalités principales de containerd

Voici les fonctionnalités clés qui font de containerd un outil puissant pour la gestion des conteneurs :

  • Support des spécifications OCI Compatible avec les images et runtime conformes aux normes OCI (Open Container Initiative), garantissant une interopérabilité maximale.
  • Gestion des images conteneurs Permet le téléchargement, la gestion et l’exécution d’images via des outils comme ctr, crictl ou nerdctl.
  • Interface CRI intégrée Fournit un support natif pour Kubernetes, simplifiant l’intégration comme runtime des nœuds.
  • Snapshots efficaces Gère les systèmes de fichiers avec des snapshots performants pour des performances optimales et une meilleure isolation des conteneurs.
  • Modularité Un design minimaliste et modulaire, permettant une intégration facile avec des outils tiers.
  • Support multi-plateforme Fonctionne sur les architectures Linux (amd64, arm64) et Windows.
  • Extensibilité Possède une API gRPC permettant aux développeurs de créer des outils personnalisés pour interagir avec le moteur.
  • Léger et performant Conçu pour exécuter des workloads conteneurs avec un faible overhead.

Installation de containerd

L’installation de containerd dépend de vos besoins. Si vous cherchez à simplement exécuter des conteneurs localement, vous pouvez installer containerd seul.

Desinstallation de Docker

Si vous souhaitez basculer de Docker à containerd couplé à nerdctl, voici un guide détaillé pour une transition propre. Nous allons commencer par désinstaller complètement Docker, puis ré-installer containerd.io et nerdctl.

Avant tout, supprimons Docker, ainsi que les conteneurs, images et volumes associés.

  1. Arrêtez et désinstallez Docker :

    Terminal window
    sudo systemctl stop docker
    sudo systemctl stop docker.socket
    sudo apt purge -y docker-ce docker-ce-cli containerd.io
    sudo apt autoremove -y
  2. Supprimez les fichiers de configuration et les données Docker :

    Terminal window
    sudo rm -rf /var/lib/docker
    sudo rm -rf /etc/docker
    sudo rm -rf /var/lib/containerd
    sudo rm -rf /var/run/docker.sock
  3. Vérifiez que Docker n’est plus installé :

    Terminal window
    docker --version # Cela devrait renvoyer une erreur.

Installation de containerd.io

containerd est le moteur de conteneurs utilisé par nerdctl. Suivez ces étapes pour l’installer :

  1. Installez les prérequis :

    Terminal window
    sudo apt update
    sudo apt install -y ca-certificates curl gnupg lsb-release
  2. Ajoutez le dépôt Docker (qui contient containerd.io) :

    Terminal window
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt update
  3. Installez containerd.io :

    Terminal window
    sudo apt install -y containerd.io uidmap
  4. Configurez containerd pour qu’il utilise runc :

    Terminal window
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    sudo systemctl restart containerd

Installation de buildkit

nerdctl utilise buildkit pour la construction d’images. Voici comment l’installer :

Terminal window
VERSION=v$(curl -s https://api.github.com/repos/moby/buildkit/releases/latest | grep tag_name | cut -d '"' -f 4| sed 's/^v//')
wget https://github.com/moby/buildkit/releases/download/${VERSION}/buildkit-${VERSION}.linux-amd64.tar.gz
sudo tar -xvf buildkit-${VERSION}.linux-amd64.tar.gz -C /usr/local/
containerd-rootless-setuptool.sh install-buildkit

Installation des plugins CNI

Pour gérer les réseaux de conteneurs, vous aurez besoin de plugins CNI. Voici comment les installer :

Terminal window
sudo apt install docker-ce-rootless-extras
wget https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-amd64-v1.6.2.tgz
sudo mkdir -p /opt/cni/bin
sudo tar -xvf cni-plugins-linux-amd64-v1.6.2.tgz -C /opt/cni/bin
containerd-rootless-setuptool.sh install

Configuration de containerd

La configuration de containerd est définie dans un fichier config.toml. Par défaut, ce fichier est situé dans /etc/containerd/config.toml. Cette configuration contrôle divers aspects, comme le chemin des sockets, les plugins activés ou désactivés, et les options réseau.

Voici une explication détaillée d’une configuration typique installé avec docker :

disabled_plugins = ["cri"]
#root = "/var/lib/containerd"
#state = "/run/containerd"
#subreaper = true
#oom_score = 0
#[grpc]
# address = "/run/containerd/containerd.sock"
# uid = 0
# gid = 0
#[debug]
# address = "/run/containerd/debug.sock"
# uid = 0
# gid = 0
# level = "info"
disabled_plugins = ["cri"]
  • Ce paramètre désactive le plugin CRI (Container Runtime Interface) utilisé pour intégrer containerd avec Kubernetes.

Personnalisation et activation

  1. Générer un fichier de configuration par défaut : Si le fichier config.toml n’existe pas, générez-le :

    Terminal window
    sudo containerd config default > /etc/containerd/config.toml
  2. Modifier le fichier : Éditez le fichier avec votre éditeur préféré :

    Terminal window
    sudo nano /etc/containerd/config.toml
  3. Redémarrer le service :

    Après toute modification, redémarrez containerd pour appliquer les changements :

    Terminal window
    sudo systemctl restart containerd

En ajustant cette configuration selon vos besoins, vous pouvez optimiser containerd pour votre environnement, qu’il s’agisse d’une utilisation en standalone ou intégré dans un cluster Kubernetes. 😊

Utilisation de la CLI ctr

La commande ctr est l’outil CLI natif fourni avec containerd. Bien qu’il soit principalement conçu pour le débogage et les tests, ctr offre un accès direct et granulaire à toutes les fonctionnalités de containerd. Ce n’est pas l’outil recommandé pour une utilisation en production, mais il reste essentiel pour les administrateurs systèmes et les développeurs souhaitant explorer ou interagir directement avec containerd.

  1. Lister les namespaces disponibles : Vérifiez quels namespaces existent sur votre instance de containerd :
Terminal window
sudo ctr namespace list
moby

Si vous voyez moby, cela signifie que Docker utilise ce namespace pour ses conteneurs.

  1. Lister les conteneurs actifs : Dans le namespace default, affichez les conteneurs actuellement en cours d’exécution :
Terminal window
sudo ctr containers list

Dans un autre namespace (par exemple, moby) :

Terminal window
sudo ctr --namespace moby containers list
  1. Télécharger une image : Pour récupérer une image depuis un registre Docker :
Terminal window
sudo ctr images pull docker.io/library/redis:alpine
  1. Lister les images disponibles :

Affichez les images déjà téléchargées :

Terminal window
sudo ctr images list
  1. Lancer un conteneur interactif : Pour exécuter un conteneur à partir d’une image :
Terminal window
sudo ctr run --rm -t docker.io/library/redis:alpine my-redis

Explications :

  • --rm : supprime le conteneur après l’exécution.
  • -t : lance un terminal interactif.
  • my-redis : nom du conteneur.
  1. Supprimer une image : Pour supprimer une image inutilisée :
Terminal window
sudo ctr images remove docker.io/library/redis:alpine
  • Inspecter un conteneur : Pour obtenir les métadonnées d’un conteneur :

    Terminal window
    sudo ctr containers info <CONTAINER_ID>

Conclusion

Containerd est un moteur léger et performant, essentiel dans l’écosystème des conteneurs. Que ce soit en standalone ou intégré à Docker et Kubernetes, il s’adapte à vos besoins grâce à sa modularité et ses fonctionnalités avancées.

Simple à configurer et puissant à utiliser, il constitue un atout majeur pour gérer vos workloads conteneurs avec fiabilité. Avec containerd, vous êtes prêt à optimiser vos environnements modernes en toute simplicité. 🚀