Gå til innholdet

Cookie-innstillinger

Velg hvilke typer cookies du tillater. Du kan når som helst endre valget via Cookie-innstillinger nederst på hver side. Personvernerklæring

Nødvendige

Alltid på

Trengs for å logge inn, beholde handlekurven og huske valgene dine. Disse er alltid på.

Hvilke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: økten din og at du forblir innlogget
  • weboke_basket: handlekurven din
  • wkBtwIncl: visning av priser med eller uten mva.
  • wok_cookies: cookievalget ditt, 12 måneder

Måler hvilken annonse som fører til et besøk eller en bestilling, slik at vi ikke betaler for annonser som ikke gir noe.

Hvilke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), opptil 90 dager
  • OpenAI Ads, annonser i ChatGPT
  • wok_aff: hvilken partner som henviste deg til oss (partnerprogram), 60 dager

4,6

Land og språk

Hvert land har sin egen nettside, med priser og mva. for det landet.

Vis

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:

  1. Dockers egen pakkekilde (download.docker.com). Alltid den nyeste versjonen, inkludert utvidelsen docker compose som du bruker i leksjon 9.3. Det er dette Docker-dokumentasjonen beskriver, og det er dette kurset bruker.
  2. Pakken docker.io fra 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 at docker 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.asc

Deretter 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.asc

Ved 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 anna

Gjø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 /host

og 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:

DelBetydning
-dKjør i bakgrunnen (detached)
--name proefEt navn, slik at du slipper å jobbe med lange ID-er
-p 127.0.0.1:8080:80Port 80 i containeren blir port 8080 på verten, bare på loopback
nginx:stableDet 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 fjern

docker 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 prune

docker 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) eller docker.io fra distribusjonen, ikke begge.
  • Gruppen docker er det samme som root; sudo docker etterlater 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:tag starter en container som bare er tilgjengelig lokalt; kontroller med ss.
  • docker ps, logs, exec, stop, rm er de daglige verktøyene dine.
  • Rydd opp images med docker image prune, begrens containerlogger (ubegrenset som standard), og vær sparsom med --volumes.

Quiz

1. Hvorfor gir medlemskap i gruppen docker i praksis root-rettigheter?



2. Etter docker run -d -p 8080:80 nginx viser ss -tlnp linjen 0.0.0.0:8080. Hva burde du ha skrevet for å publisere porten bare lokalt?



3. En container starter, men nettstedet i den fungerer ikke. Hva ser du på først?



4. Hvorfor velger du én kilde for Docker og installerer ikke docker.io og docker-ce om hverandre?



5. Hva gjør docker system prune --volumes som du bør vite godt?



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.




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

Et øyeblikk …

Sett opp domenene dine

Ordne for hvert domene navnetjenerne, koblingen til hostingen din og hvem som blir innehaver.

Laster inn domenene dine…