Direct naar de inhoud

Cookie-instellingen

Kies per soort welke cookies je toestaat. Je kunt je keuze altijd wijzigen via Cookie-instellingen onderaan elke pagina. Privacyverklaring

Noodzakelijk

Altijd aan

Nodig om in te loggen, je winkelwagen te bewaren en je keuzes te onthouden. Deze staan altijd aan.

Welke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: je sessie en ingelogd blijven
  • weboke_basket: je winkelwagen
  • wkBtwIncl: prijzen met of zonder btw tonen
  • wok_cookies: je cookiekeuze, 12 maanden

Meet welke advertentie tot een bezoek of bestelling leidt, zodat we niet betalen voor advertenties die niets doen.

Welke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), tot 90 dagen
  • OpenAI Ads, advertenties in ChatGPT
  • wok_aff: via welke partner je bij ons kwam (affiliateprogramma), 60 dagen

4,6

Land en taal

Elk land heeft zijn eigen site, met prijzen en btw van dat land.

Bekijken

Module 9 · 9.2

Nederlands

Docker installeren en je eerste container

Module 9: Docker en docker compose · Leestijd: 11 minuten

Leerdoel: Na deze les kun je Docker Engine installeren uit de officiële pakketbron, containers starten, bekijken, binnenkijken en opruimen, en weet je waarom de groep docker gelijkstaat aan root.

Kernbegrippen: Docker Engine, Docker Desktop, officiële apt-bron, docker.io van Debian, groep docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

Welke Docker?

Op een server installeer je Docker Engine: de achtergronddienst (dockerd) plus het commando docker. Docker Desktop is iets anders: een programma met vensters voor Windows, macOS en Linux-desktops. Dat hoort niet op een server.

Er zijn twee nette bronnen voor Docker Engine:

  1. De pakketbron van Docker zelf (download.docker.com). Altijd de nieuwste versie, inclusief de plug-in docker compose die je in les 9.3 gebruikt. Dit is wat de Docker-documentatie beschrijft en wat deze cursus gebruikt.
  2. Het pakket docker.io van Debian of Ubuntu. Ouder, maar door de distributie bijgewerkt via je gewone beveiligingsupdates (les 4.2). Prima als je liever niets van buiten de distributie hebt; controleer dan wel of docker compose (met een spatie) beschikbaar is.

Kies er één. Door elkaar installeren geeft conflicten; de Docker-documentatie zegt daarom eerst onofficiële pakketten als docker.io, docker-compose en podman-docker te verwijderen.

Installeren uit de pakketbron van Docker

Dit zijn de stappen uit de Docker-documentatie voor Debian, met de sleutel apart en een eigen Signed-By (les 4.1). Maak eerst een snapshot als je dat prettig vindt.

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

Daarna het bronbestand /etc/apt/sources.list.d/docker.sources (deb822-vorm):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

Bij Suites hoort de codenaam van jouw release (cat /etc/os-release, les 4.3) en bij Architectures de uitvoer van dpkg --print-architecture. Op Ubuntu is de URL https://download.docker.com/linux/ubuntu en de suite bijvoorbeeld noble.

Dan installeren:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

Op Debian en Ubuntu start Docker na de installatie vanzelf en ook na elke herstart (systemctl status docker, les 6.1).

Let op: unattended-upgrades (les 4.2) werkt pakketten uit deze bron standaard niet automatisch bij. Neem sudo apt update && sudo apt upgrade voor Docker op in je onderhoudsritme (les 10.4), of voeg de bron bewust toe aan je automatische updates.

De groep docker is root

Overal op internet staat dat je jezelf aan de groep docker moet toevoegen, zodat je sudo niet meer hoeft te typen:

anna@web1:~$ sudo usermod -aG docker anna

Doe dat alleen als je begrijpt wat het betekent. De Docker-documentatie is er duidelijk over: de groep docker geeft rechten op het niveau van root. Wie de Docker-dienst mag aansturen, kan een container starten met de hele schijf van de host erin gekoppeld:

docker run -it -v /:/host debian chroot /host

en is daarmee root op je server, zonder wachtwoord en zonder sudo-log. De Docker-documentatie zegt het zo: alleen vertrouwde gebruikers horen de Docker-dienst te mogen besturen.

Voor een server die je alleen zelf beheert, is het een keuze: gemak tegenover een extra route naar root. Veiliger is gewoon sudo docker ... blijven typen; dan staat elk commando in het sudo-log (les 3.2). Voeg in elk geval nooit een gebruiker aan de groep toe die geen root mag zijn, zoals een dienstgebruiker voor een website.

Rootless mode

Docker kan ook zonder root draaien: de dienst en de containers draaien dan onder een gewone gebruiker, met een eigen user namespace. Je installeert het als die gebruiker met dockerd-rootless-setuptool.sh install (uit het pakket docker-ce-rootless-extras; vooraf is het pakket uidmap nodig). Een lek in een container levert dan geen root op de host op. Er zijn beperkingen en het is lastiger in te richten; voor deze cursus gebruiken we de gewone installatie, en houden we het veilig met de regels uit deze module.

Een eerste echte container

We starten een nginx-webserver in een container, alleen bereikbaar vanaf de server zelf:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

De onderdelen:

DeelBetekenis
-dOp de achtergrond draaien (detached)
--name proefEen naam, zodat je niet met lange ID's hoeft te werken
-p 127.0.0.1:8080:80Poort 80 in de container wordt poort 8080 op de host, alleen op loopback
nginx:stableHet officiële nginx-image, tag stable

Controleren:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

ss (les 5.1) bevestigt: alleen op 127.0.0.1. Had je -p 8080:80 getypt, dan stond er 0.0.0.0:8080 en [::]:8080, en was je container van internet bereikbaar, ook als ufw poort 8080 niet toelaat (les 9.3). De versie in de Server-header kan bij jou anders zijn.

Rondkijken en ingrijpen

anna@web1:~$ sudo docker logs proef            # wat het programma schreef (stdout en stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # de laatste 20 regels en blijven volgen
anna@web1:~$ sudo docker exec -it proef sh     # een shell in de draaiende container
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # stoppen en verwijderen

docker logs is de eerste plek waar je kijkt als een container niet doet wat je verwacht, net zoals journalctl voor gewone diensten (les 6.2). Met docker exec kijk je binnen, maar verander je daar liever niets: wijzigingen in de container verdwijnen bij de volgende update (les 9.1).

Opruimen

Images en gestopte containers blijven staan tot je ze opruimt. Op een VPS met een kleine schijf loopt dat ongemerkt op.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

docker image prune verwijdert images zonder naam die nergens meer bij horen; met -a ook alle images die door geen enkele container gebruikt worden. Wees voorzichtig met docker system prune --volumes: dat verwijdert ook anonieme volumes (zonder naam) die op dat moment niet bij een container horen, en docker volume prune -a zelfs volumes met een naam. Daarin kunnen je gegevens staan. Geef volumes daarom altijd een naam of gebruik een bind mount (les 9.1), en kijk eerst met docker volume ls.

De logs van containers kunnen ook groeien. Docker bewaart ze standaard in JSON-bestanden zonder grootte-grens. Een grens zet je in /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Daarna sudo systemctl restart docker; de instelling geldt alleen voor nieuw aangemaakte containers, bestaande containers maak je opnieuw aan.

In de praktijk

Docker werkt op een VPS bij WebOké hetzelfde als bij elke andere aanbieder: het is software binnen je eigen server, die je zelf installeert en bijwerkt. Kijk bij een kleine VPS met docker system df en df -h (les 1.4) geregeld naar de schijfruimte.

Samenvatting

  • Installeer Docker Engine uit de pakketbron van Docker (met eigen sleutel en Signed-By) of docker.io uit de distributie, niet allebei.
  • De groep docker staat gelijk aan root; sudo docker houdt een spoor in het sudo-log. Rootless mode is een veiliger maar beperkter alternatief.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag start een container die alleen lokaal bereikbaar is; controleer met ss.
  • docker ps, logs, exec, stop, rm zijn je dagelijkse gereedschap.
  • Ruim images op met docker image prune, begrens containerlogs (standaard onbeperkt), en wees zuinig met --volumes.

Quiz

1. Waarom geeft lidmaatschap van de groep docker in feite root-rechten?



2. Na docker run -d -p 8080:80 nginx toont ss -tlnp de regel 0.0.0.0:8080. Wat had je moeten typen om de poort alleen lokaal te publiceren?



3. Een container start wel, maar de website erin werkt niet. Wat bekijk je als eerste?



4. Waarom kies je één bron voor Docker en installeer je niet docker.io en docker-ce door elkaar?



5. Wat doet docker system prune --volumes dat je goed moet weten?



Opdracht

Opdracht O9.2: Je eerste container. Installeer Docker Engine op je server volgens de les (of op een testmachine). Start een nginx-container die alleen op 127.0.0.1:8080 luistert, controleer met docker ps, curl -I en ss -tlnp, bekijk de logs, en ruim hem daarna op. Beantwoord de vragen: uit welke bron heb je Docker geïnstalleerd, wat liet ss zien bij poort 8080, en heb je jezelf aan de groep docker toegevoegd (waarom wel of niet)?

Opdracht O9.2: Je eerste container

Deze opdracht doe je zelf; niemand kijkt hem na. Vink af wat je gedaan hebt en markeer de opdracht als gedaan.




Je vinkjes en aantekeningen blijven alleen in deze browser; we sturen ze nergens heen. Ben je aangemeld, dan bewaren we in Mijn cursussen alleen dat je de opdracht gedaan hebt.

Verder lezen

Even geduld…

Stel je domeinen in

Regel per domein de nameservers, de koppeling aan je hosting en wie de eigenaar wordt.

Je domeinen laden…