Zot est un registry de conteneurs conçu nativement pour la spécification OCI, développé par Cisco et accepté au CNCF Sandbox en 2022. Contrairement à Distribution qui stocke les images dans un format interne, Zot stocke directement au format OCI Image Layout sur le disque - ce qui signifie qu'on peut inspecter et manipuler les images stockées avec n'importe quel outil OCI standard.
C'est un binaire unique Go sans dépendances externes. Il peut être déployé comme un daemon minimaliste ou enrichi avec des extensions (UI, recherche, synchronisation, scan de vulnérabilités).
Idéal pour : registry léger OCI-natif, edge/IoT, déploiements single-binary, environnements où l'interopérabilité OCI stricte est requise, alternative moderne à Distribution.
Informations essentielles
Origine : Cisco → CNCF Sandbox (2022) · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : GitHub · Documentation · Releases
Support : CNCF Sandbox, projet actif. Versions releases régulières.
Deux variantes de binaire
| Variante | Description |
|---|---|
zot (full) | Toutes les extensions (UI, recherche, sync, métriques) |
zot-minimal | Core uniquement, sans extensions |
Installation
Binaire direct (recommandé)
# Télécharger le binaire
ZOT_VERSION=$(curl -s https://api.github.com/repos/project-zot/zot/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
curl -LO https://github.com/project-zot/zot/releases/download/${ZOT_VERSION}/zot-linux-amd64
chmod +x zot-linux-amd64
sudo mv zot-linux-amd64 /usr/local/bin/zot
zot --version
Image Docker
docker run -d \
--name zot \
-p 5000:5000 \
-v /data/zot:/var/lib/registry \
-v /etc/zot/config.json:/etc/zot/config.json \
ghcr.io/project-zot/zot-linux-amd64:latest
Configuration de base
Zot utilise un fichier JSON pour sa configuration.
{
"distSpecVersion": "1.1.0",
"storage": {
"rootDirectory": "/var/lib/registry"
},
"http": {
"address": "0.0.0.0",
"port": "5000"
},
"log": {
"level": "info"
}
}
# Démarrer zot
zot serve /etc/zot/config.json
Configuration avec TLS et authentification
{
"distSpecVersion": "1.1.0",
"storage": {
"rootDirectory": "/var/lib/registry",
"gc": true,
"gcDelay": "1h",
"gcInterval": "24h"
},
"http": {
"address": "0.0.0.0",
"port": "443",
"tls": {
"cert": "/certs/registry.crt",
"key": "/certs/registry.key"
}
},
"auth": {
"htpasswd": {
"path": "/etc/zot/htpasswd"
}
},
"accessControl": {
"repositories": {
"**": {
"defaultPolicy": ["read"]
}
},
"adminPolicy": {
"users": ["admin"],
"actions": ["read", "create", "update", "delete"]
}
},
"log": {
"level": "info"
}
}
# Créer le fichier htpasswd
htpasswd -Bbn admin MonMotDePasse > /etc/zot/htpasswd
Extensions
Les extensions sont des modules activables dans la configuration.
Interface web (UI)
{
"extensions": {
"ui": {
"enable": true
}
}
}
Accessible sur http://registry.example.com:5000 après activation.
Recherche d'images
{
"extensions": {
"search": {
"enable": true,
"cve": {
"updateInterval": "2h"
}
}
}
}
# Utiliser zli (CLI Zot) pour chercher des images
zli images search nginx
Synchronisation (réplication)
{
"extensions": {
"sync": {
"enable": true,
"registries": [
{
"urls": ["https://registry-1.docker.io"],
"onDemand": true,
"tlsVerify": true,
"content": [
{
"prefix": "library/**",
"tags": {
"regex": ".*alpine.*"
}
}
]
}
]
}
}
}
onDemand: true: les images sont synchronisées au premier pull (proxy cache).onDemand: false: synchronisation planifiée de tout le contenu défini.
Métriques Prometheus
{
"extensions": {
"metrics": {
"enable": true,
"prometheus": {
"path": "/metrics"
}
}
}
}
Signatures Cosign et Notation
Zot supporte nativement les signatures OCI (Cosign et Notation).
# Signer une image avec Cosign après push
cosign sign --key cosign.key registry.example.com/mon-app:latest
# Vérifier la signature
cosign verify --key cosign.pub registry.example.com/mon-app:latest
# Zot stocke la signature comme un OCI artifact lié à l'image
Stockage OCI natif
La particularité de Zot : les images sont stockées au format OCI Image Layout directement sur le disque, ce qui permet de les inspecter sans le daemon Zot.
# Structure du stockage (inspectable directement)
ls /var/lib/registry/
# mon-app/
# index.json
# oci-layout
# blobs/
# sha256/
# abc123...
# Inspecter une image stockée avec oras ou crane (sans Zot)
oras pull registry.example.com/mon-app:latest
Déploiement Kubernetes
# zot-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: zot
namespace: registry
spec:
replicas: 1
selector:
matchLabels:
app: zot
template:
spec:
containers:
- name: zot
image: ghcr.io/project-zot/zot-linux-amd64:latest
args: ["serve", "/etc/zot/config.json"]
ports:
- containerPort: 5000
volumeMounts:
- name: config
mountPath: /etc/zot
- name: data
mountPath: /var/lib/registry
volumes:
- name: config
configMap:
name: zot-config
- name: data
persistentVolumeClaim:
claimName: zot-pvc
Mise à jour
# Remplacer le binaire
ZOT_VERSION=<nouvelle-version>
curl -LO https://github.com/project-zot/zot/releases/download/${ZOT_VERSION}/zot-linux-amd64
chmod +x zot-linux-amd64
sudo systemctl stop zot
sudo mv zot-linux-amd64 /usr/local/bin/zot
sudo systemctl start zot
zot --version
Troubleshooting
Erreur d'accès refusé
# Vérifier la config accessControl
cat /etc/zot/config.json | grep -A 20 accessControl
# Tester avec curl
curl -u admin:password https://registry.example.com/v2/
# Doit retourner {}
Espace disque et GC
# La GC est automatique si configurée (gc: true dans storage)
# Vérifier l'utilisation
du -sh /var/lib/registry/
# Forcer la GC manuellement via l'API (si extension search activée)
curl -X PUT https://registry.example.com/v2/_zot/ext/mgmt?resource=gc
Commandes utiles
# Démarrer
zot serve /etc/zot/config.json
# Version
zot --version
# API standard OCI
curl https://registry.example.com/v2/
curl -u user:pass https://registry.example.com/v2/_catalog
curl -u user:pass https://registry.example.com/v2/<image>/tags/list
# zli - CLI dédié à Zot
zli images list # lister les images
zli images search <terme> # rechercher
zli config add myregistry https://registry.example.com
Ressources
- GitHub : https://github.com/project-zot/zot
- Documentation : https://zotregistry.dev
- CNCF : https://www.cncf.io/projects/zot/
- zli (CLI) : https://github.com/project-zot/zot/tree/main/cmd/zli