Docker : libérer de l'espace disque

mis à jour le 2026-07-01#docker#disque#maintenance

Diagnostiquer d'abord

Avant de supprimer quoi que ce soit, mesure. docker system df ventile l'espace par type (images, conteneurs, volumes, build cache) et surtout la colonne RECLAIMABLE : ce que tu peux récupérer sans risque.

shell
docker system df           # vue d'ensemble / overview
docker system df -v        # détail par image/volume/conteneur / per-item detail
sudo du -h --max-depth=1 /var/lib/docker | sort -hr   # qui pèse quoi sur le disque / what weighs what on disk

Si overlay2/ domine, ce sont les images et layers. Si volumes/ domine, ce sont tes données (prudence). Si containers/ est énorme, ce sont probablement des logs qui gonflent — voir plus bas.

Nettoyer par cible

Nettoie du moins risqué au plus risqué. Conteneurs arrêtés et images dangling (les <none> orphelines laissées par les rebuilds) : sans danger. Le build cache : sans danger aussi, il sera juste reconstruit au prochain build.

shell
docker container prune                 # conteneurs arrêtés / stopped containers
docker image prune                     # images dangling uniquement / dangling images only
docker image prune -a                  # + toute image sans conteneur associé / + any image not used by a container
docker builder prune                   # build cache
docker builder prune --filter until=168h   # cache de plus de 7 jours / cache older than 7 days

Volumes : la zone dangereuse

Les volumes contiennent tes données : bases de données, uploads, configs. Un volume "inutilisé" est juste un volume qu'aucun conteneur ne référence en ce moment — par exemple parce que tu as fait docker compose down avant de nettoyer.

⚠️ Ne lance jamais cette commande sans avoir listé et vérifié ce qu'elle va détruire. Un volume supprimé est irrécupérable.

shell
docker volume ls -f dangling=true      # d'abord : lister les candidats / first: list the candidates
docker volume prune                    # ⚠️ supprime les volumes non référencés / deletes unreferenced volumes

Les logs qui gonflent

Par défaut, le driver json-file écrit les logs de chaque conteneur dans /var/lib/docker/containers/<id>/<id>-json.logsans aucune limite. Un conteneur bavard peut remplir ton disque en quelques semaines. Trouve les coupables :

shell
sudo find /var/lib/docker/containers -name '*-json.log' -exec du -h {} + | sort -hr | head

La vraie solution est de plafonner les logs via le daemon. Dans /etc/docker/daemon.json :

JSON
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
shell
sudo systemctl restart docker

Chaque conteneur sera limité à 3 fichiers de 10 Mo en rotation. Attention : ça ne s'applique qu'aux conteneurs créés après le redémarrage — recrée les existants (docker compose up -d --force-recreate) pour en profiter.

Le grand nettoyage

⚠️ docker system prune -a --volumes combine tout : conteneurs arrêtés, toutes les images inutilisées, tout le build cache, tous les réseaux orphelins et tous les volumes non référencés — donc potentiellement tes bases de données si les services sont éteints à ce moment-là. Ne l'utilise que si tu peux répondre "oui" à : "je peux tout perdre sur cette machine ?". Sinon, nettoie cible par cible comme ci-dessus.

shell
docker system prune                    # version prudente : ni images taguées, ni volumes / safe version: no tagged images, no volumes
docker system prune -a --volumes      # ⚠️ tout, y compris les volumes / everything, volumes included