Toen ik voor het eerst met Docker aan de slag ging, kende ik de basis: docker run, docker build, docker ps. Ik dacht dat dat genoeg was. Vervolgens heb ik drie uur geprobeerd uit te zoeken waarom mijn container steeds opnieuw opstartte, nog eens twee uur besteed aan het handmatig vrijmaken van schijfruimte, en een hele middag aan het oplossen van een netwerkprobleem dat met één enkel commando had kunnen worden opgelost.
Docker heeft tientallen krachtige commando's en vlaggen die de meeste ontwikkelaars nooit ontdekken omdat ze niet in de basistutorials staan. Dit zijn de commando's die ik nu bijna dagelijks gebruik – degene die mijn Docker-workflow echt sneller en minder frustrerend hebben gemaakt.
1. Ruim alles direct op met docker system prune
Je Docker-daemon verzamelt in de loop van de tijd rommel: gestopte containers, ongebruikte images, loshangende volumes, oude build-cache. Voordat ik beter wist, verwijderde ik deze handmatig één voor één.
# Verwijder alle ongebruikte containers, netwerken, images en build-cache
docker system prune -a
# Voeg volumes toe aan de opschoning (wees hier voorzichtig mee!)
docker system prune -a --volumes
# Bekijk wat er verwijderd wordt zonder daadwerkelijk te verwijderen
docker system prune -a --dry-run
Ik voer wekelijks docker system prune -a uit als onderdeel van mijn opruimroutine. Dit heeft me al meerdere keren 20-30 GB schijfruimte opgeleverd.
Pro-tip: Voeg dit toe aan je crontab om het te automatiseren:
# Voer elke zondag om 02:00 uur uit
0 2 * * 0 docker system prune -af
2. Controleer schijfgebruik met docker system df
Voordat je blindelings gaat opschonen, kijk je eerst wat er daadwerkelijk ruimte inneemt:
docker system df
# Gedetailleerd overzicht
docker system df -v
De uitvoer laat precies zien hoeveel ruimte images, containers en volumes in beslag nemen. Ik gebruik dit voor en na het opschonen om het effect te zien.
3. Volg containerlogs in realtime
In plaats van herhaaldelijk docker logs uit te voeren, kun je ze volgen met tail -f:
# Volg logs in realtime
docker logs -f container_name
# Toon de laatste 100 regels en volg
docker logs -f --tail 100 container_name
# Toon logs vanaf 10 minuten geleden
docker logs --since 10m container_name
# Toon logs met tijdstempels
docker logs -f -t container_name
De --since-vlag is ongelooflijk handig bij het debuggen van problemen die recent zijn ontstaan. Je hoeft niet meer door duizenden oude logregels te scrollen.
4. Commando's uitvoeren in actieve containers zonder Bash
Iedereen kent docker exec -it container bash, maar wat als de container geen bash heeft?
# Gebruik sh in plaats van bash (werkt op Alpine-images)
docker exec -it container sh
# Voer een enkel commando uit zonder interactieve shell
docker exec container ls -la /app
# Voer uit als een specifieke gebruiker
docker exec -u root container apt-get update
# Stel omgevingsvariabelen in
docker exec -e DEBUG=true container npm test
Ik gebruik de versie met één commando voortdurend voor snelle controles zonder een shell te openen.
5. Bestanden kopiëren naar/vanuit containers
Je hoeft je image niet opnieuw te bouwen of volumes aan te maken om bestanden in of uit te halen:
# Kopieer bestand van host naar container
docker cp myfile.txt container_name:/app/
# Kopieer bestand van container naar host
docker cp container_name:/app/logs.txt ./
# Kopieer de volledige map
docker cp container_name:/app/dist ./dist
# Werkt zelfs met gestopte containers!
docker cp stopped_container:/data ./backup
Dit heeft me talloze keren gered toen ik logs of configuratiebestanden uit een actieve container moest halen zonder opnieuw te bouwen.
6. Inspecteer alles met docker inspect
Haal de volledige JSON-configuratie van elk Docker-object op:
# Een container inspecteren
docker inspect container_name
# Een specifiek veld ophalen met --format
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name
# De omgevingsvariabelen van de container ophalen
docker inspect --format='{{.Config.Env}}' container_name
# Gemonteerde volumes ophalen
docker inspect --format='{{.Mounts}}' container_name
# Werkt ook met images
docker inspect nginx:latest
De --format-vlag met Go-sjablonen is ongelooflijk krachtig. Hier zijn enkele die ik regelmatig gebruik:
# Haal het IP-adres van de container op
docker inspect -f '{{.IPAddress}}{{.IPAddress}}{{end}}' container_name
# Haal de status van de container op
docker inspect -f '{{.State.Status}}' container_name
# Haal de aanmaakdatum van het image op
docker inspect -f '{{.Created}}' image_name
7. Filteren en opmaken met docker ps
docker ps is krachtiger dan de meeste mensen beseffen:
# Alle containers weergeven (inclusief gestopte)
docker ps -a
# Alleen container-ID's weergeven
docker ps -q
# Alleen de laatst aangemaakte container weergeven
docker ps -l
# Aangepaste opmaak
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
# Filteren op status
docker ps --filter "status=exited"
# Filteren op naam
docker ps --filter "name=postgres"
# Filters en aangepaste opmaak combineren
docker ps -a --filter "status=exited" --format "{{.ID}}: {{.Names}}"
Ik gebruik voortdurend aangepaste indelingen in scripts. Bijvoorbeeld om alle containers te stoppen die aan een patroon voldoen:
docker ps -q --filter "name=test_" | xargs docker stop
8. Bekijk realtime resourcegebruik met docker stats
Net als top, maar dan voor containers:
# Bekijk alle actieve containers
docker stats
# Bekijk specifieke containers
docker stats container1 container2
# Toon slechts één keer (geen streaming)
docker stats --no-stream
# Aangepaste opmaak
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Dit is van onschatbare waarde voor het opsporen van geheugenlekken of CPU-pieken. Ik laat dit draaien in een terminal tijdens belastingstests.
9. Bouwen met specifieke doelfasen
Als je multi-stage builds gebruikt, kun je specifieke fasen bouwen:
# Bouw alleen de 'builder'-fase
docker build --target builder -t myapp:builder .
# Handig voor het opsporen van bouwproblemen
docker build --target test -t myapp:test .
Dit is perfect wanneer je tussenliggende build-fasen wilt inspecteren of ontwikkelingsimages wilt maken vanuit hetzelfde Dockerfile.
10. Geef build-argumenten dynamisch door
# Geef variabelen door tijdens het bouwen
docker build --build-arg NODE_ENV=production -t myapp .
# Meerdere argumenten
docker build \
--build-arg VERSION=1.2.3 \
--build-arg BUILD_DATE=$(date -u +'%Y-%S-%dT%H:%M:%mZ') \
-t myapp:1.2.3 .
In je Dockerfile:
ARG NODE_ENV=development
ARG VERSION=latest
FROM node:18
ENV NODE_ENV=${NODE_ENV}
LABEL version=${VERSION}
Ik gebruik dit voor het invoegen van CI/CD-pipelinevariabelen zoals git-commit-hashes en buildnummers.
11. Entrypoint overschrijven voor debugging
Wanneer een container niet start, overschrijf dan het entrypoint:
# Voer bash uit in plaats van het standaard entrypoint
docker run -it --entrypoint bash image_name
# Overschrijf met sh voor Alpine-images
docker run -it --entrypoint sh image_name
# Voer een specifiek commando uit
docker run -it --entrypoint /bin/cat image_name /app/config.yml
Dit heeft me gered toen containers direct bij het opstarten crashten en ik de omgeving moest debuggen.
12. Containers aanmaken zonder ze te starten
Soms wil je een containerconfiguratie aanmaken zonder deze uit te voeren:
# Aanmaken maar niet starten
docker create --name mycontainer nginx
# Inspecteren of wijzigen
docker inspect mycontainer
# Later starten
docker start mycontainer
Handig in scripts waarin je meerdere containers wilt voorbereiden voordat je ze samen start.
Bonus: Krachtige éénregelaars
Hier zijn enkele samengestelde commando's die ik voortdurend gebruik:
# Stop alle actieve containers
docker stop $(docker ps -q)
# Verwijder alle gestopte containers
docker rm $(docker ps -aq -f status=exited)
# Verwijder alle images met de tag ' <none> '
docker rmi $(docker images -f "dangling=true" -q)
# Stop en verwijder een container in één commando
docker rm -f container_name
# Bekijk logs van alle containers met een specifiek label
docker ps -q --filter "label=app=myapp" | xargs -L 1 docker logs
# Exporteer het bestandssysteem van een container als tar
docker export container_name > container_backup.tar
# Sla een image op als tar (behoudt lagen)
docker save -o myimage.tar image_name
# Laad een image vanuit tar
docker load -i myimage.tar
Geavanceerde opmaaktrucs
Docker ondersteunt Go-sjabloonopmaak in veel commando's. Hier zijn enkele geavanceerde voorbeelden:
# Haal alle container-IP's in een netwerk op
docker network inspect bridge --format='{{range .Containers}}{{.IPv4Address}} {{.Repository}}'
# Geef een lijst van images met grootte in MB
docker images --format '{{end}}:{{.Tag}} - {{.Size}}'
# Haal de aanmaaktijd van alle containers op
docker ps -a --format '{{.Names}}: {{.CreatedAt}}'
# Exporteer containerconfiguratie als JSON
docker inspect container_name | jq '.[0].Config'
Mijn dagelijkse Docker-workflowcommando's
Dit zijn de commando's die ik het vaakst uitvoer:
# Ochtendopruiming
docker system prune -f
# Controleer wat er draait en het gebruik van resources
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker stats --no-stream
# Tijdens ontwikkeling - opnieuw bouwen en uitvoeren
docker build -t myapp . && docker run --rm -p 3000:3000 myapp
# Een container met storingen debuggen
docker logs -f --tail 50 container_name
docker exec -it container_name sh
docker inspect container_name | grep -A 10 Env
# Einde van de dag - ontwikkelingscontainers stoppen
docker stop $(docker ps -q --filter "label=env=dev")
Commando's die je uren tijd besparen
Als ik de top 5 commando's zou moeten kiezen die me de meeste tijd hebben bespaard:
docker system prune -a- Directe opschoningdocker logs -f --tail 100- Efficiënt loggen bekijkendocker inspect -f '{{.NetworkSettings.IPAddress}}'- Snel IP opzoekendocker exec container_name command- Commando's uitvoeren zonder shell-overheaddocker stats --no-stream- Snelle controle van resources
Pro-tips
- Gebruik altijd
--rmmetdocker runvoor tijdelijke containers. Deze worden automatisch verwijderd wanneer ze stoppen. - Maak aliassen voor veelgebruikte commando's in je
.bashrcof.zshrc:alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"' alias dclean='docker system prune -af' alias dlogs='docker logs -f --tail 100' - Gebruik
.dockerignoreom builds te versnellen (zie mijn andere artikel over Docker-fouten) - Zet imageversies vast in productie, gebruik
latestalleen in ontwikkeling