Aller au contenu
Conteneurs & Orchestration medium

nerdctl : CLI compatible Docker pour containerd

16 min de lecture

Logo nerdctl

nerdctl est une CLI pour containerd qui offre une compatibilité complète avec les commandes Docker. Vous pouvez exécuter des conteneurs, construire des images et utiliser Compose sans Docker — tout en bénéficiant de fonctionnalités avancées comme le lazy pulling, le chiffrement d’images et les checkpoints.

Ce guide couvre l’installation de nerdctl v2.2, les commandes essentielles testées, la gestion des réseaux et volumes, ainsi que les fonctionnalités avancées v2.x. Prérequis : containerd installé et fonctionnel.

  • Installer nerdctl sur Linux (binaire ou bundle complet)
  • Utiliser les commandes de base : run, ps, logs, exec, inspect
  • Gérer réseaux et volumes personnalisés
  • Utiliser Compose pour les applications multi-conteneurs
  • Exploiter les fonctionnalités v2.x : checkpoint, manifest, stats
CritèreDockernerdctl
Daemondockerd obligatoirecontainerd uniquement
LicenceDocker Desktop payant (entreprises)100% open source (Apache 2.0)
Lazy pullingNon natifStargz, Nydus, OverlayBD, SOCI
Images chiffréesNonocicrypt intégré
Distribution P2PNonIPFS natif
CheckpointsExpérimentalSupport CRIU stable
Mode rootlessComplexebypass4netns optimisé

nerdctl n’est pas un fork de Docker — c’est un outil natif pour containerd qui reprend la syntaxe Docker pour faciliter l’adoption.

nerdctl propose deux méthodes d’installation : le binaire seul (si containerd est déjà installé) ou le bundle complet (containerd + BuildKit + CNI plugins inclus).

Cette méthode suppose que containerd est déjà installé et fonctionnel.

  1. Télécharger la dernière version

    Fenêtre de terminal
    VERSION="2.2.1"
    wget https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-${VERSION}-linux-amd64.tar.gz
  2. Installer le binaire

    Fenêtre de terminal
    sudo tar -xvf nerdctl-${VERSION}-linux-amd64.tar.gz -C /usr/local/bin
    sudo chmod +x /usr/local/bin/nerdctl
  3. Vérifier l’installation

    Fenêtre de terminal
    nerdctl --version

    Résultat attendu :

    nerdctl version 2.2.1

Après l’installation, vérifiez que nerdctl communique correctement avec containerd :

Fenêtre de terminal
sudo nerdctl info

Résultat attendu :

Client:
Namespace: default
Debug Mode: false
Server:
Server Version: v2.2.1
Storage Driver: overlayfs
Cgroup Driver: systemd
Cgroup Version: 2
Kernel Version: 6.8.0-100-generic
Operating System: Ubuntu 24.04.2 LTS
CPUs: 16
Total Memory: 46.83GiB

nerdctl reprend la syntaxe Docker. Voici les commandes de base testées avec sorties réelles.

Fenêtre de terminal
# Conteneur éphémère (--rm)
sudo nerdctl run --rm alpine:3.19 cat /etc/os-release

Résultat :

NAME="Alpine Linux"
VERSION_ID=3.19.9
PRETTY_NAME="Alpine Linux v3.19"
HOME_URL="https://alpinelinux.org/"
Fenêtre de terminal
# Nginx sur le port 8080
sudo nerdctl run -d --name mon-nginx -p 8080:80 nginx:alpine

Résultat :

234f3562467bd41fe58d0ece451bb2ff479d25fb9c4e740e513a38a58cd2c3e2
Fenêtre de terminal
sudo nerdctl ps

Résultat :

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
234f3562467b docker.io/library/nginx:alpine "/docker-entrypoint.…" 5 minutes ago Up 0.0.0.0:8080->80/tcp mon-nginx

Ajoutez -a pour voir aussi les conteneurs arrêtés.

Fenêtre de terminal
sudo nerdctl logs mon-nginx | tail -5

Résultat :

2026/02/13 07:10:47 [notice] 1#1: nginx/1.29.5
2026/02/13 07:10:47 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)
2026/02/13 07:10:47 [notice] 1#1: OS: Linux 6.8.0-100-generic
2026/02/13 07:10:47 [notice] 1#1: start worker processes
/docker-entrypoint.sh: Configuration complete; ready for start up
Fenêtre de terminal
sudo nerdctl exec mon-nginx cat /etc/nginx/nginx.conf | head -10

Résultat :

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
Fenêtre de terminal
sudo nerdctl inspect mon-nginx --format '{{.State.Status}} - {{.NetworkSettings.IPAddress}}'

Résultat :

running - 10.4.0.3
Fenêtre de terminal
sudo nerdctl stop mon-nginx
sudo nerdctl rm mon-nginx
Fenêtre de terminal
sudo nerdctl stats --no-stream

Résultat :

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
234f3562467b mon-nginx 0.00% 12.85MiB / 46.83GiB 0.03% 1.45kB / 822B 0B / 20.5kB 17
Fenêtre de terminal
sudo nerdctl top mon-nginx

Résultat :

UID PID PPID CMD
root 3777377 3777339 nginx: master process nginx -g daemon off;
message+ 3777625 3777377 nginx: worker process
Fenêtre de terminal
sudo nerdctl pull alpine:3.19
Fenêtre de terminal
sudo nerdctl images

Résultat :

REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
alpine 3.19 6baf43584bcb 2 weeks ago linux/amd64 8.081MB 3.421MB
nginx alpine b76de378d572 2 weeks ago linux/amd64 47.01MB 18.08MB
Fenêtre de terminal
sudo nerdctl rmi alpine:3.19
Fenêtre de terminal
# Créer un Dockerfile simple
cat > /tmp/Dockerfile << 'EOF'
FROM alpine:3.19
RUN apk add --no-cache curl
CMD ["echo", "Hello from nerdctl!"]
EOF
# Construire l'image
sudo nerdctl build -t mon-image:v1 /tmp
Fenêtre de terminal
sudo nerdctl network create mon-reseau --subnet 172.28.0.0/24

Résultat :

b047bfb73f50a1a7ff26f4264e82dd94d43096fa70c48a1bdf5b67cf4188ab52
Fenêtre de terminal
sudo nerdctl network ls

Résultat :

NETWORK ID NAME FILE
containerd-net /etc/cni/net.d/10-containerd-net.conflist
b047bfb73f50 mon-reseau /etc/cni/net.d/default/nerdctl-mon-reseau.conflist
17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist
host
none
Fenêtre de terminal
sudo nerdctl run -d --name app --network mon-reseau nginx:alpine
Fenêtre de terminal
sudo nerdctl network rm mon-reseau
Fenêtre de terminal
sudo nerdctl volume create mes-donnees
Fenêtre de terminal
sudo nerdctl volume ls

Résultat :

VOLUME NAME DIRECTORY
mes-donnees /var/lib/nerdctl/1935db59/volumes/default/mes-donnees/_data
Fenêtre de terminal
sudo nerdctl run -d --name db -v mes-donnees:/data redis:alpine
Fenêtre de terminal
sudo nerdctl volume rm mes-donnees

nerdctl intègre une compatibilité native avec Docker Compose. Pas besoin d’installer docker-compose.

compose.yaml
services:
web:
image: nginx:alpine
ports:
- "8889:80"
redis:
image: redis:alpine
Fenêtre de terminal
sudo nerdctl compose up -d

Résultat :

INFO[0000] Creating network myapp_default
INFO[0000] Ensuring image redis:alpine
INFO[0005] Ensuring image nginx:alpine
INFO[0005] Creating container myapp-redis-1
INFO[0005] Creating container myapp-web-1
Fenêtre de terminal
sudo nerdctl compose ps

Résultat :

NAME IMAGE COMMAND SERVICE STATUS PORTS
myapp-web-1 docker.io/library/nginx:alpine "/docker-entrypoint.…" web running 0.0.0.0:8889->80/tcp
myapp-redis-1 docker.io/library/redis:alpine "docker-entrypoint.s…" redis running
Fenêtre de terminal
# Arrêter les services
sudo nerdctl compose down
# Avec suppression des volumes
sudo nerdctl compose down -v

Les checkpoints permettent de sauvegarder l’état d’un conteneur en cours d’exécution pour le restaurer plus tard. Utile pour la migration ou le debugging.

Fenêtre de terminal
# Créer un checkpoint
sudo nerdctl checkpoint create mon-conteneur checkpoint-1
# Lister les checkpoints
sudo nerdctl checkpoint ls mon-conteneur
# Supprimer un checkpoint
sudo nerdctl checkpoint rm mon-conteneur checkpoint-1

Créez et gérez des images multi-architecture :

Fenêtre de terminal
# Créer un manifest
sudo nerdctl manifest create mon-image:latest \
mon-image:amd64 \
mon-image:arm64
# Inspecter un manifest
sudo nerdctl manifest inspect mon-image:latest
# Pousser vers un registre
sudo nerdctl manifest push mon-image:latest
# Supprimer un manifest local
sudo nerdctl manifest rm mon-image:latest
Fenêtre de terminal
# Exporter un conteneur vers une archive
sudo nerdctl container export mon-conteneur > conteneur.tar
# Importer comme image
sudo nerdctl image import conteneur.tar mon-image:imported

Exécutez des conteneurs sans privilèges root pour une sécurité renforcée.

  1. Installer les prérequis

    Fenêtre de terminal
    sudo apt install uidmap rootlesskit
  2. Configurer containerd en mode rootless

    Fenêtre de terminal
    containerd-rootless-setuptool.sh install
  3. Utiliser nerdctl sans sudo

    Fenêtre de terminal
    nerdctl run --rm alpine:3.19 echo "Hello rootless!"

Le lazy pulling permet de démarrer un conteneur avant que l’image soit entièrement téléchargée. Idéal pour les images volumineuses.

Snaphotters supportés :

  • Stargz : format eStargz optimisé
  • Nydus : accélérateur d’images cloud-native
  • OverlayBD : couche block-device
  • SOCI : Seekable OCI (Amazon)
Fenêtre de terminal
# Utiliser le snapshotter stargz
sudo nerdctl --snapshotter stargz run ghcr.io/stargz-containers/nginx:1.23-esgz

Partagez des images en peer-to-peer sans registre central :

Fenêtre de terminal
# Pousser une image vers IPFS
sudo nerdctl push ipfs://mon-image:latest
# Exécuter depuis IPFS
sudo nerdctl run ipfs://<CID>

Signez et vérifiez vos images pour garantir leur intégrité :

Fenêtre de terminal
# Signer lors du push
sudo nerdctl push --sign=cosign mon-registre/mon-image:latest
# Vérifier lors du pull
sudo nerdctl pull --verify=cosign mon-registre/mon-image:latest

Voir le guide Cosign pour la configuration complète.

ProblèmeCause probableSolution
permission deniedPas les droits rootUtiliser sudo ou configurer rootless
failed to ping buildkitdBuildKit non démarrésudo systemctl start buildkit
network not foundRéseau supprimé ou inexistantnerdctl network ls puis recréer
image not foundImage non présente localementnerdctl pull image:tag
container already existsNom de conteneur déjà utilisénerdctl rm nom ou choisir un autre nom
cgroup driver mismatchcontainerd/kubelet mal configurésAligner les drivers cgroup
Fenêtre de terminal
# Vérifier l'état de containerd
sudo systemctl status containerd
# Voir les logs containerd
sudo journalctl -u containerd -f
# Vérifier la configuration nerdctl
sudo nerdctl info
# Nettoyer les ressources inutilisées
sudo nerdctl system prune -a
  • Privilégiez le mode rootless pour les environnements de développement
  • Signez vos images avec Cosign avant de les déployer
  • Limitez les capacités avec --cap-drop=ALL --cap-add=<nécessaire>
  • Utilisez des images chiffrées pour les données sensibles
  • Nommez vos conteneurs avec --name pour faciliter la gestion
  • Utilisez des réseaux personnalisés pour isoler les applications
  • Préférez les volumes nommés aux bind mounts pour les données persistantes
  • Tagguez vos images avec des versions précises (pas latest)
  • Activez le lazy pulling pour les grandes images
  • Utilisez le cache BuildKit pour accélérer les builds
  • Configurez les limites de ressources avec --memory et --cpus
  1. nerdctl remplace Docker CLI avec une compatibilité complète et zéro dépendance à dockerd
  2. Syntaxe identique : nerdctl run, nerdctl build, nerdctl compose fonctionnent comme Docker
  3. Fonctionnalités avancées : lazy pulling, chiffrement, IPFS, checkpoints non disponibles dans Docker
  4. Mode rootless : sécurité renforcée avec bypass4netns pour les performances
  5. Compose intégré : pas besoin d’installer docker-compose séparément
  6. Bundle complet : nerdctl-full inclut containerd, runc, BuildKit et CNI plugins
  7. Checkpoints v2.2 : sauvegardez et restaurez l’état des conteneurs avec CRIU
  8. Manifests multi-arch : créez des images pour plusieurs architectures facilement

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.