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:
- De pakketbron van Docker zelf (
download.docker.com). Altijd de nieuwste versie, inclusief de plug-indocker composedie je in les 9.3 gebruikt. Dit is wat de Docker-documentatie beschrijft en wat deze cursus gebruikt. - Het pakket
docker.iovan 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 ofdocker 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.ascDaarna 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.ascBij 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 annaDoe 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 /hosten 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:
| Deel | Betekenis |
|---|---|
-d | Op de achtergrond draaien (detached) |
--name proef | Een naam, zodat je niet met lange ID's hoeft te werken |
-p 127.0.0.1:8080:80 | Poort 80 in de container wordt poort 8080 op de host, alleen op loopback |
nginx:stable | Het 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 verwijderendocker 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 prunedocker 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) ofdocker.iouit de distributie, niet allebei. - De groep docker staat gelijk aan root;
sudo dockerhoudt 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:tagstart een container die alleen lokaal bereikbaar is; controleer metss.docker ps,logs,exec,stop,rmzijn je dagelijkse gereedschap.- Ruim images op met
docker image prune, begrens containerlogs (standaard onbeperkt), en wees zuinig met--volumes.
Quiz
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.
Uit de bron van Docker werkt unattended-upgrades hem standaard niet bij; docker.io uit de distributie wel. ss hoort 127.0.0.1:8080 te tonen, niet 0.0.0.0:8080. De groep docker geeft root-rechten; met sudo docker blijft elk commando in het sudo-log.
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
- Docker-documentatie, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker-documentatie, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker-documentatie, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker-documentatie, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker-documentatie, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker-documentatie, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
