Votre propre registre d'images
Quand vous avez besoin de votre propre registre, comment le configurer avec un mot de passe et un certificat, combien d'espace disque il consomme, et comment éviter qu'il ne devienne un dépotoir d'anciennes images.
Mis à jour le 23 août 2026
Un registre est un dépôt d'images. Il vous en faut un dans trois cas : les images sont privées et ne doivent pas quitter votre infrastructure, les builds sont fréquents et les limites de téléchargement externes vous gênent, ou vous déployez la même chose sur plusieurs machines.
Option simple : registry:2
services:
registry:
image: registry:2
restart: unless-stopped
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- ./data:/var/lib/registry
- ./auth:/auth:ro
ports:
- "127.0.0.1:5000:5000"
Créez le mot de passe comme ceci :
mkdir -p auth
docker run --rm --entrypoint htpasswd httpd:2 -Bbn deploy 'long-password' > auth/htpasswd
docker compose up -d
N'exposez pas le port vers l'extérieur : un serveur web avec un certificat se place devant le registre. Docker refuse de fonctionner avec un registre tiers en HTTP — et à juste titre, car du code exécutable arrive sur vos machines par son intermédiaire.
Travailler avec le registre
docker login registry.example.com
docker tag myapp:1.5.0 registry.example.com/myapp:1.5.0
docker push registry.example.com/myapp:1.5.0
docker pull registry.example.com/myapp:1.5.0
curl -u deploy https://registry.example.com/v2/_catalog
curl -u deploy https://registry.example.com/v2/myapp/tags/list
Après docker login, les identifiants se trouvent dans ~/.docker/config.json en clair (le base64 n'est pas du chiffrement). Sur les machines de build, créez un compte séparé avec des droits en lecture seule.
Un registre sans limite de taille ni nettoyage est le moyen le plus rapide de remplir un disque. Chaque build ajoute des couches, et supprimer un tag ne libère pas d'espace : il faut un garbage collection. Sur VDS-1 avec 40 GB, le registre d'un projet actif remplira le disque en quelques semaines.
Nettoyage
Suppression d'un tag et garbage collection qui suit :
docker compose exec registry registry garbage-collect \
--delete-untagged /etc/docker/registry/config.yml
Vous devez arrêter le registre pendant que le garbage collection s'exécute — sinon un push simultané peut perdre des couches :
docker compose stop registry
docker compose run --rm registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
docker compose start registry
Configurez cela comme une tâche planifiée une fois par semaine et surveillez l'espace disque.
Alternative : un registre intégré à un serveur Git
Si vous avez déjà mis en place Forgejo ou Gitea, ils disposent d'un dépôt de paquets intégré, y compris pour les images Docker. Vous n'avez pas besoin d'un service séparé : l'accès passe par les mêmes comptes, et les images sont visibles à côté du code. Pour les petits projets, c'est plus pratique qu'un registry:2 autonome.
Erreurs courantes
- Le registre est ouvert sans autorisation. Par son intermédiaire, quelqu'un peut déposer une image qui sera déployée sur votre propre machine de production.
- Le tag
latestau lieu des versions. Le registre cesse d'être une source de reproductibilité : on ne sait plus ce qui est déployé exactement. Voir mise à jour des conteneurs. - Le stockage sur le même disque que la base de données. Un pic de push consomme la bande passante du disque et ralentit le service de production — voir vitesse du disque.
- Le répertoire
./datan'est pas dans vos sauvegardes. Vous perdrez toutes les images dont vous n'avez pas les sources sous la main. Voir ce qu'il faut sauvegarder.