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.
📑 Op deze pagina
🎯 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 versiontoont bij Server de regelOS/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/amd64achterdocker 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 allocatedof 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 danhttp://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 op0.0.0.0, bijvoorbeeldphp -S 0.0.0.0:8000ofpython3 -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 -averwijdert 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 --volumesverwijdert 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-tin een omgeving zonder echte terminal, zoals Git Bash op Windows (zetwinptyvoordocker) of in een script (laat-tweg).Permission deniedin een gekoppelde map: zie de valkuilen bij rechten in les 3 (--useren eerstmkdir -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:
- Lees de laatste regel:
unauthorized. Het gaat om toegang tot de registry. - Is het jouw fout? Bij de lab-images niet: de registry vraagt nu nog om een login.
- Oplossing: bouw het image zelf met het
docker build-commando onder de les. - Controleer:
docker images | grep beetjecoderentoont nu het image met de taglab-…-latest. - Opnieuw: het
docker run-commando uit de les start nu wel.
Oefenen
- Typ
docker system df. Hoeveel ruimte kun je terugwinnen? - Welke architectuur heeft jouw computer volgens
docker version? - Leg in je eigen woorden uit waarom
docker system prune --volumesgevaarlijk 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/amd64kan, maar is traag. - Poort doorgeven met
-p computer:container, en laat servers luisteren op0.0.0.0. docker system dftoont het gebruik,docker system pruneruimt op. Met-agaan ook je lab-images weg, met--volumesook je volumes.
📝 Quiz: problemen oplossen
Log in om de quiz te maken. Met een gratis account kijk je je antwoorden na, bewaar je je voortgang en verdien je XP. De les zelf blijft gewoon gratis te lezen.