Docker - Kom i gang

Skip to content

Kom i gang med Docker

Docker gjør det mulig å kjøre en applikasjon i en container. Containeren har sitt eget filsystem og nettverk, men bruker operativsystemet på serveren. Derfor kan den samme applikasjonen kjøre på flere maskiner uten at alle avhengighetene må installeres direkte på hver maskin.

Her begynner du med et ferdig image. Du henter et image, starter en container, undersøker hva som kjører og sletter containeren igjen. nginx, en vanlig webserver, brukes som eksempel.

Docker vs Virtual Machines meme

Image og container

Et image er en ferdig pakke med filer, program og innstillinger. En container er en kjørende instans av et image. Ett image kan derfor brukes til å starte flere containere.

Docker IRL meme

Et image kan ligge i et containerregister, for eksempel Docker Hub eller GitHub Container Registry. Når du bruker et image som ikke finnes lokalt, laster Docker det automatisk ned fra registeret.

flowchart LR
    R[Containerregister] -->|docker pull| I[Image]
    I -->|docker run| C[Container]

Forutsetninger

Du trenger en Debian- eller Ubuntu-server i Proxmox og tilgang via SSH.

Ny på Proxmox eller nettverksgrunnlaget?

🖥️ Serverinstallasjon - VM i Proxmox viser hvordan du oppretter en VM og installerer Ubuntu eller Debian, steg for steg. Har du ikke tilgang til Proxmox, viser 🖥️ Serverinstallasjon - Bare metal det samme direkte på fysisk maskinvare. 🖥️ Virtualisering er vurderingsoppgaven der du senere dokumenterer at du mestrer dette selvstendig. 🌐 Nettverksprotokoller går gjennom IP-adresser og porter.

Installer Docker Engine

Følg den offisielle installasjonsveiledningen for Docker Engine på Debian eller Docker Engine på Ubuntu.

Kontroller installasjonen:

docker --version
sudo systemctl status docker
sudo docker run hello-world

hello-world laster ned et lite image, starter en testcontainer og skriver en melding.

Dersom docker bare virker med sudo, kan du legge brukeren din til i docker-gruppen slik at du slipper å skrive sudo foran hver kommando:

sudo usermod -aG docker $USER

Logg ut og inn igjen (eller kjør newgrp docker) for at endringen skal tre i kraft. Fram til da kan du bruke sudo foran kommandoene i resten av oppgaven.

Hent og kjør en ferdig webserver

Hva er Nginx?

Nginx er en webserver. Den kan sende nettsider og andre filer til nettleseren når nettleseren ber om dem. Nginx kan også brukes som reverse proxy foran andre applikasjoner, noe du møter senere i Docker-opplegget. Her bruker vi Nginx fordi det finnes som et ferdig image og gir en synlig nettside når containeren kjører.

Hent Nginx-imaget eksplisitt:

docker pull nginx:alpine

nginx er image-navnet, mens alpine er en tag som velger en liten variant. Start en container fra imaget:

docker run -d --name min-nginx -p 8080:80 nginx:alpine

Her betyr kommandoen:

Del Betydning
-d start containeren detached, altså som en daemon (bakgrunnsprosess), slik at terminalen kan brukes videre
--name min-nginx gi containeren et navn
-p 8080:80 koble port 8080 på serveren til port 80 i containeren
nginx:alpine bruk dette imaget og denne taggen

Åpne http://SERVER-IP:8080 fra en annen maskin. Du skal få standardsiden til Nginx. Det er første eksempel på at du kan ta i bruk en ferdig container uten å skrive en Dockerfile.

Se hva som skjer

docker ps
docker ps -a
docker images
docker logs min-nginx
docker exec -it min-nginx sh

docker ps viser kjørende containere, mens docker ps -a også viser containere som har stoppet. docker images viser images som er lastet ned. Nginx skriver ikke mye til loggen når alt fungerer, men kommandoen er nyttig når en container feiler. docker exec -it min-nginx sh gir deg en terminal inne i den kjørende containeren, slik at du kan undersøke filsystemet direkte. Bruk bash i stedet for sh hvis basisimaget har det installert.

Stopp og start containeren uten å lage den på nytt:

docker stop min-nginx
docker start min-nginx

Når du ikke trenger den lenger, slett containeren:

docker stop min-nginx
docker rm min-nginx

Å slette en container sletter ikke imaget. Du kan starte en ny container fra nginx:alpine senere.

Koble en lokal mappe til containeren

En container kan slettes og opprettes på nytt. Filer som bare ligger i containerens eget skrivbare lag, er derfor ikke et trygt sted å lagre data. Nå kobler du i stedet en mappe på serveren direkte til en mappe i containeren. Dette kalles en bind mount.

Nginx bruker /usr/share/nginx/html som mappe for nettsiden. Lag først en lokal mappe:

mkdir -p ./nginx-innhold

Opprett deretter ./nginx-innhold/index.html i en teksteditor, og legg inn litt HTML. Du kan også legge flere HTML-filer i mappen etter hvert.

Start deretter Nginx og koble den lokale mappen til mappen inne i containeren:

docker run -d --name nginx-med-volume -p 8081:80 \
  -v ./nginx-innhold:/usr/share/nginx/html \
  nginx:alpine

I -v ./nginx-innhold:/usr/share/nginx/html er det som står før kolon den lokale mappen på serveren, og det som står etter kolon mappen inne i containeren. ./ foran mappen er viktig: Det viser at nginx-innhold ligger i mappen du står i. En lokal mappe er nyttig når du vil kunne se og redigere filene direkte på serveren.

Åpne http://SERVER-IP:8081 i nettleseren. Rediger index.html eller legg til flere HTML-filer i ./nginx-innhold, og oppdater nettleseren. Endringene vises uten at du bygger imaget på nytt, fordi containeren leser filene fra den lokale mappen.

Slett containeren og start en ny med den samme lokale mappen:

docker rm -f nginx-med-volume
docker run -d --name nginx-med-volume-ny -p 8081:80 \
  -v ./nginx-innhold:/usr/share/nginx/html \
  nginx:alpine

Nettsiden er fortsatt der fordi innholdet ligger i ./nginx-innhold, ikke bare i den første containeren. Når du er ferdig med forsøket, kan du rydde opp:

docker rm -f nginx-med-volume-ny
rm -rf ./nginx-innhold

Note

En bind mount er ikke en sikkerhetskopi. Den gjør filene tilgjengelige utenfor containeren, men du må fortsatt ta sikkerhetskopi av viktige data.

Containeren skal normalt ikke ha tilgang til vertsmaskinen

Kommandoen --privileged gir containeren mange ekstra Linux-rettigheter. Den kan da få tilgang til enheter og funksjoner på vertsmaskinen som applikasjonen vanligvis ikke trenger. For en vanlig webapplikasjon skal du ikke bruke --privileged, og du skal heller ikke montere mapper som /etc, /var/run eller hele filsystemet uten at læreren har forklart hvorfor det er nødvendig. Bruk den minst mulige tilgangen som løser oppgaven. Bind mounten fra forrige avsnitt bør for eksempel bare gi tilgang til ./nginx-innhold, ikke hele serverens filsystem.

Bruk et navngitt volume

Et navngitt volume er et alternativ til bind mount. I stedet for å peke til en bestemt mappe på serveren, oppretter og administrerer Docker selv lagringen:

docker volume create nginx-volum
docker run -d --name nginx-navngitt-volum -p 8082:80 \
  -v nginx-volum:/usr/share/nginx/html \
  nginx:alpine

Forskjellen fra forrige avsnitt er at nginx-volum ikke har ./ foran seg. Uten ./ bruker Docker et navngitt volume den selv oppretter og eier; med ./ peker Docker til en mappe i katalogen du står i (en bind mount). Begge overlever at containeren slettes, men bare bind mounten er direkte synlig og redigerbar fra serverens eget filsystem. Et navngitt volume ligger i Dockers eget lagringsområde.

Rydd opp når du er ferdig:

docker rm -f nginx-navngitt-volum
docker volume rm nginx-volum

Viktige begreper

Begrep Forklaring
image En ferdig pakke som brukes som grunnlag for containere
container En kjørende instans av et image
containerregister Et lager der images kan hentes fra og publiseres til
port En kobling mellom serveren og et program i containeren
volume Lagring som kan brukes av flere containerinstanser og overlever at en container slettes
bind mount En lokal fil eller mappe som kobles direkte inn i containeren
logg Teksten applikasjonen skriver ut under kjøring

Hvis noe går galt

  1. Kommandoen finnes ikke: Docker er ikke installert, eller brukeren mangler tilgang.
  2. Containeren stopper: Kjør docker ps -a og docker logs <container> for å lese feilmeldingen.
  3. Nettsiden svarer ikke: Sjekk at containeren kjører, at porten er publisert, og at du bruker riktig IP-adresse og port.
  4. Porten er opptatt: Stopp den gamle containeren eller velg en annen port på serveren.
  5. Innholdet forsvant: Sjekk at du monterte den samme lokale mappen med -v da du startet den nye containeren.

Noter feilmeldingen før du søker etter en løsning. Det gjør det enklere å forklare hva du har prøvd.

Neste steg

Når du har hentet, kjørt og undersøkt en ferdig container, går du videre til Docker - Dockerfile og Compose. Der bygger du et image fra din egen Flask-applikasjon og beskriver containeren med Compose.