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.
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.
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
- Kommandoen finnes ikke: Docker er ikke installert, eller brukeren mangler tilgang.
- Containeren stopper: Kjør
docker ps -aogdocker logs <container>for å lese feilmeldingen. - Nettsiden svarer ikke: Sjekk at containeren kjører, at porten er publisert, og at du bruker riktig IP-adresse og port.
- Porten er opptatt: Stopp den gamle containeren eller velg en annen port på serveren.
- Innholdet forsvant: Sjekk at du monterte den samme lokale mappen med
-vda 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.

