Beetje Coderen

Les 4 van 5

Problemen oplossen

Los de bekendste Docker-problemen bij de labs op: unauthorized en andere pull-fouten, arm64 tegenover amd64, poorten, een volle schijf en docker system prune.

📖 ± 7 min lezen ⏱ 30–45 minuten leestijd + oefenen 📝 quiz

Een terminal met een rode foutmelding, een vergrootglas en een gereedschapskist met een moersleutel ernaast

🎯 Na deze les kun je

  • een Docker-foutmelding lezen en de oorzaak vinden
  • pull-fouten zoals unauthorized en not found oplossen
  • uitleggen wat arm64 en amd64 betekenen voor images
  • schijfruimte terugwinnen zonder je werk kwijt te raken

Vroeg of laat geeft Docker een foutmelding. Dat is niet erg: de meldingen zijn meestal behoorlijk precies, als je weet waar je moet kijken. In deze les loop je de problemen langs die bij de labs het vaakst voorkomen, met de oorzaak en de oplossing. Gebruik deze les ook later als naslag.

Eerst: lees de laatste regel

Een Docker-foutmelding begint vaak met algemene tekst en eindigt met de echte oorzaak. Bijvoorbeeld:

docker: Error response from daemon: pull access denied for registry.wizg.it/webhosting/beetjecoderen-web, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.

De nuttige woorden zijn denied, does not exist en docker login. Zoek altijd naar zulke woorden, en kopieer bij twijfel de hele melding als je hulp vraagt.

Downloadfouten (pull)

unauthorized of denied, of de vraag om docker login. De registry wil weten wie je bent voordat je mag downloaden. Bij de lab-images van beetjecoderen.nl is dat op dit moment zo: de registry is nog niet publiek. Typ geen inloggegevens die je ergens hebt gevonden, maar bouw het image zelf (zie les 2):

docker build -t registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest -f python.Dockerfile https://beetjecoderen.nl/labs/lab-images.tar.gz

Vervang python op beide plekken door de taal uit het image dat je nodig hebt. Daarna werkt het docker run-commando uit de les. Docker gebruikt dan het image dat je zelf hebt gebouwd, omdat het die naam al lokaal heeft.

not found of manifest unknown. De naam of tag bestaat niet. Bijna altijd is dat een typefout: lab-pyton-latest, of een hoofdletter waar die niet hoort (imagenamen zijn altijd kleine letters). Kopieer het commando opnieuw uit de les.

TLS handshake timeout, i/o timeout of connection refused. Je internetverbinding of een netwerkfilter houdt de download tegen. Op een school- of bedrijfsnetwerk worden registries soms geblokkeerd; probeer het thuis of via de hotspot van je telefoon.

Cannot connect to the Docker daemon. Dit is geen downloadfout: de engine draait niet. Start Docker Desktop, of op Linux sudo systemctl start docker. Zie les 1.

arm64 en amd64

Processoren spreken verschillende "talen" (architecturen):

  • amd64 (ook x86-64): de meeste Windows-pc's, oudere Macs met Intel, de meeste servers;
  • arm64 (ook aarch64): Macs met Apple silicon (M1 en nieuwer), Raspberry Pi 4/5, sommige nieuwe Windows-laptops.

Een programma in een image is gemaakt voor één architectuur. Veel images, ook de lab-images van beetjecoderen.nl, bestaan daarom in een versie voor amd64 én voor arm64. Docker kiest dan vanzelf de goede. Een image dat je zelf bouwt met docker build, wordt automatisch voor jouw eigen architectuur gemaakt.

Problemen krijg je bij images die alleen voor de andere architectuur bestaan. Je ziet dan bijvoorbeeld:

no matching manifest for linux/arm64/v8 in the manifest list entries

of een waarschuwing:

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)

Wat kun je doen?

  • Kijk welke architectuur je hebt: docker version toont bij Server de regel OS/Arch, bv. linux/arm64.
  • Kijk welke architectuur een image heeft: docker image inspect --format '{{.Architecture}}' <imagenaam>.
  • Bestaat er geen versie voor jouw processor, dan kan Docker Desktop een amd64-image emuleren met --platform linux/amd64 achter docker run. Dat werkt meestal, maar is merkbaar trager. Kan het, bouw het image dan liever zelf.
  • Fout exec format error bij het starten: het programma in de container hoort bij een andere architectuur. Verwijder het image (docker rmi <imagenaam>) en haal of bouw het opnieuw.

Poorten

Een container heeft een eigen netwerk. Start je in een lab een webserver (bijvoorbeeld een PHP- of Python-server op poort 8000), dan kun je die vanaf je eigen browser alleen bereiken als je de poort doorgeeft met -p:

docker run -it --rm -p 8000:8000 -e BEETJE_COURSE=php -e BEETJE_LESSON=5 registry.wizg.it/webhosting/beetjecoderen-web:lab-php-latest

-p 8000:8000 betekent: poort 8000 op je computer gaat naar poort 8000 in de container (links je computer, rechts de container). Voor de meeste labs heb je dit niet nodig. De opdracht vertelt het als het wel zo is. Daarnaast zie je in de lab-images een EXPOSE 7681; die poort hoort bij het live lab in de browser en heb je lokaal niet nodig.

Twee bekende problemen:

  • port is already allocated of address already in use: een ander programma (of een andere container) gebruikt die poort al. Kies links een ander nummer, bv. -p 8081:8000, en open dan http://localhost:8081.
  • De pagina laadt niet, terwijl de server in de container draait. Luistert de server alleen op 127.0.0.1, dan is hij alleen binnen de container bereikbaar. Start hem op 0.0.0.0, bijvoorbeeld php -S 0.0.0.0:8000 of python3 -m http.server 8000 --bind 0.0.0.0.

Schijfruimte

Images, gestopte containers en de bouwcache kosten ruimte. De lab-images zijn al snel honderden MB per stuk. Bekijk wat Docker gebruikt:

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          6         1         2.9GB     2.1GB (72%)
Containers      14        1         120MB     118MB (98%)
Local Volumes   2         1         85MB      40MB (47%)
Build Cache     38        0         1.3GB     1.3GB

De kolom RECLAIMABLE is wat je kunt terugwinnen. Opruimen kan stap voor stap:

docker container prune   # gestopte containers
docker image prune       # images zonder naam (overblijfsels van updates)
docker builder prune     # de bouwcache van docker build

Of alles in één keer met docker system prune. Dat verwijdert:

  • alle gestopte containers;
  • netwerken die niet gebruikt worden;
  • images zonder naam (dangling images);
  • de bouwcache.

Docker vraagt eerst om bevestiging. Twee varianten om voorzichtig mee te zijn:

  • docker system prune -a verwijdert ook alle images die op dat moment door geen enkele container gebruikt worden, dus ook je lab-images. Die moet je daarna opnieuw downloaden of bouwen.
  • docker system prune --volumes verwijdert ook volumes die niet in gebruik zijn. Bewaar je labwerk in een volume (les 3), dan is dat werk weg. Werk je met een bind mount, dan staan je bestanden veilig op je eigen schijf.

Op Windows en macOS staat alles van Docker in één groot bestand van Docker Desktop. Na het opruimen krimpt dat niet altijd meteen. Bij Settings → Resources stel je in hoeveel ruimte en geheugen Docker mag gebruiken.

Overige meldingen

  • the input device is not a TTY: je gebruikt -t in een omgeving zonder echte terminal, zoals Git Bash op Windows (zet winpty voor docker) of in een script (laat -t weg).
  • Permission denied in een gekoppelde map: zie de valkuilen bij rechten in les 3 (--user en eerst mkdir -p).
  • docker: invalid reference format: er zit iets mis in de imagenaam, vaak een hoofdletter, een spatie of een -v-pad met een spatie zonder aanhalingstekens. Docker ziet dan een deel van het pad als imagenaam.

Uitgewerkt voorbeeld: stap voor stap zoeken

Je typt het commando uit de les en krijgt unauthorized. Een goede aanpak:

  1. Lees de laatste regel: unauthorized. Het gaat om toegang tot de registry.
  2. Is het jouw fout? Bij de lab-images niet: de registry vraagt nu nog om een login.
  3. Oplossing: bouw het image zelf met het docker build-commando onder de les.
  4. Controleer: docker images | grep beetjecoderen toont nu het image met de tag lab-…-latest.
  5. Opnieuw: het docker run-commando uit de les start nu wel.

Oefenen

  1. Typ docker system df. Hoeveel ruimte kun je terugwinnen?
  2. Welke architectuur heeft jouw computer volgens docker version?
  3. Leg in je eigen woorden uit waarom docker system prune --volumes gevaarlijk kan zijn, en waarom dat met een bind mount minder geldt.

Samenvatting

  • Lees de laatste regel van een foutmelding: daar staat meestal de oorzaak.
  • unauthorized/denied: de registry vraagt een login. Bouw het lab-image zelf. not found: typefout in de naam.
  • Lab-images bestaan voor amd64 én arm64. Emuleren met --platform linux/amd64 kan, maar is traag.
  • Poort doorgeven met -p computer:container, en laat servers luisteren op 0.0.0.0.
  • docker system df toont het gebruik, docker system prune ruimt op. Met -a gaan ook je lab-images weg, met --volumes ook je volumes.

📝 Quiz: problemen oplossen

6 vragen · 70% nodig om te slagen

1. Wat betekent `manifest unknown` meestal bij een lab-image?
2. Op welke processor draait arm64?
3. Wat betekent `-p 8081:8000`?
4. Wat verwijdert `docker system prune` zonder extra opties niet?
5. Waarom is `docker system prune --volumes` riskant?
6. Een server in de container luistert op 127.0.0.1 en je browser kan hem niet bereiken. Wat helpt?

Log in of maak gratis een account om deze quiz te maken.