Docker-logrotatie: voorkom dat logs uw VPS-schijf vullen
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:
- Globale rotatie in
/etc/docker/daemon.jsonmetmax-sizeenmax-filevoorkomt onbegrensde loggroei voor alle containers. - Per-service overrides in Docker Compose geven praatzieke services strakkere limieten.
- Geautomatiseerde opruiming met
docker system pruneop een systemd timer verwijdert dode containers, ongebruikte images en build cache. - 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.