Opdracht 5 - Docker containers¶
Doel¶
Tijdens deze opdracht installeren we Docker op de Ubuntu VM en starten we enkele eenvoudige containers.
Na deze opdracht kan je:
- Docker installeren op een Linux-systeem
- Een bestaande image importeren en opstarten in een nieuwe container
- Lokale containers en images beheren
Installatie Docker¶
De meeste Linux-distributies hebben een ingebouwde package manager (bijv. dnf bij Fedora, apt bij Ubuntu) die het eenvoudig maakt om de Docker Engine te installeren. Vaak bevatten de standaard repositories van de gekozen Linux-distributie een verouderde versie van Docker. Daarom kiezen we ervoor om de meest recente stabiele versie rechtstreeks te installeren via de officiële Docker repository. Voor de installatie baseren we ons op de officiële installatiehandleiding (nog niets uitvoeren).
Docker maakt gebruik van containervirtualisatie. De Docker engine draait bovenop een bestaande Linux-kernel. Het is mogelijk om Docker rechtstreeks op Windows te installeren, maar hiervoor wordt op de achtergrond een virtuele machine met Linux gebruikt die draait in WSL (= Windows Subsystem for Linux). We beschikken al over een virtuele machine met Ubuntu, dus voor de eenvoud kiezen we ervoor om Docker te installeren in deze virtuele machine.
Een volledige installatie van Docker omvat drie stappen:
- Verwijderen van eventuele oude versies van Docker.
- Toevoegen van de officiële Docker repository aan je lokale apt repositorylijst.
- Downloaden van Docker via
apt.
Voer nu het commando uit de volgende sectie van de officiële Docker handleiding uit: https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions
Het toevoegen van de Docker repository zorgt ervoor dat we de Docker binary niet handmatig hoeven te downloaden en installeren (zoals je .exe-bestanden kan downloaden en uitvoeren op Windows). Nadat de Docker software repository is toegevoegd, kan je apt gebruiken om Docker automatisch te installeren. apt zal er ook voor zorgen dat Docker (naast andere software) eenvoudig up-to-date gehouden kan worden.
Voer vervolgens de commando's uit de volgende sectie van de officiële Docker handleiding uit: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository. Na het uitvoeren van een container met de hello-world image stop je met de tutorial.
Docker starten en status controleren¶
De Docker engine draait als een daemon (service). Na de installatie start Docker normaal gesproken automatisch. Dit kan je controleren met het systemctl status commando:
| Bash | |
|---|---|

Door q in te drukken keer je terug naar de terminal (je kan hier dezelfde toetsen gebruiken als in man en less).
Als de status niet active (running) is, kan je de service alsnog starten:
| Bash | |
|---|---|
Als je disabled ziet in plaats van enabled, betekent dit dat de Docker service niet automatisch zal starten bij het opstarten van de Linux VM. Je kan dit gedrag wijzigen met het volgende commando:
| Bash | |
|---|---|
Eerste container¶
In de tutorial heb je de hello-world image gebruikt om een eerste container op te starten. Dit is een eenvoudige container die enkel een welkomstbericht toont.
Je kan op elk moment controleren welke containers er momenteel actief zijn op je systeem via het docker ps commando:
| Bash | |
|---|---|
Welke containers zie je?
Je zal merken dat er waarschijnlijk nog geen containers draaien, ook al hebben we net een container opgestart. De reden hiervoor is dat een container niet automatisch blijft draaien, maar afsluit zodra alle taken (hier: een tekst printen op het scherm) zijn afgerond. Je kan echter in het vorige commando een extra optie meegeven om ook afgesloten containers te zien.
| Bash | |
|---|---|

In dit overzicht zie je de unieke ID van elke container, de image die gebruikt wordt (hier hello-world), wanneer de container is aangemaakt en wat de huidige status is. Elke container krijgt ook een naam, en indien je zelf geen naam expliciet meegeeft, wordt een pseudo-random naam gegenereerd (in bovenstaande screenshot is dit crazy_meninsky).
Extra containers¶
Je kan zelf een image bouwen waaruit containers gestart kunnen worden. Gelukkig beschikt Docker ook over een grote repository van images, Docker Hub, die iedereen kan gebruiken. Dankzij Docker Hub kunnen we dus snel andere containers opstarten. Bovendien is het zo dat, als je zelf een image wil maken, je meestal vertrekt van een bestaande image en deze dan verder uitbreidt.
Cowsay¶
Onderstaand voorbeeld zal een container opstarten op basis van de bartixxx32/cowsay image. Deze container print een gegeven boodschap via het cowsay commando:
Aangezien je de image bartixxx32/cowsay nog niet hebt staan op jouw systeem, heeft Docker deze voor jou gedownload van Docker Hub. Als je dit nogmaals uitvoert, zal je zien dat Docker de image niet meer opnieuw hoeft te downloaden:
| Bash | |
|---|---|
Snake game¶
Met de image spkane/snake-game kan je een eenvoudig slangenspel spelen in de terminal. Start de container met het volgende commando:
| Bash | |
|---|---|

Wat doen de opties -it?
-istaat voor interactief. Dit zorgt ervoor dat de standaard invoer van de terminal wordt doorgegeven aan de container.-tstaat voor pseudo-TTY. Dit zorgt ervoor dat de terminal van de container wordt gekoppeld aan de terminal van de host.
Hiermee kunnen we dus interactief commando's uitvoeren in de container en zie je ook meteen de uitvoer van deze commando's.
Zoek zelf eens naar een paar bestaande images op Docker Hub en probeer deze te starten. Welke commando's heb je hiervoor nodig?
Beheren en verwijderen van containers en images¶
Een container wordt binnen Docker opgestart via een image. Als je voor de eerste keer een container start, moet de image mogelijk nog gedownload worden. Bij toekomstige containers die dezelfde image gebruiken, hoeft de image niet opnieuw gedownload te worden, tenzij deze is bijgewerkt in de centrale repository.
Je kan op elk moment een overzicht opvragen van alle gedownloade images met het docker images commando:
| Bash | |
|---|---|
Zie je de bartixxx32/cowsay image in de output?
Ja, de image is gedownload en staat nu lokaal op het systeem.
Je kan aan bovenstaand commando ook de optie -a toevoegen om ook tussenliggende images te zien:
| Bash | |
|---|---|
Is er een verschil in de output van beide commando's? Wat kan je hieruit concluderen?
Nee, er is geen verschil tussen beide commando's. Dit betekent dat er geen tussenliggende images zijn opgeslagen op het systeem. Dit komt omdat we enkel images gedownload hebben van Docker Hub en zelf geen images hebben gemaakt.

Zoek zelf eens op hoe je op jouw VM alle containers, images en volumes kan verwijderen. Welk(e) commando('s) heb je hiervoor nodig?
| Bash | |
|---|---|
Dit commando zal alle containers, images en volumes verwijderen die niet in gebruik zijn.
Je kan het resultaat controleren met de commando's docker images en docker ps -a:

Docker commando permissies¶
Je hebt waarschijnlijk gemerkt dat je sudo moet gebruiken om Docker commando's uit te voeren. Dit komt omdat de Docker daemon socket, waarmee het docker commando communiceert, eigendom is van de root gebruiker en de docker groep. Standaard is jouw gebruiker geen lid van de docker groep en heeft dus geen rechten om bepaalde commando's uit te voeren. Je kan dit oplossen door jezelf toe te voegen aan de docker groep:
| Bash | |
|---|---|
Hierna moet je uitloggen en opnieuw aanmelden of de machine opnieuw opstarten om de permissies te laten gelden. Je kan nu het sudo commando weglaten bij Docker commando's zoals docker ps -a.
Extra informatie¶
- Docker Engine installeren op Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Uitgebreide tutorial Docker: https://www.youtube.com/watch?v=fqMOX6JJhGo
- Beheer van Docker images: https://docs.docker.com/reference/cli/docker/image/
- Beheer van Docker containers: https://docs.docker.com/reference/cli/docker/container/