Modul 9 · 9.2
Installer Docker og din første container
Modul 9: Docker og docker compose · Læsetid: 11 minutter
Læringsmål: Efter denne lektion kan du installere Docker Engine fra den officielle pakkekilde, starte containere, se dem, kigge ind i dem og rydde op i dem, og du ved, hvorfor gruppen docker svarer til root.
Centrale begreber: Docker Engine, Docker Desktop, officiel apt-kilde, docker.io fra Debian, gruppen 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
Hvilken Docker?
På en server installerer du Docker Engine: baggrundstjenesten (dockerd) plus kommandoen docker. Docker Desktop er noget andet: et program med vinduer til Windows, macOS og Linux-desktops. Det hører ikke hjemme på en server.
Der er to pæne kilder til Docker Engine:
- Dockers egen pakkekilde (
download.docker.com). Altid den nyeste version, inklusive plug-in'endocker compose, som du bruger i lektion 9.3. Det er det, Docker-dokumentationen beskriver, og det, dette kursus bruger. - Pakken
docker.iofra Debian eller Ubuntu. Ældre, men holdt opdateret af distributionen via dine almindelige sikkerhedsopdateringer (lektion 4.2). Fint, hvis du helst ikke vil have noget udefra distributionen; tjek så, omdocker compose(med mellemrum) er tilgængelig.
Vælg én af dem. Installerer du dem blandet, giver det konflikter; Docker-dokumentationen siger derfor, at du først skal fjerne uofficielle pakker som docker.io, docker-compose og podman-docker.
Installér fra Dockers pakkekilde
Det er trinnene fra Docker-dokumentationen til Debian, med nøglen for sig og en egen Signed-By (lektion 4.1). Tag først et snapshot, hvis du har lyst.
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.ascDerefter kildefilen /etc/apt/sources.list.d/docker.sources (deb822-format):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascVed Suites skal kodenavnet for din release stå (cat /etc/os-release, lektion 4.3) og ved Architectures outputtet af dpkg --print-architecture. På Ubuntu er URL'en https://download.docker.com/linux/ubuntu og suiten for eksempel noble.
Så installerer du:
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.På Debian og Ubuntu starter Docker af sig selv efter installationen og også efter hver genstart (systemctl status docker, lektion 6.1).
Bemærk: unattended-upgrades (lektion 4.2) opdaterer som standard ikke pakker fra denne kilde automatisk. Tag sudo apt update && sudo apt upgrade for Docker med i din vedligeholdelsesrytme (lektion 10.4), eller tilføj kilden bevidst til dine automatiske opdateringer.
Gruppen docker er root
Overalt på internettet står der, at du skal føje dig selv til gruppen docker, så du ikke længere behøver at skrive sudo:
anna@web1:~$ sudo usermod -aG docker annaGør det kun, hvis du forstår, hvad det betyder. Docker-dokumentationen er tydelig: gruppen docker giver rettigheder på niveau med root. Den, der må styre Docker-tjenesten, kan starte en container med hele værtens disk monteret:
docker run -it -v /:/host debian chroot /hostog er dermed root på din server, uden adgangskode og uden sudo-log. Docker-dokumentationen siger det sådan: kun betroede brugere bør have lov til at styre Docker-tjenesten.
For en server, som kun du selv administrerer, er det et valg: bekvemmelighed over for en ekstra vej til root. Mere sikkert er det at blive ved med at skrive sudo docker ...; så står hver kommando i sudo-loggen (lektion 3.2). Føj under alle omstændigheder aldrig en bruger til gruppen, som ikke må være root, for eksempel en tjenestebruger til et website.
Rootless mode
Docker kan også køre uden root: tjenesten og containerne kører så under en almindelig bruger med sit eget user namespace. Du installerer det som den bruger med dockerd-rootless-setuptool.sh install (fra pakken docker-ce-rootless-extras; først skal pakken uidmap være installeret). Et hul i en container giver så ikke root på værten. Der er begrænsninger, og det er sværere at sætte op; i dette kursus bruger vi den almindelige installation og holder det sikkert med reglerne fra dette modul.
En første rigtig container
Vi starter en nginx-webserver i en container, som kun kan nås fra selve serveren:
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...Delene:
| Del | Betydning |
|---|---|
-d | Kør i baggrunden (detached) |
--name proef | Et navn, så du ikke skal arbejde med lange ID'er |
-p 127.0.0.1:8080:80 | Port 80 i containeren bliver port 8080 på værten, kun på loopback |
nginx:stable | Det officielle nginx-image, tag stable |
Kontrollér:
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 (lektion 5.1) bekræfter: kun på 127.0.0.1. Havde du skrevet -p 8080:80, ville der stå 0.0.0.0:8080 og [::]:8080, og din container kunne nås fra internettet, også selvom ufw ikke tillader port 8080 (lektion 9.3). Versionen i Server-headeren kan være en anden hos dig.
Kig dig omkring og grib ind
anna@web1:~$ sudo docker logs proef # hvad programmet skrev (stdout og stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # de sidste 20 linjer og bliv ved med at følge
anna@web1:~$ sudo docker exec -it proef sh # en shell i den kørende 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 # stop og fjerndocker logs er det første sted, du kigger, når en container ikke gør, hvad du forventer, ligesom journalctl for almindelige tjenester (lektion 6.2). Med docker exec kigger du indenfor, men lad helst være med at ændre noget der: ændringer i containeren forsvinder ved næste opdatering (lektion 9.1).
Ryd op
Images og stoppede containere bliver liggende, indtil du rydder op. På en VPS med en lille disk løber det op, uden at du opdager det.
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 fjerner images uden navn, som ikke længere hører til noget; med -a også alle images, som ingen container bruger. Vær forsigtig med docker system prune --volumes: den fjerner også anonyme volumes (uden navn), som i øjeblikket ikke hører til en container, og docker volume prune -a fjerner endda volumes med navn. Dine data kan ligge i dem. Giv derfor altid volumes et navn eller brug en bind mount (lektion 9.1), og kig først med docker volume ls.
Containernes logs kan også vokse. Docker gemmer dem som standard i JSON-filer uden størrelsesgrænse. En grænse sætter du i /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Derefter sudo systemctl restart docker; indstillingen gælder kun for nyoprettede containere, eksisterende containere opretter du igen.
I praksis
Docker fungerer på en VPS hos WebOké på samme måde som hos alle andre udbydere: det er software på din egen server, som du selv installerer og opdaterer. På en lille VPS bør du jævnligt holde øje med diskpladsen med docker system df og df -h (lektion 1.4).
Opsummering
- Installér Docker Engine fra Dockers pakkekilde (med egen nøgle og
Signed-By) ellerdocker.iofra distributionen, ikke begge. - Gruppen docker svarer til root;
sudo dockerefterlader et spor i sudo-loggen. Rootless mode er et sikrere, men mere begrænset alternativ. docker run -d --name ... -p 127.0.0.1:host:container image:tagstarter en container, som kun kan nås lokalt; kontrollér medss.docker ps,logs,exec,stop,rmer dit daglige værktøj.- Ryd op i images med
docker image prune, begræns containerlogs (som standard ubegrænsede), og vær varsom med--volumes.
Quiz
Opgave
Opgave O9.2: Din første container. Installér Docker Engine på din server som beskrevet i lektionen (eller på en testmaskine). Start en nginx-container, som kun lytter på 127.0.0.1:8080, kontrollér med docker ps, curl -I og ss -tlnp, se loggene, og ryd derefter op i den. Besvar spørgsmålene: fra hvilken kilde installerede du Docker, hvad viste ss ved port 8080, og har du føjet dig selv til gruppen docker (hvorfor eller hvorfor ikke)?
Opgave O9.2: Din første container
Denne opgave laver du selv; ingen tjekker den. Afkryds hvad du har gjort, og markér opgaven som udført.
Fra Dockers egen kilde opdaterer unattended-upgrades den som standard ikke; docker.io fra distributionen bliver opdateret. ss skal vise 127.0.0.1:8080, ikke 0.0.0.0:8080. Gruppen docker giver root-rettigheder; med sudo docker havner hver kommando i sudo-loggen.
Dine afkrydsninger og noter forbliver kun i denne browser; vi sender dem ingen steder hen. Er du logget ind, gemmer vi kun i Mine kurser, at du har udført opgaven.
Læs mere
- Docker-dokumentationen, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker-dokumentationen, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker-dokumentationen, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker-dokumentationen, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker-dokumentationen, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker-dokumentationen, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: fra første login til sikker server 6.1: Installer Docker fra den officielle kilde
