Alle berichten

Introductie tot Docker

Wat containers en images zijn, waarom ze deployen zoveel makkelijker maken, en de Docker-commando's die je nodig hebt om je eerste containers te starten, te bekijken en op te ruimen.

Bijgewerkt op 1 november 20265 min lezen

"Op mijn machine werkt het wel" is een van de oudste problemen in software. Je ontwikkelomgeving is bijna nooit identiek aan de server waar je app uiteindelijk draait: een andere OS-versie, een ontbrekende library, een andere runtime. Containers lossen dit op door je app samen te verpakken met alles wat hij nodig heeft. In deze tutorial bekijken we wat Docker is en gaan we aan de slag met de commando's die je elke dag gebruikt.

Wat is een container?

Een container is een draagbare, afgeschermde omgeving met alles wat je app nodig heeft om te draaien: systeembibliotheken, dependencies, configuratie en de app zelf. Elke machine die containers kan draaien, kan je app draaien, en altijd op precies dezelfde manier.

Elke container wordt gemaakt van een image. Zie een image als een bouwplan en een container als een huis dat volgens dat plan gebouwd is. Je kunt zoveel containers starten van hetzelfde image als je wilt, en elke container draait op zichzelf.

Images worden beschreven in een Dockerfile: een gewoon tekstbestand (zonder extensie) met de stappen om het image te bouwen. Je bouwt het met docker build. In deze post schrijven we nog geen eigen Dockerfile (daarvoor is het vervolg). In plaats daarvan gebruiken we kant-en-klare images van Docker Hub, de publieke registry voor Docker-images. De volledige syntax vind je in de Dockerfile-referentie.

Over Docker

Docker is de meest gebruikte tool om containers te bouwen, te delen en te draaien. De engine erachter is open source, en Docker Desktop geeft je een handige app voor Windows, macOS en Linux (gratis voor persoonlijk gebruik, onderwijs en kleine bedrijven). Dezelfde commando's werken voor één hello-world-container en voor productiesystemen met tientallen services.

Waarom containers gebruiken?

  1. Draagbaarheid
  • Alle dependencies zitten in de container, dus foutmeldingen over ontbrekende packages op de server zijn verleden tijd.
  • Elke container is afgeschermd van de hostmachine. 2. Wendbaarheid
  • Deploy naar elke machine die containers draait, zonder handmatige setup op de host.
  • Ontwikkeling, CI en productie draaien allemaal hetzelfde image. 3. Schaalbaarheid
  • Schaal horizontaal door meer instanties van hetzelfde image te starten.
  • Geef een container meer CPU of geheugen wanneer hij dat nodig heeft.
  • Ideaal om een systeem op te splitsen in kleinere services.

Docker installeren

Installeer Docker Desktop op Windows of macOS, of de Docker Engine op een Linux-server. Controleer daarna of het werkt:

Shell
docker --version

Zie je een versienummer zoals hieronder, dan ben je klaar om te beginnen:

Docker voor het eerst gebruiken

Zorg dat Docker Desktop (of de Docker-service) draait voordat je verdergaat.

Hello, world

We beginnen met de kleinste container die er is. Hij print een bericht en stopt dan:

Shell
docker run hello-world

De output ziet er ongeveer zo uit:

De eerste twee regels zijn het interessantst:

  1. Unable to find image 'hello-world:latest' locally: Docker vond het image niet op je machine en downloadt het daarom van Docker Hub.
  2. latest: Pulling from library/hello-world: Docker haalt de tag latest op. Wil je een vaste versie, gebruik dan image:tag, bijvoorbeeld nginx:1.27.

Daarna maakt Docker een container van het image en start hem. Die print "Hello from Docker!" en stopt. Gefeliciteerd, je hebt net je eerste container gedraaid!

Waar is mijn container?

Laten we de draaiende containers bekijken:

Shell
docker ps
# lange vorm: docker container ls

De lijst is leeg. Dat komt doordat de hello-world-container al gestopt is, en docker ps toont standaard alleen draaiende containers. Voeg -a toe om ze allemaal te zien:

Shell
docker ps -a

Nu zie je de hello-world-container met de status Exited. Verwijder hem met:

Shell
docker rm <container-id>

Je hoeft niet het volledige ID te typen: de eerste paar tekens volstaan, zolang ze uniek zijn. Je kunt ook de naam van de container gebruiken.

Images, de bouwplannen van containers

De container is weg, maar het image waar hij van kwam staat nog op je machine:

Shell
docker images
# lange vorm: docker image ls

Ik heb behoorlijk wat images op mijn machine. Jij ziet waarschijnlijk alleen hello-world. Start de container nu twee keer:

Shell
docker run hello-world && docker run hello-world

Deze keer wordt er niets gedownload: het image is al lokaal beschikbaar. Voer docker ps -a opnieuw uit en je ziet twee containers. Ze gebruiken hetzelfde image, maar hebben een ander container-ID, want elke container is een aparte instantie.

Ruim ze op met docker rm, of verwijder alle gestopte containers in één keer met docker container prune. Tip: start een container met --rm (docker run --rm hello-world) en Docker verwijdert hem automatisch zodra hij stopt.

Verwijder tot slot het image zelf:

Shell
docker rmi hello-world
# lange vorm: docker image rm hello-world

Een volledig Linux-systeem in een container

Tijd voor iets leukers: een volledige Linux-shell in een container. We gebruiken Alpine, een piepkleine Linux-distributie van maar een paar megabyte.

Shell
docker pull alpine
docker run -it --rm alpine

-i houdt de invoer open en -t geeft je een terminal, dus samen laten ze je met de container werken. Je krijgt een shell-prompt te zien:

Deze shell kent de gebruikelijke Linux-commando's. Probeer:

Shell
echo "Hello from Alpine!"
ls

Dit is het eigen bestandssysteem van de container, volledig gescheiden van je host. Je kunt naar hartenlust experimenteren zonder iets op je machine stuk te maken. Typ exit om eruit te gaan. Dankzij --rm wordt de container meteen verwijderd.

Op de achtergrond draaien

Start Alpine nu in detached modus, zodat hij op de achtergrond blijft draaien. We geven hem een naam, zodat we geen ID's hoeven te kopiëren:

Shell
docker run -dit --name my-alpine alpine

Om een shell te openen in een draaiende container gebruik je docker exec:

Shell
docker exec -it my-alpine sh

Je zit weer in de container. Typ exit om de shell te verlaten. De container blijft draaien, want exec startte alleen een extra proces. Stop en verwijder hem als je klaar bent:

Shell
docker stop my-alpine
docker rm my-alpine

Hulp nodig?

Zet --help achter een commando (bijvoorbeeld docker run --help) om alle opties te zien, of gebruik docker help voor de volledige lijst met commando's. De Docker-documentatie is ook erg goed.

Conclusie

Je weet nu wat containers en images zijn, en je kunt containers starten, bekijken, binnengaan en opruimen. Daarmee heb je al een verrassend groot deel van het dagelijkse Docker-werk te pakken. Klaar voor de volgende stap? Leer hoe je je eigen images bouwt en deployt.

Veelgestelde vragen

Wat is het verschil tussen een Docker-image en een container?

Een image is een alleen-lezen sjabloon met alles wat een app nodig heeft. Een container is een draaiende instantie van dat image. Je kunt veel containers starten van hetzelfde image.

Waarom toont docker ps mijn container niet?

docker ps toont alleen draaiende containers. Een container die al gestopt is, zoals hello-world, zie je alleen met docker ps -a.

  • Docker
  • DevOps

Knijp, scroll of tik twee keer om te zoomen. Sleep om te verplaatsen.