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?
- 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:
docker --versionZie 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:
docker run hello-worldDe output ziet er ongeveer zo uit:
De eerste twee regels zijn het interessantst:
Unable to find image 'hello-world:latest' locally: Docker vond het image niet op je machine en downloadt het daarom van Docker Hub.latest: Pulling from library/hello-world: Docker haalt de taglatestop. Wil je een vaste versie, gebruik danimage:tag, bijvoorbeeldnginx: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:
docker ps
# lange vorm: docker container lsDe 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:
docker ps -aNu zie je de hello-world-container met de status Exited. Verwijder hem met:
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:
docker images
# lange vorm: docker image lsIk heb behoorlijk wat images op mijn machine. Jij ziet waarschijnlijk alleen hello-world. Start de container nu twee keer:
docker run hello-world && docker run hello-worldDeze 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:
docker rmi hello-world
# lange vorm: docker image rm hello-worldEen 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.
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:
echo "Hello from Alpine!"
lsDit 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:
docker run -dit --name my-alpine alpineOm een shell te openen in een draaiende container gebruik je docker exec:
docker exec -it my-alpine shJe 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:
docker stop my-alpine
docker rm my-alpineHulp 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