Gå direkte til indholdet

Cookieindstillinger

Vælg for hver type, hvilke cookies du tillader. Du kan altid ændre dit valg via Cookieindstillinger nederst på hver side. Privatlivspolitik

Nødvendige

Altid slået til

Nødvendige for at logge ind, gemme din kurv og huske dine valg. De er altid slået til.

Hvilke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session og at forblive logget ind
  • weboke_basket: din kurv
  • wkBtwIncl: vise priser med eller uden moms
  • wok_cookies: dit cookievalg, 12 måneder

Måler, hvilken annonce der fører til et besøg eller en bestilling, så vi ikke betaler for annoncer, der ikke virker.

Hvilke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), op til 90 dage
  • OpenAI Ads, annoncer i ChatGPT
  • wok_aff: hvilken partner der henviste dig til os (affiliateprogram), 60 dage

4,6

Land og sprog

Hvert land har sin egen side med landets priser og moms.

Se

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:

  1. Dockers egen pakkekilde (download.docker.com). Altid den nyeste version, inklusive plug-in'en docker compose, som du bruger i lektion 9.3. Det er det, Docker-dokumentationen beskriver, og det, dette kursus bruger.
  2. Pakken docker.io fra 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å, om docker 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.asc

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

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

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

DelBetydning
-dKør i baggrunden (detached)
--name proefEt navn, så du ikke skal arbejde med lange ID'er
-p 127.0.0.1:8080:80Port 80 i containeren bliver port 8080 på værten, kun på loopback
nginx:stableDet 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 fjern

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

docker 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) eller docker.io fra distributionen, ikke begge.
  • Gruppen docker svarer til root; sudo docker efterlader 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:tag starter en container, som kun kan nås lokalt; kontrollér med ss.
  • docker ps, logs, exec, stop, rm er 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

1. Hvorfor giver medlemskab af gruppen docker reelt root-rettigheder?



2. Efter docker run -d -p 8080:80 nginx viser ss -tlnp linjen 0.0.0.0:8080. Hvad skulle du have skrevet for kun at publicere porten lokalt?



3. En container starter godt nok, men websitet i den virker ikke. Hvad kigger du på først?



4. Hvorfor vælger du én kilde til Docker og installerer ikke docker.io og docker-ce blandet?



5. Hvad gør docker system prune --volumes, som du skal være klar over?



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.




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

Et øjeblik…

Opsæt dine domæner

Angiv for hvert domæne navneserverne, tilknytningen til din hosting, og hvem der bliver ejer.

Indlæser dine domæner…