Les 2 van 5
Een lab starten met docker run
Start een lab-container van beetjecoderen.nl en leer wat -it, --rm, -e BEETJE_COURSE, -e BEETJE_LESSON en de imagenaam doen, en waar je bestanden staan.
📑 Op deze pagina
🎯 Na deze les kun je
- een lab-container starten met het commando uit een les
- elke optie van dat commando uitleggen
- terugvinden waar de lesbestanden in de container staan
Onder elke les met een lokaal lab staat een commando dat er ongeveer zo uitziet:
docker run -it --rm -e BEETJE_COURSE=python -e BEETJE_LESSON=2 registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest
Dat ziet er op het eerste gezicht uit als een toverspreuk. In deze les haal je het uit elkaar, zodat je precies weet wat er gebeurt, en kun je het aanpassen als dat nodig is.
Het commando in stukjes
| Stukje | Betekenis |
|---|---|
docker run |
Maak een nieuwe container van een image en start hem. |
-i |
interactive: houd de invoer open, zodat wat jij typt in de container aankomt. |
-t |
tty: geef de container een echte terminal, met prompt, kleuren en pijltjestoetsen. |
--rm |
Verwijder de container automatisch zodra hij stopt. |
-e BEETJE_COURSE=python |
Zet de omgevingsvariabele BEETJE_COURSE: de cursus waar je aan werkt. |
-e BEETJE_LESSON=2 |
Zet BEETJE_LESSON: de les waar je mee begint. |
registry.wizg.it/…:lab-python-latest |
Het image waarvan de container gemaakt wordt. |
-it is gewoon -i en -t samen. Je hebt ze allebei nodig voor een terminal waarin je kunt werken. Zonder -i kun je niets typen; zonder -t krijg je geen prompt en doen toetsen als Tab en de pijltjes niets.
--rm: opruimen na afloop
Zonder --rm blijft elke gestopte container op je schijf staan. Na een paar weken labs heb je er tientallen (bekijk ze met docker ps -a). Met --rm ruimt Docker de container op zodra je hem afsluit.
Dat heeft een belangrijk gevolg: alles wat je in de container hebt gemaakt, is daarna weg. Voor een snelle oefening is dat prima. Wil je je werk bewaren, dan koppel je een map van je eigen computer aan de container. Dat leer je in de volgende les.
-e: omgevingsvariabelen
Met -e NAAM=waarde geef je een omgevingsvariabele mee aan de container. De lab-images kijken naar twee variabelen:
BEETJE_COURSEis de actieve cursus. Eén image bevat de lessen van meerdere cursussen (het Python-image bevat bijvoorbeeld zowel de cursus python als programmeerconcepten). Bij het opstarten zet het image de startbestanden van alle lessen van deze cursus voor je klaar.BEETJE_LESSONis het lesnummer. De terminal begint dan meteen in de map van die les.
De waarden staan al goed in het commando onder elke les. Je hoeft ze alleen aan te passen als je in dezelfde container met een andere les verder wilt (en dat kan ook zonder opnieuw te starten, zie hieronder).
De imagenaam
Een volledige imagenaam heeft drie delen:
registry.wizg.it / webhosting/beetjecoderen-web : lab-python-latest
registry repository tag
- De registry is de server waar het image staat. Staat er geen registry in de naam (zoals bij
hello-world), dan gebruikt Docker Docker Hub. - De repository is de naam van het project.
- De tag kiest de variant. Er is één lab-image per taal:
| Tag | Gebruikt door |
|---|---|
lab-python-latest |
Python, Programmeerconcepten |
lab-linux-latest |
Een beetje Linux & Docker |
lab-c-latest |
C/C++, Embedded C |
lab-php-latest |
PHP |
lab-dotnet-latest |
ASP.NET |
lab-rust-latest |
Rust |
lab-micropython-latest |
MicroPython |
latest betekent: de nieuwste versie. Er komen af en toe lessen bij of verbeteringen in. Met docker pull <imagenaam> haal je de nieuwste versie op.
Het image binnenhalen
De eerste keer dat je docker run met een lab-image typt, probeert Docker het image te downloaden. De lab-images zijn een paar honderd MB, dus dat duurt even.
Stand van zaken: op dit moment vraagt de registry
registry.wizg.itnog om een login, ook voor de lab-images. Krijg je bij het downloaden een melding metunauthorized, dan ligt dat dus niet aan jou. Zodra de images publiek zijn, werktdocker runmeteen. Tot die tijd bouw je het image één keer zelf, zoals hieronder staat. Het resultaat is precies hetzelfde.
Zelf bouwen gaat met één commando. Docker downloadt dan de bouwinstructies (zonder antwoorden van de opdrachten) van beetjecoderen.nl en maakt het image op je eigen computer:
docker build -t registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest -f python.Dockerfile https://beetjecoderen.nl/labs/lab-images.tar.gz
-t …geeft het image dezelfde naam als in de registry. Daardoor werkt hetdocker run-commando uit de les daarna zonder aanpassing.-f python.Dockerfilekiest welk image je bouwt. Gebruik de taal uit de tag:linux.Dockerfile,c.Dockerfile,php.Dockerfile, enzovoort.- De URL aan het eind is de bouwcontext: een archief met alle bestanden die nodig zijn.
Bouwen duurt een paar minuten (Docker downloadt onderweg o.a. Debian-pakketten) en hoeft maar één keer. Onder elke les met een lokaal lab staat dit bouwcommando ook, met de juiste taal al ingevuld.
In de container
Zodra de container start, zie je een welkomstbericht en een prompt:
Welkom in je lab van beetjecoderen.nl!
- Je lesbestanden staan in ~/lessen/<lesnummer> (bv. cd ~/lessen/05). Opdracht: OPDRACHT.md.
- Klaar? Controleer met: beetje check <les-id> (alle lessen: beetje lijst)
...
student@lab:~/lessen/02$
Je zit nu in een Linux-shell in de container. Alles wat je typt, gebeurt daar, niet op je eigen computer. Een paar dingen om te weten:
- Je thuismap in de container is
/home/student(afgekort~). - De lessen van je actieve cursus staan in
~/lessen/<NN>, met een lesnummer van twee cijfers:~/lessen/02,~/lessen/05,~/lessen/12. - De opdracht staat in elke lesmap in
OPDRACHT.md. Lees hem metcat OPDRACHT.mdofless OPDRACHT.md(stoppen metq). - Een andere les? Gewoon
cd ~/lessen/05. Alle lessen van de cursus staan al klaar. - Alle lessen in dit image zie je met
beetje lijst. - Bestanden bewerken kan met
nano(makkelijk; opslaan met Ctrl+O, stoppen met Ctrl+X) ofvi.
Klaar? Typ exit of druk op Ctrl+D. De container stopt, en door --rm wordt hij opgeruimd.
Uitgewerkt voorbeeld
Je wilt het lab van les 2 van de cursus python doen:
docker run -it --rm -e BEETJE_COURSE=python -e BEETJE_LESSON=2 registry.wizg.it/webhosting/beetjecoderen-web:lab-python-latest
In de container:
pwd # /home/student/lessen/02
ls # OPDRACHT.md en de startbestanden
cat OPDRACHT.md # lees wat je moet doen
nano main.py # werk aan de opdracht (bestandsnaam staat in de opdracht)
beetje check # controleer je werk (les 5 gaat hier dieper op in)
exit # klaar
Veelgemaakte fouten
- Het commando over meerdere regels plakken en dan halverwege een fout krijgen. Plak het als één regel, of gebruik in bash een
\aan het eind van elke regel (in PowerShell een backtick`). -itvergeten. De container start, laat misschien iets zien en is meteen weer weg, of je kunt niets typen.- Werk maken met
--rmen danexittypen. Je werk is weg. Zie de volgende les. - Een typefout in de tag, zoals
lab-pyhton-latest. Docker meldt dan dat het image niet bestaat (not foundofmanifest unknown).
Oefenen
- Start een lab-container van een cursus die je volgt en typ
env | grep BEETJE. Zie je de twee variabelen terug? - Typ
beetje lijst. Welke cursussen zitten er in dit image? - Maak in de container een bestand aan (
echo hallo > test.txt), typexiten start de container opnieuw. Is het bestand er nog? Waarom niet?
Samenvatting
-itgeeft je een werkende terminal,--rmruimt de container op na afloop: je werk verdwijnt dan ook.-e BEETJE_COURSE=…kiest de cursus waarvan de lesbestanden klaarstaan,-e BEETJE_LESSON=…de map waarin je begint.- De imagenaam bestaat uit registry, repository en tag; er is één lab-image per taal.
- Krijg je
unauthorizedbij het downloaden, bouw het image dan één keer zelf metdocker build … https://beetjecoderen.nl/labs/lab-images.tar.gz. - In de container staan je lessen in
~/lessen/<NN>, met de opdracht inOPDRACHT.md.
📝 Quiz: een lab starten
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.