Ga naar hoofdinhoud

Introductie tot Docker

Wat is Docker en waarom is het belangrijk

Docker is een platform voor het creëren, distribueren en beheren van containers. Containers zijn lichte, geïsoleerde omgevingen waarin applicaties en hun afhankelijkheden (dependencies) draaien. Dit maakt het mogelijk om software consistent en voorspelbaar te draaien, ongeacht de onderliggende infrastructuur.

Docker biedt een manier om een softwaretoepassing en al zijn afhankelijkheden (zoals libraries, configuraties en runtime-omgevingen) in een container te verpakken. Containers zijn vergelijkbaar met virtuele machines, maar zijn veel lichter en efficiënter omdat ze de kern van het besturingssysteem delen in plaats van elk hun eigen OS te draaien. Docker maakt gebruik van de kernfunctionaliteiten van het besturingssysteem (zoals Linux namespaces en cgroups) om deze isolatie en efficiëntie mogelijk te maken.

Een container kan een volledige applicatieomgeving bevatten, inclusief de code, runtime, libraries, en alle andere resources die de applicatie nodig heeft om te functioneren. Hierdoor kan een container dezelfde omgeving repliceren op verschillende machines, wat consistentie en portabiliteit garandeert.

vmcontainer

Kernconcepten van Docker

Dockerfile

Een bestand dat instructies bevat voor het maken van een Docker-image. Hierin staan de stappen beschreven om een containeromgeving op te zetten, inclusief het installeren van software, kopiëren van bestanden, enz. Voor meer details over deze instructies zie de sectie in verband met docker images maken of de Docker documentatie

Image

Een kant-en-klare, leesbare template die alles bevat wat nodig is om een container te draaien. Een Docker-image is statisch en kan overal hergebruikt worden.

Container

Een draaiende instantie van een Docker-image. Containers zijn dynamisch en kunnen meerdere keren uit hetzelfde image gestart worden.

Registry

Een registry is een centrale opslagplaats of database waar softwarepakketten, libraries of andere digitale assets worden opgeslagen, beheerd en gedeeld. De bekendste is Docker Hub.

Hoe past Docker in moderne IT-praktijken

Docker heeft de manier waarop ontwikkelaars en DevOps-teams software bouwen, testen en uitrollen fundamenteel veranderd. Hier zijn enkele redenen waarom Docker zo belangrijk is:

  1. Consistentie en Portabiliteit: Docker maakt het mogelijk om de hele applicatie, inclusief de benodigde afhankelijkheden en configuraties, in één container te verpakken. Dit betekent dat een applicatie die lokaal werkt in een Docker-container ook precies hetzelfde zal draaien in een test- of productieomgeving. Het bekende "works on my machine"-probleem wordt hiermee opgelost (of toch grotendeels vermeden).

  2. Efficiëntie en Snelheid: Containers zijn veel lichter dan traditionele virtuele machines omdat ze de host-kernel delen in plaats van een volledige OS-omgeving te repliceren. Hierdoor kun je met Docker meerdere containers met verschillende applicaties of services op één machine draaien, zonder veel overhead. Het opstarten van een container duurt slechts enkele seconden in vergelijking met het starten van een VM, wat het proces van testen en ontwikkelen versnelt.

  3. Schaalbaarheid en Flexibiliteit: Docker past perfect in moderne microservices-architecturen, waarbij elke service in zijn eigen container draait en onafhankelijk kan worden opgeschaald. Dit maakt het eenvoudig om applicaties uit te breiden of aan te passen zonder de hele infrastructuur te verstoren. Kubernetes, een populaire tool voor het beheren van containers in productieomgevingen, werkt goed samen met Docker en helpt om gecontaineriseerde applicaties op grote schaal te beheren.

  4. Eenvoudige Implementatie en CI/CD: Omdat Docker-containers de hele applicatie bevatten, inclusief dependencies en configuraties, wordt het proces van Continuous Integration en Continuous Deployment (CI/CD) eenvoudiger en betrouwbaarder. Een applicatie kan lokaal worden ontwikkeld, vervolgens door het CI/CD-proces gaan en exact hetzelfde worden uitgevoerd in productie zonder onverwachte problemen.

  5. Isolatie en Veiligheid: Containers zorgen voor isolatie, waardoor applicaties en hun afhankelijkheden gescheiden zijn. Dit helpt om conflicts tussen verschillende applicaties op dezelfde host te voorkomen. Hoewel containers niet per definitie veiliger zijn dan VM's, biedt Docker mogelijkheden voor resourcebeheer en toegangslimieten, wat het risico op beveiligingsproblemen vermindert.

Overzicht Docker architectuur

Docker heeft een modulaire architectuur die bestaat uit verschillende componenten. De drie belangrijkste onderdelen zijn de Docker Client, de Docker Daemon, en Docker Hub. Elk van deze onderdelen speelt een specifieke rol in het bouwen, beheren en distribueren van Docker-containers.

Client

De Docker Client is de interface waarmee gebruikers communiceren om Docker-opdrachten uit te voeren, zoals het bouwen, starten en beheren van containers.

Belangrijkste verantwoordelijkheid: Het verstuurt commando’s (zoals docker build, docker run, docker pull) naar de Docker Daemon, die vervolgens de gevraagde taken uitvoert.

Hoe het werkt: Het werkt als een command line tool (docker CLI) waarmee je opdrachten stuurt naar de Docker Daemon via een REST API. De Docker Client kan ook op een andere machine draaien dan de Docker Daemon; in dat geval maakt de client verbinding met de Daemon over het netwerk.

Voorbeelden van opdrachten:

  • docker build voor het bouwen van een image.
  • docker run voor het starten van een container.
  • docker pull en docker push voor het ophalen of versturen van images naar Docker Hub.

Kort gezegd is de Docker Client het gereedschap dat gebruikers gebruiken om Docker-opdrachten uit te voeren.

Docker Daemon

De Docker Daemon is het hart van Docker. Het voert alle acties uit met betrekking tot containers en images op basis van de opdrachten die het ontvangt van de Docker Client.

Belangrijkste verantwoordelijkheid: De Docker Daemon luistert naar API-aanvragen (zoals opdrachten van de Docker Client) en voert deze uit. Het is verantwoordelijk voor het bouwen, starten, stoppen en verwijderen van containers, en voor het beheren van Docker-images, netwerken, en volumes.

Hoe het werkt: De Daemon draait continu als een achtergrondproces op het host-systeem en beheert de lifecycle van containers. Het houdt ook het lokaal opgeslagen images en de status van containers bij.

Interactie met andere onderdelen: De Docker Daemon kan samenwerken met andere Docker Daemons om gedistribueerde applicaties te beheren (zoals in Docker Swarm). Daarnaast communiceert het met Docker Hub of andere registries om images te downloaden of op te slaan.

De Docker Daemon voert alle belangrijke acties uit in het Docker-ecosysteem en maakt het mogelijk om containers te beheren.

Docker Hub

Docker Hub is een cloud-gebaseerde registry die Docker-images opslaat en distribueert.

Belangrijkste verantwoordelijkheid: Het fungeert als de officiële publieke registry waar gebruikers Docker-images kunnen zoeken, downloaden (docker pull), en publiceren (docker push). Docker Hub bevat miljoenen images, zowel van officiële bronnen als van de open-source community en commerciële leveranciers.

Hoe het werkt: Gebruikers kunnen via de Docker Client verbinding maken met Docker Hub om images op te halen of te delen. Docker Hub bevat zowel openbare als privé-repositories, en gebruikers kunnen hun eigen repositories maken voor specifieke projecten of bedrijven.

Wat biedt Docker Hub meer tov andere registries:

  • Bevat officiële standaard images voor populaire software zoals NGINX, MySQL, Ubuntu, enz., die door Docker zijn gevalideerd.
  • Bouwt automatisch images als er updates in de bijbehorende code-repositories worden doorgevoerd (zoals in GitHub).
  • Docker Hub biedt beveiligingsscans om kwetsbaarheden in images te detecteren.

Docker Hub is de belangrijkste locatie voor het vinden en delen van Docker-images, en het ondersteunt ontwikkelaars en teams in hun containerized workflows.

Voorbeeld van flow door de architectuur

  1. De gebruiker voert via de Docker Client opdrachten uit (bijv. docker run, docker build).
  2. De Docker Client verstuurt deze opdrachten naar de Docker Daemon, die de backend-werkzaamheden uitvoert.
  3. De Docker Daemon kan verbinding maken met Docker Hub om benodigde images op te halen of op te slaan.
  4. Docker Hub fungeert als een opslagplaats en distributieplatform voor Docker-images, die de Daemon kan gebruiken om containers te starten.

Praktijk voorbeeld

Stel je voor dat je een webapplicatie bouwt in Node.js met een specifieke versie van MongoDB als database. Met Docker kun je een Dockerfile aanmaken waarin je specificeert welke Node.js- en MongoDB-versies je wilt gebruiken en hoe deze moeten worden geconfigureerd. Zodra je dit hebt gedefinieerd, kun je de applicatie op elke machine starten met een enkele docker run-opdracht, zonder dat je die afhankelijkheden handmatig hoeft te installeren. Dit betekent dat je volledige applicatie zal draaien, onafhankelijk of de persoon die hem probeert op te starten node of mongodb geïnstalleerd heeft en welke versie hij of zij geïnstalleerd heeft.

Hands-on!

Doel: Installeren van Docker en runnen van "Hello World"-container

1. Installeer Docker

Er zijn verschillende manier om Docker te installeren. Afhankelijk van welk operating systeem je gebruikt (een Linux distributie, Windows, iOS) verschilt de installatieprocedure ook erg.

De snelste en gemakkelijkste manier om een werkende Docker setup op je systeem te hebben is door Docker Desktop te gebruiken. Dit is een gratis tool die echter met gebruiksbeperkingen komt als je geen geldige licentie koopt.

2. Verifieer installatie

Nadat je docker geïnstalleerd hebt kan je verifiëren dat alles goed verlopen hebt door in de terminal het volgende commando uit te voeren:

docker --version

Dit zou een output moeten geven (en geen error).

3. Docker "Hello World" Container draaien

  1. Voer het Hello World-commando uit:

    docker run hello-world
  2. Verwachte output:

  • Docker zal controleren of de hello-world image lokaal beschikbaar is. Als deze ontbreekt, wordt de image automatisch gedownload van Docker Hub.

  • Daarna wordt de container gestart en krijg je de volgende output:

    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/