Modul 9 · 9.2
Installer Docker og din første container
Modul 9: Docker og docker compose · Lesetid: 11 minutter
Læringsmål: Etter denne leksjonen kan du installere Docker Engine fra den offisielle pakkekilden, starte, se på, se inn i og rydde opp containere, og du vet hvorfor gruppen docker er det samme som root.
Nøkkelbegreper: Docker Engine, Docker Desktop, offisiell 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: bakgrunnstjenesten (dockerd) pluss kommandoen docker. Docker Desktop er noe annet: et program med vinduer for Windows, macOS og Linux-skrivebord. Det hører ikke hjemme på en server.
Det finnes to ryddige kilder for Docker Engine:
- Dockers egen pakkekilde (
download.docker.com). Alltid den nyeste versjonen, inkludert utvidelsendocker composesom du bruker i leksjon 9.3. Det er dette Docker-dokumentasjonen beskriver, og det er dette kurset bruker. - Pakken
docker.iofra Debian eller Ubuntu. Eldre, men oppdatert av distribusjonen via de vanlige sikkerhetsoppdateringene dine (leksjon 4.2). Helt greit hvis du helst ikke vil ha noe utenfor distribusjonen; sjekk da atdocker compose(med mellomrom) er tilgjengelig.
Velg én av dem. Blander du dem, får du konflikter; Docker-dokumentasjonen sier derfor at du først skal fjerne uoffisielle pakker som docker.io, docker-compose og podman-docker.
Installere fra Dockers pakkekilde
Dette er trinnene fra Docker-dokumentasjonen for Debian, med nøkkelen for seg og en egen Signed-By (leksjon 4.1). Ta gjerne et øyeblikksbilde (snapshot) først.
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.ascDeretter 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 til din utgivelse stå (cat /etc/os-release, leksjon 4.3), og ved Architectures utdataene fra 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 av seg selv etter installasjonen, og også etter hver omstart (systemctl status docker, leksjon 6.1).
Merk: unattended-upgrades (leksjon 4.2) oppdaterer som standard ikke pakker fra denne kilden automatisk. Ta med sudo apt update && sudo apt upgrade for Docker i vedlikeholdsrytmen din (leksjon 10.4), eller legg bevisst til kilden i de automatiske oppdateringene dine.
Gruppen docker er root
Overalt på internett står det at du skal legge deg selv til i gruppen docker, slik at du slipper å skrive sudo:
anna@web1:~$ sudo usermod -aG docker annaGjør det bare hvis du forstår hva det betyr. Docker-dokumentasjonen er tydelig: gruppen docker gir rettigheter på root-nivå. Den som kan styre Docker-tjenesten, kan starte en container med hele vertens disk montert inn:
docker run -it -v /:/host debian chroot /hostog er dermed root på serveren din, uten passord og uten sudo-logg. Docker-dokumentasjonen sier det slik: bare betrodde brukere skal få styre Docker-tjenesten.
For en server som bare du selv administrerer, er det et valg: bekvemmelighet mot en ekstra vei til root. Sikrere er det å fortsette å skrive sudo docker ...; da havner hver kommando i sudo-loggen (leksjon 3.2). Legg uansett aldri til en bruker i gruppen som ikke skal være root, for eksempel en tjenestebruker for et nettsted.
Rootless mode
Docker kan også kjøre uten root: tjenesten og containerne kjører da under en vanlig bruker, med et eget user namespace. Du installerer det som denne brukeren med dockerd-rootless-setuptool.sh install (fra pakken docker-ce-rootless-extras; på forhånd trenger du pakken uidmap). En sårbarhet i en container gir da ikke root på verten. Det finnes begrensninger, og det er vanskeligere å sette opp; i dette kurset bruker vi den vanlige installasjonen og holder det sikkert med reglene fra denne modulen.
En første ekte container
Vi starter en nginx-webserver i en container, bare tilgjengelig 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 | Kjør i bakgrunnen (detached) |
--name proef | Et navn, slik at du slipper å jobbe med lange ID-er |
-p 127.0.0.1:8080:80 | Port 80 i containeren blir port 8080 på verten, bare på loopback |
nginx:stable | Det offisielle nginx-imaget, tag stable |
Kontroller:
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 (leksjon 5.1) bekrefter: bare på 127.0.0.1. Hadde du skrevet -p 8080:80, ville det stått 0.0.0.0:8080 og [::]:8080, og containeren din ville vært tilgjengelig fra internett, også om ufw ikke tillater port 8080 (leksjon 9.3). Versjonen i Server-headeren kan være en annen hos deg.
Se deg rundt og gripe inn
anna@web1:~$ sudo docker logs proef # det programmet skrev (stdout og stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # de siste 20 linjene og fortsett å følge
anna@web1:~$ sudo docker exec -it proef sh # et skall i den kjørende containeren
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # stopp og fjerndocker logs er det første stedet du ser når en container ikke gjør det du forventer, akkurat som journalctl for vanlige tjenester (leksjon 6.2). Med docker exec ser du inn i containeren, men der bør du helst ikke endre noe: endringer i containeren forsvinner ved neste oppdatering (leksjon 9.1).
Rydde opp
Images og stoppede containere blir liggende til du rydder dem bort. På en VPS med liten disk vokser dette uten at du merker 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 uten navn som ikke lenger hører til noe; med -a også alle images som ingen container bruker. Vær forsiktig med docker system prune --volumes: det fjerner også anonyme volumer (uten navn) som i øyeblikket ikke hører til en container, og docker volume prune -a til og med volumer med navn. Der kan dataene dine ligge. Gi derfor alltid volumer et navn eller bruk en bind mount (leksjon 9.1), og se først med docker volume ls.
Loggene til containere kan også vokse. Docker lagrer dem som standard i JSON-filer uten størrelsesgrense. En grense setter du i /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Deretter sudo systemctl restart docker; innstillingen gjelder bare for nyopprettede containere, eksisterende containere oppretter du på nytt.
I praksis
Docker fungerer på en VPS hos WebOké på samme måte som hos alle andre leverandører: det er programvare på din egen server, som du selv installerer og oppdaterer. På en liten VPS bør du jevnlig sjekke diskplassen med docker system df og df -h (leksjon 1.4).
Oppsummering
- Installer Docker Engine fra Dockers pakkekilde (med egen nøkkel og
Signed-By) ellerdocker.iofra distribusjonen, ikke begge. - Gruppen docker er det samme som root;
sudo dockeretterlater et spor i sudo-loggen. Rootless mode er et sikrere, men mer begrenset alternativ. docker run -d --name ... -p 127.0.0.1:host:container image:tagstarter en container som bare er tilgjengelig lokalt; kontroller medss.docker ps,logs,exec,stop,rmer de daglige verktøyene dine.- Rydd opp images med
docker image prune, begrens containerlogger (ubegrenset som standard), og vær sparsom med--volumes.
Quiz
Oppgave
Oppgave O9.2: Din første container. Installer Docker Engine på serveren din slik leksjonen viser (eller på en testmaskin). Start en nginx-container som bare lytter på 127.0.0.1:8080, kontroller med docker ps, curl -I og ss -tlnp, se på loggene, og rydd den deretter bort. Svar på spørsmålene: fra hvilken kilde installerte du Docker, hva viste ss for port 8080, og har du lagt deg selv til i gruppen docker (hvorfor eller hvorfor ikke)?
Oppgave O9.2: Din første container
Denne oppgaven gjør du selv; ingen kontrollerer den. Kryss av det du har gjort, og merk oppgaven som fullført.
Fra Dockers egen kilde oppdaterer ikke unattended-upgrades den som standard, men docker.io fra distribusjonen gjør det. ss skal vise 127.0.0.1:8080, ikke 0.0.0.0:8080. Gruppen docker gir root-rettigheter; med sudo docker havner hver kommando i sudo-loggen.
Avkrysningene og notatene dine blir kun i denne nettleseren; vi sender dem ikke noe sted. Er du logget inn, lagrer vi kun i Mine kurs at du har gjort oppgaven.
Les mer
- Docker-dokumentasjonen, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker-dokumentasjonen, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker-dokumentasjonen, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker-dokumentasjonen, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker-dokumentasjonen, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker-dokumentasjonen, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
