Docker-logrotatie: voorkom dat logs uw VPS-schijf vullen

11 min leestijd·Matthieu·linuxdisk-managementloggingdocker-composedocker|

Docker's standaard log driver slaat onbeperkt data op. Een enkele drukke container kan een 50GB VPS-schijf in dagen vullen. Deze tutorial configureert globale logrotatie, per-service Compose-overrides, geautomatiseerde opschoning en monitoring van schijfgebruik.

Docker's standaard logconfiguratie kent geen maximale grootte. Elke regel die uw containers naar stdout of stderr schrijven, wordt voor onbepaalde tijd op schijf opgeslagen. Op een VPS met 25GB of 50GB opslagruimte kan een enkele praatzieke container alle beschikbare ruimte in dagen opgebruiken.

Deze tutorial lost dat op. U configureert globale logrotatie, stelt per-service limieten in met Docker Compose, automatiseert schijfopruiming en stelt monitoring in zodat het probleem u nooit overvalt.

Alle commando's zijn getest op Debian 12 en Ubuntu 24.04 met Docker Engine 28.x/29.x.

Vereisten:

  • Een VPS met Debian 12 of Ubuntu 24.04 waarop Docker is geïnstalleerd
  • SSH-toegang met een sudo-gebruiker
  • Basiskennis van Docker en Docker Compose

Waarom vullen Docker-containerlogs uw schijf?

Docker's standaard log driver is json-file. Deze vangt alles op wat een container naar stdout en stderr schrijft en slaat het op als JSON in /var/lib/docker/containers/<container-id>/<container-id>-json.log. Standaard is er geen maximale grootte en geen rotatie. Het bestand groeit totdat uw schijf vol is.

Een Node.js-applicatie die op INFO-niveau logt, produceert ruwweg 50MB per dag. Een reverse proxy onder gemiddeld verkeer kan 200MB of meer genereren. Op een 50GB VPS betekent dit dat een enkele onbeheerde container alle vrije ruimte binnen weken kan opgebruiken.

Wanneer de schijf vol raakt, gaat alles tegelijk kapot: containers kunnen niet schrijven, databases crashen, SSH-sessies kunnen vastlopen en u kunt niet eens meer inloggen om het te repareren.

Hoe controleert u het huidige schijfgebruik?

Voordat u iets wijzigt, meet de schade:

df -h /var/lib/docker

Dit toont hoeveel ruimte Docker's datamap gebruikt. Vervolgens krijgt u een Docker-specifiek overzicht:

docker system df

Verwachte uitvoer:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          5         3         1.2GB     450MB (37%)
Containers      8         4         3.8GB     3.1GB (81%)
Local Volumes   3         2         500MB     120MB (24%)
Build Cache     12        0         800MB     800MB (100%)

De rij "Containers" toont de grootte van logbestanden. Als dat getal buitenproportioneel groot is, zijn logs het probleem.

Voor een overzicht per container:

docker system df -v

Dit toont elke container met de bijbehorende loggrootte. Zoek de boosdoeners.

Hoe vindt u de grootste logbestanden direct?

Als docker system df het probleem bevestigt, zoek dan precies welke logs ruimte innemen:

sudo find /var/lib/docker/containers/ -name "*-json.log" -exec ls -sh {} + | sort -rh | head -10

Dit toont de 10 grootste containerlogbestanden met hun grootte.

Noodoplossing: nu schijfruimte vrijmaken

Als uw schijf al vol of bijna vol is, los dan eerst het directe probleem op voordat u rotatie configureert.

Een specifiek containerlogbestand afkappen (zonder de container te stoppen):

sudo truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log

Vervang <container-id> door het daadwerkelijke container-ID uit docker ps --no-trunc -q.

Om alle Docker-logbestanden in een keer af te kappen:

sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

Controleer of de ruimte is vrijgekomen:

df -h /var/lib/docker

Dit is een tijdelijke oplossing. De logs groeien weer aan. De volgende secties maken de oplossing permanent.

Hoe configureert u logrotatie in Docker daemon.json?

Het bestand daemon.json stelt standaard logopties in voor alle nieuwe containers. Docker's json-file driver ondersteunt max-size (maximale grootte per logbestand voor rotatie) en max-file (aantal geroteerde bestanden dat bewaard blijft). Alle waarden in log-opts moeten strings zijn, ook getallen.

Maak het daemon-configuratiebestand aan of bewerk het:

sudo nano /etc/docker/daemon.json

Als het bestand niet bestaat, maak het aan. Als het al configuratie bevat (zoals aangepaste registries of DNS), voeg dan de log-driver en log-opts sleutels toe naast de bestaande instellingen.

Aanbevelingen voor grootte per VPS-schijf

Kies waarden op basis van de schijfgrootte van uw VPS:

VPS-schijfgrootte max-size max-file Max log per container Toelichting
25 GB 5m 3 15 MB Krappe schijf; logs minimaal houden
50 GB 10m 5 50 MB Standaard VPS; gebalanceerde retentie
100 GB 25m 5 125 MB Ruime schijf; langere retentie
200 GB+ 50m 5 250 MB Grote schijf; uitgebreide debugging

Voor een 50GB VPS (de meest voorkomende keuze), gebruik deze configuratie:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}

Sla het bestand op en herstart Docker:

sudo systemctl restart docker

Controleer of de nieuwe standaardinstellingen actief zijn:

docker info --format '{{.LoggingDriver}}'

Verwachte uitvoer:

json-file

Bevestig dat de logopties van toepassing zijn op nieuwe containers door er een te starten en te inspecteren:

docker run -d --name log-test alpine echo "test" && docker inspect --format '{{.HostConfig.LogConfig}}' log-test && docker rm log-test

Verwachte uitvoer:

{json-file map[max-file:5 max-size:10m]}

Wat gebeurt er met draaiende containers na het wijzigen van daemon.json?

Bestaande containers behouden hun oorspronkelijke logconfiguratie. De nieuwe instellingen gelden alleen voor containers die na de herstart zijn aangemaakt. Draaiende containers moeten opnieuw worden aangemaakt om de nieuwe standaardinstellingen over te nemen.

Als u Docker Compose gebruikt:

docker compose down && docker compose up -d

Voor zelfstandige containers: stop en verwijder ze, en start ze opnieuw. De --force-recreate vlag werkt ook:

docker compose up -d --force-recreate

Controleer of een specifieke container de nieuwe configuratie gebruikt:

docker inspect --format '{{.HostConfig.LogConfig}}' <container-name>

Verwachte uitvoer:

{json-file map[max-file:5 max-size:10m]}

Hoe stelt u loglimieten in met Docker Compose?

Per-service logconfiguratie in Docker Compose overschrijft de daemon.json standaardinstellingen. Hiermee kunt u praatzieke services strakkere limieten geven en stille services meer ruimte.

Voeg het logging-blok toe onder elke service:

services:
  web:
    image: nginx:alpine
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "3"
    ports:
      - "80:80"

  api:
    image: node:22-alpine
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "5"
    ports:
      - "3000:3000"

Om herhaling van het logging-blok in elke service te voorkomen, gebruik een YAML anchor:

x-logging: &default-logging
  logging:
    driver: json-file
    options:
      max-size: "10m"
      max-file: "5"

services:
  web:
    image: nginx:alpine
    <<: *default-logging
    ports:
      - "80:80"

  api:
    image: node:22-alpine
    <<: *default-logging
    ports:
      - "3000:3000"

  worker:
    image: myapp/worker:latest
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "3"

De worker-service overschrijft het anchor met eigen limieten. Alle andere services krijgen de gedeelde configuratie.

Pas de configuratie toe:

docker compose up -d --force-recreate

Controle:

docker inspect --format '{{.HostConfig.LogConfig}}' web

Wat is het verschil tussen de json-file, local en journald log drivers?

Docker wordt geleverd met drie log drivers die logs op de host opslaan. Elk heeft andere afwegingen. De json-file driver is de standaard. De local driver is Docker's aanbevolen vervanging voor schijfefficiency. De journald driver integreert met systemd's journal.

Eigenschap json-file local journald
Standaard rotatie Geen Ja (100MB totaal) Beheerd door journald
Compressie Optioneel (compress: "true") Standaard ingeschakeld Beheerd door journald
docker logs ondersteuning Ja Ja Ja
Logformaat JSON (leesbaar) Binair (intern) Binair (journald)
Toegang externe tools Eenvoudig (platte tekstbestanden) Niet ondersteund Via journalctl
Standaard max-size Onbeperkt 20MB per bestand Ingesteld in journald.conf
Standaard max-file 1 (geen rotatie) 5 bestanden N.v.t.

Wanneer welke driver gebruiken

json-file is de veilige standaard. Het werkt overal, ondersteunt docker logs en de logbestanden zijn platte JSON die elke tool kan verwerken. Voeg max-size en max-file toe en het werkt goed voor de meeste VPS-opstellingen.

local is beter voor schijfefficiency. Compressie staat standaard aan, rotatie is ingebouwd (5 bestanden van 20MB = 100MB per container) en u hoeft niets te configureren. De keerzijde: logbestanden gebruiken een intern binair formaat. Externe log shippers die bestanden direct lezen (zoals Filebeat in bestandsmodus) kunnen ze niet verwerken. Als u logs alleen via docker logs leest of via een Docker logging plugin verstuurt, schakel dan over naar local.

journald is de juiste keuze als u systemd's journal al gebruikt voor al uw andere services en containerlogs op dezelfde plek wilt hebben. Rotatie wordt afgehandeld door journald's eigen configuratie (/etc/systemd/journald.conf). U leest logs met journalctl in plaats van docker logs (hoewel docker logs nog steeds werkt).

Hoe schakelt u over naar de local driver?

Bewerk /etc/docker/daemon.json:

{
  "log-driver": "local",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}

Herstart Docker:

sudo systemctl restart docker

Controle:

docker info --format '{{.LoggingDriver}}'

Verwachte uitvoer:

local

Maak containers opnieuw aan om de nieuwe driver toe te passen:

docker compose up -d --force-recreate

Hoe gebruikt u de journald driver?

Bewerk /etc/docker/daemon.json:

{
  "log-driver": "journald"
}

Herstart Docker:

sudo systemctl restart docker

Lees logs voor een specifieke container:

sudo journalctl CONTAINER_NAME=mycontainer --no-pager -n 50

Logs in real time volgen:

sudo journalctl CONTAINER_NAME=mycontainer -f

Journald-rotatie wordt geregeld in /etc/systemd/journald.conf. Belangrijke instellingen:

[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=7day

Na het bewerken, herstart journald:

sudo systemctl restart systemd-journald

Hoe automatiseert u Docker-opruiming met cron of systemd timers?

Logrotatie voorkomt dat individuele containers onbegrensd groeien. Maar Docker verzamelt ook gestopte containers, ongebruikte images, achtergebleven build cache en verweesde netwerken. docker system prune ruimt deze op.

Wat verwijdert docker system prune precies?

Standaard verwijdert docker system prune:

  • Alle gestopte containers
  • Alle netwerken die niet door een draaiende container worden gebruikt
  • Alle dangling images (ongetagde images die niet door een container worden gerefereerd)
  • Alle ongebruikte build cache

Het verwijdert niet:

  • Draaiende containers
  • Benoemde volumes (uw databasegegevens zijn veilig)
  • Getagde images die nog worden gerefereerd
  • Images die door draaiende containers worden gebruikt

De --all vlag verwijdert daarnaast alle ongebruikte images (niet alleen dangling). De --volumes vlag voegt anonieme volumes toe aan de opruiming. Gebruik --volumes met voorzichtigheid: het vernietigt gegevens in anonieme volumes.

Optie 1: cron-taak

Maak een wekelijkse prune-taak aan:

sudo crontab -e

Voeg toe:

0 3 * * 0 /usr/bin/docker system prune -f >> /var/log/docker-prune.log 2>&1

Dit draait elke zondag om 03:00 uur. De -f vlag slaat de bevestigingsprompt over. Uitvoer gaat naar een logbestand voor controle.

Controleer of de crontab is opgeslagen:

sudo crontab -l

Optie 2: systemd timer (aanbevolen)

Systemd timers zijn betrouwbaarder dan cron. Ze loggen naar het journal, verwerken gemiste runs (als de server uit stond) en zijn eenvoudiger te monitoren.

Maak de service unit aan:

sudo nano /etc/systemd/system/docker-prune.service
[Unit]
Description=Docker system prune
Wants=docker.service
After=docker.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -f --filter "until=168h"

De --filter "until=168h" vlag prunt alleen objecten ouder dan 7 dagen. Dit beschermt recent gestopte containers die u mogelijk wilt inspecteren.

Maak de timer aan:

sudo nano /etc/systemd/system/docker-prune.timer
[Unit]
Description=Run Docker prune weekly

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true
RandomizedDelaySec=1800

[Install]
WantedBy=timers.target

Persistent=true betekent dat als de server uit stond tijdens het geplande tijdstip, de taak bij de volgende opstart wordt uitgevoerd. RandomizedDelaySec verdeelt de belasting als u meerdere servers hebt.

Activeer en start de timer:

sudo systemctl daemon-reload
sudo systemctl enable --now docker-prune.timer

enable zorgt ervoor dat de timer herstarts overleeft. --now start hem direct.

Controleer of de timer actief is:

sudo systemctl status docker-prune.timer

Bekijk wanneer hij de volgende keer draait:

sudo systemctl list-timers docker-prune.timer

Test handmatig:

sudo systemctl start docker-prune.service

Bekijk het resultaat:

sudo journalctl -u docker-prune.service --no-pager -n 20

Hoe ruimt u Docker-volumes veilig op?

Volumes bevatten persistente gegevens: databases, uploads, configuratie. Wees hier voorzichtig.

Toon alle volumes en hun gebruik:

docker volume ls

Toon alleen volumes die niet aan een container zijn gekoppeld:

docker volume ls -f dangling=true

Verwijder dangling volumes:

docker volume prune -f

Dit verwijdert alleen volumes die momenteel niet door een container (draaiend of gestopt) worden gebruikt. Benoemde volumes die aan gestopte containers zijn gekoppeld, zijn veilig.

Controleer wat er overblijft:

docker volume ls

Voer nooit docker volume prune direct na docker system prune --volumes uit. De system prune met --volumes handelt volume-opruiming al af. Beide uitvoeren is op zijn best overbodig.

Om een specifiek volume te verwijderen dat u als onnodig hebt geïdentificeerd:

docker volume rm <volume-name>

Controleer altijd welke gegevens een volume bevat voordat u het verwijdert:

docker volume inspect <volume-name>

Het Mountpoint-veld toont waar de gegevens zich op schijf bevinden. U kunt de inhoud inspecteren:

sudo ls -la $(docker volume inspect --format '{{.Mountpoint}}' <volume-name>)

Hoe monitort u Docker-schijfgebruik op een VPS?

Geautomatiseerde monitoring voorkomt verrassingen. Deze sectie stelt een drempelwaarschuwing in die het Docker-schijfgebruik controleert en een waarschuwing stuurt wanneer het een limiet overschrijdt.

Snelle handmatige controle

Voer deze twee commando's uit wanneer u een momentopname wilt:

df -h /var/lib/docker
docker system df

Voor een gedetailleerd overzicht per container en per image:

docker system df -v

Geautomatiseerd waarschuwingsscript

Maak een monitoringscript aan:

sudo nano /usr/local/bin/docker-disk-alert.sh
#!/bin/bash
# Alert when Docker's partition exceeds a usage threshold
THRESHOLD=80
MAILTO="admin@example.com"

USAGE=$(df /var/lib/docker | awk 'NR==2 {gsub(/%/,""); print $5}')

if [ "$USAGE" -ge "$THRESHOLD" ]; then
    DOCKER_DF=$(docker system df 2>&1)
    DISK_DF=$(df -h /var/lib/docker 2>&1)
    TOP_LOGS=$(find /var/lib/docker/containers/ -name "*-json.log" -exec ls -sh {} + 2>/dev/null | sort -rh | head -5)

    BODY="Docker disk usage on $(hostname) is at ${USAGE}%.

Disk usage:
${DISK_DF}

Docker breakdown:
${DOCKER_DF}

Largest log files:
${TOP_LOGS}"

    echo "$BODY" | mail -s "ALERT: Docker disk at ${USAGE}% on $(hostname)" "$MAILTO"
    logger -t docker-disk-alert "Docker disk usage at ${USAGE}% - alert sent"
fi

Stel de rechten in:

sudo chmod 750 /usr/local/bin/docker-disk-alert.sh

Controleer de rechten:

ls -la /usr/local/bin/docker-disk-alert.sh

Verwachte uitvoer:

-rwxr-x--- 1 root root 612 Mar 19 12:00 /usr/local/bin/docker-disk-alert.sh

Het script vereist mailutils (of mailx) voor e-mailbezorging. Installeer het als het ontbreekt:

sudo apt install -y mailutils

Test het script:

sudo /usr/local/bin/docker-disk-alert.sh

Als uw schijfgebruik onder de drempel ligt, gebeurt er niets. Om het waarschuwingspad te testen, zet THRESHOLD=1 tijdelijk in het script, voer het uit en zet het daarna terug.

De waarschuwing plannen met een systemd timer

Maak de service aan:

sudo nano /etc/systemd/system/docker-disk-alert.service
[Unit]
Description=Check Docker disk usage

[Service]
Type=oneshot
ExecStart=/usr/local/bin/docker-disk-alert.sh

Maak de timer aan:

sudo nano /etc/systemd/system/docker-disk-alert.timer
[Unit]
Description=Check Docker disk usage every 6 hours

[Timer]
OnCalendar=*-*-* 00/6:00:00
Persistent=true

[Install]
WantedBy=timers.target

Activeer hem:

sudo systemctl daemon-reload
sudo systemctl enable --now docker-disk-alert.timer

Controle:

sudo systemctl list-timers docker-disk-alert.timer

Probleemoplossing

Schijf is vol en Docker start niet

Als Docker weigert te starten omdat de schijf helemaal vol is:

sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
sudo systemctl start docker

Configureer daarna direct logrotatie zoals hierboven beschreven.

daemon.json-syntaxfout voorkomt dat Docker start

Docker start niet als daemon.json ongeldige JSON bevat. Valideer het bestand:

sudo python3 -m json.tool /etc/docker/daemon.json

Als dit de geformateerde JSON toont, is de syntax geldig. Als het een foutmelding toont, corrigeer dan de aangegeven regel.

Bekijk Docker's foutmelding:

sudo journalctl -u docker.service -n 20 --no-pager

Logs groeien nog steeds na het configureren van rotatie

Rotatie geldt alleen voor nieuwe containers. Bestaande containers behouden hun oorspronkelijke configuratie. Maak ze opnieuw aan:

docker compose up -d --force-recreate

Controleer of de nieuwe configuratie is toegepast:

docker inspect --format '{{.HostConfig.LogConfig}}' <container-name>

docker system prune maakte niet veel ruimte vrij

docker system prune raakt draaiende containers, hun logs of benoemde volumes niet aan. Als het ruimteprobleem specifiek logs betreft, kap de logbestanden af of configureer rotatie. Als het volumes betreft, gebruik dan docker volume prune nadat u hebt gecontroleerd dat er geen benodigde gegevens verloren gaan.

Controleer wat ruimte inneemt:

sudo du -sh /var/lib/docker/*

Dit toont het gebruik per Docker-subsysteem: containers (logs), overlay2 (images/lagen), volumes en overige.

Samenvatting

Een volledige Docker-logbeheeropstelling op een VPS heeft vier lagen:

  1. Globale rotatie in /etc/docker/daemon.json met max-size en max-file voorkomt onbegrensde loggroei voor alle containers.
  2. Per-service overrides in Docker Compose geven praatzieke services strakkere limieten.
  3. Geautomatiseerde opruiming met docker system prune op een systemd timer verwijdert dode containers, ongebruikte images en build cache.
  4. Schijfmonitoring met een waarschuwingsscript signaleert problemen voordat ze uitval veroorzaken.

Na het instellen hiervan, controleer of het werkt: bekijk docker inspect op uw containers, voer docker system df uit om het huidige gebruik te bevestigen en wacht tot de prune-timer minstens een keer is uitgevoerd. Controleer journalctl -u docker-prune.service om te bevestigen dat het is gedraaid.


Copyright 2026 Virtua.Cloud. Alle rechten voorbehouden. Deze inhoud is een origineel werk van het Virtua.Cloud-team. Reproductie, herpublicatie of herdistributie zonder schriftelijke toestemming is verboden.

Klaar om het zelf te proberen?

Houd uw Docker VPS schoon met logrotatie.

Bekijk VPS-aanbod