Beetje Coderen

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.

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

Een terminalvenster met een docker run-commando waarvan de onderdelen met gekleurde labels worden uitgelegd

🎯 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_COURSE is 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_LESSON is 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.it nog om een login, ook voor de lab-images. Krijg je bij het downloaden een melding met unauthorized, dan ligt dat dus niet aan jou. Zodra de images publiek zijn, werkt docker run meteen. 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 het docker run-commando uit de les daarna zonder aanpassing.
  • -f python.Dockerfile kiest 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 met cat OPDRACHT.md of less OPDRACHT.md (stoppen met q).
  • 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) of vi.

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 `).
  • -it vergeten. De container start, laat misschien iets zien en is meteen weer weg, of je kunt niets typen.
  • Werk maken met --rm en dan exit typen. 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 found of manifest unknown).

Oefenen

  1. Start een lab-container van een cursus die je volgt en typ env | grep BEETJE. Zie je de twee variabelen terug?
  2. Typ beetje lijst. Welke cursussen zitten er in dit image?
  3. Maak in de container een bestand aan (echo hallo > test.txt), typ exit en start de container opnieuw. Is het bestand er nog? Waarom niet?

Samenvatting

  • -it geeft je een werkende terminal, --rm ruimt 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 unauthorized bij het downloaden, bouw het image dan één keer zelf met docker build … https://beetjecoderen.nl/labs/lab-images.tar.gz.
  • In de container staan je lessen in ~/lessen/<NN>, met de opdracht in OPDRACHT.md.

📝 Quiz: een lab starten

6 vragen · 70% nodig om te slagen

1. Wat doet `--rm`?
2. Wat gebeurt er als je `-it` weglaat?
3. Waarvoor dient `-e BEETJE_COURSE=python`?
4. Wat is in `registry.wizg.it/webhosting/beetjecoderen-web:lab-c-latest` de tag?
5. Je krijgt *unauthorized* bij het downloaden van een lab-image. Wat doe je?
6. Waar staan de lesbestanden van les 5 in de container?

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