Hoppa till innehåll

Docker-kommandon

Den här sidan ger en introduktion till Docker och de kommandon du använder mest. Den går inte igenom varje kommando med alla flaggor, utan innehåller:

  • de begrepp du behöver: image, container, volym och nätverk
  • en lista med kommandon du ska kunna hantera
  • de vanligaste flaggorna till docker run
  • tre sätt att få in filer i en container, och när du använder vilket
  • övningar att göra på egen hand

I kursen utvecklar du dina webbapplikationer i containrar och driftsätter dem som containrar på din Cumulus-server. Det du lär dig här använder du alltså hela kursen.

Tidsåtgång: Ungefär 15 minuter att läsa och en timme för övningarna, plus installationen av Docker Desktop.

Tidsåtgång: Ungefär 15–30 minuter om Docker Desktop inte redan är installerat.

Installera Docker Desktop och starta det. Kontrollera sedan i en terminal att allt fungerar:

Terminal window
docker version

Både Client och Server ska visas. Visas bara Client är Docker Desktop inte startat.

En image är en mall: ett filsystem med allt som ett program behöver, till exempel Ubuntu med Node installerat, och ett kommando som ska köras när den startar. En image ändras aldrig. Den är uppbyggd av lager, där varje lager innehåller ändringar mot lagret under.

En container är en körande instans av en image. Den får ett eget, skrivbart lager ovanpå imagen, egna processer och ett eget nätverk. Du kan starta många containrar från samma image. Containern delar operativsystemets kärna med datorn den körs på. Därför startar den på under en sekund, till skillnad från en virtuell maskin.

Images hämtas från ett registry, normalt Docker Hub. Ett namn som node:26-slim består av imagens namn (node) och en tagg (26-slim) som anger versionen. Utan tagg får du latest, som kan betyda en annan version i morgon. Ange därför alltid en tagg.

Containrar är tillfälliga. Allt som skrivs i containerns eget lager försvinner när containern tas bort. Data som ska sparas läggs i en volym, som lever vidare oberoende av containrarna.

Kommandona har formen docker <objekt> <kommando>. Flera av de vanligaste har också en kortare form, till exempel docker ps för docker container ls. Skriv docker <kommando> --help för att se alla flaggor, eller läs i referensen.

Kommando Vad det gör
docker pull <image> Hämtar en image från ett registry
docker image ls Listar images på din dator
docker build -t <namn> . Bygger en image från en Dockerfile
docker run <image> Skapar och startar en container
docker ps Listar körande containrar. Med -a visas även stoppade.
docker logs <container> Visar det containern har skrivit till stdout och stderr. -f följer loggen.
docker exec -it <container> sh Startar ett skal i en körande container
docker stop <container> Stoppar en container snällt med SIGTERM
docker start <container> Startar en stoppad container igen
docker rm <container> Tar bort en stoppad container. -f stoppar den först.
docker volume ls Listar volymerna
docker network ls Listar nätverken
docker system df Visar hur mycket disk images, containrar och volymer tar
docker system prune Tar bort stoppade containrar, oanvända nätverk och images utan namn

docker compose styr flera containrar samtidigt utifrån en compose.yaml. Den tar du upp i övningen Containerisera en webbapplikation.

Kommando Vad det gör
docker compose up -d Bygger vid behov och startar alla tjänster i bakgrunden
docker compose ps Listar tjänsternas containrar
docker compose logs -f Följer alla tjänsters loggar
docker compose down Stoppar och tar bort containrarna. Volymerna ligger kvar.
Flagga Betydelse
--rm Ta bort containern när den avslutas
-it Interaktiv med en terminal, för att kunna skriva i ett skal
-d Kör i bakgrunden (detached)
--name web Ge containern ett namn, i stället för ett slumpat
-p 127.0.0.1:8080:80 Koppla port 8080 på din dator till port 80 i containern
-v <källa>:<mål> Montera en katalog eller volym i containern
-w /app Arbetskatalog i containern
-e NAMN=värde Sätt en miljövariabel. --env-file .env läser dem från en fil.
Sätt Hur Används till
Montera en katalog (bind mount) -v "./site:/usr/share/caddy" Utveckling. Ändringar på din dator syns direkt i containern.
Namngiven volym -v data:/data Data som ska sparas, som en databas. Docker förvaltar volymen.
Kopiera in i imagen COPY site /usr/share/caddy i en Dockerfile Produktion. Imagen innehåller allt och kör likadant överallt.

En sökväg som börjar med . räknas från katalogen du står i, så ./site är katalogen site där och . är den aktuella katalogen. Utan ./ tolkar Docker site som namnet på en volym.

Tidsåtgång: Ungefär en timme för alla elva övningarna.

När du har gått igenom kommandona kan du pröva dina kunskaper med övningarna nedan. Gör dem i ordning. Försök själv innan du tittar på lösningsförslaget. Den sista övningen städar bort det du har skapat.

Tidsåtgång: Ungefär 5 minuter.

Kör imagen hello-world och läs utskriften. Vilka fyra steg tog Docker?

Terminal window
docker run hello-world

Klienten kontaktade Docker-tjänsten, tjänsten hämtade imagen från Docker Hub, skapade en container från den och skickade containerns utdata tillbaka till din terminal.

Tidsåtgång: Ungefär 5 minuter.

Starta ett interaktivt skal i en container från ubuntu:26.04 som tas bort när du avslutar den. Skapa filen /tmp/fil.txt, avsluta och starta en ny container på samma sätt. Finns filen?

Terminal window
docker run --rm -it ubuntu:26.04
# i containern:
echo hej > /tmp/fil.txt
exit
docker run --rm -it ubuntu:26.04
ls /tmp

Filen finns inte. Den nya containern startar från samma orörda image, och den första containern togs bort med sitt skrivbara lager när den avslutades.

Tidsåtgång: Ungefär 5 minuter.

Visa innehållet i /etc/os-release i en container från ubuntu:26.04 och i en från node:26-slim, utan att starta något interaktivt skal. Vilken distribution bygger Node-imagen på?

Terminal window
docker run --rm ubuntu:26.04 cat /etc/os-release
docker run --rm node:26-slim cat /etc/os-release

Allt efter imagens namn ersätter det kommando som imagen annars kör. node:26-slim bygger på Debian. slim betyder att den bara innehåller det nödvändigaste.

Tidsåtgång: Ungefär 2 minuter.

Ta reda på vilken version av Node som finns i node:26-slim, utan att starta något skal. Du behöver inte ha Node installerat för att göra det.

Terminal window
docker run --rm node:26-slim node --version

Tidsåtgång: Ungefär 5 minuter.

Starta webbservern Caddy (caddy:2) i bakgrunden, med namnet web, och koppla port 8080 på din dator, bara på 127.0.0.1, till port 80 i containern. Öppna localhost:8080. Lista de körande containrarna och visa loggen för web.

Terminal window
docker run -d --name web -p 127.0.0.1:8080:80 caddy:2
docker ps
docker logs web

Tidsåtgång: Ungefär 5 minuter.

Starta ett skal i den körande containern web. Vilken användare är du, och vilka filer finns i /usr/share/caddy? Ta sedan bort containern.

Terminal window
docker exec -it web sh
# i containern:
whoami
ls /usr/share/caddy
exit
docker rm -f web

Du är root i containern, men bara i containern. sh används eftersom Caddy-imagen saknar bash.

Tidsåtgång: Ungefär 10 minuter.

Skapa katalogen site med filen index.html och lite HTML i. Starta Caddy igen och montera site på /usr/share/caddy, skrivskyddad. Öppna sidan, ändra i index.html och ladda om.

Terminal window
docker run -d --rm --name web -p 127.0.0.1:8080:80 -v "./site:/usr/share/caddy:ro" caddy:2

:ro gör monteringen skrivskyddad för containern. Ändringen syns direkt, eftersom containern läser filen från din dator.

Tidsåtgång: Ungefär 5 minuter.

Skriv datum och tid till filen /data/logg.txt i en container som har volymen anteckningar monterad på /data. Gör samma sak i en ny container, och visa sedan filens innehåll. Hur många rader finns det, och varför?

Terminal window
docker run --rm -v anteckningar:/data ubuntu:26.04 bash -c 'date >> /data/logg.txt'
docker run --rm -v anteckningar:/data ubuntu:26.04 bash -c 'date >> /data/logg.txt'
docker run --rm -v anteckningar:/data ubuntu:26.04 cat /data/logg.txt

Två rader. Volymen skapades första gången den användes och lever vidare fast containrarna togs bort. På samma sätt sparar du databasens data när du kör MongoDB i en container.

Tidsåtgång: Ungefär 5 minuter.

Skapa filen hello.js med raden console.log('Hej från', process.version). Kör den med Node i en container från node:26-slim, genom att montera den aktuella katalogen.

Terminal window
docker run --rm -v ".:/app" -w /app node:26-slim node hello.js

Tidsåtgång: Ungefär 10 minuter.

Skriv en Dockerfile som utgår från caddy:2 och kopierar in katalogen site. Bygg imagen med namnet min-sajt och kör den på port 8080. Ändra i index.html och ladda om. Varför syns inte ändringen nu, när den syntes i övning 7?

Dockerfile:

FROM caddy:2
COPY site /usr/share/caddy
Terminal window
docker stop web
docker build -t min-sajt .
docker run -d --rm --name web -p 127.0.0.1:8080:80 min-sajt

Filerna kopierades in i imagen när den byggdes. Ändringen syns först när du bygger en ny image och startar en ny container. Det är precis vad du vill i produktion, där imagen ska innehålla en bestämd version av applikationen.

Tidsåtgång: Ungefär 5 minuter.

Ta reda på hur mycket diskutrymme Docker använder. Ta bort containern web, volymen anteckningar och imagen min-sajt, och städa sedan bort allt som inte används.

Terminal window
docker system df
docker stop web
docker volume rm anteckningar
docker image rm min-sajt
docker system prune

docker system prune tar inte bort volymer, eftersom de kan innehålla data du vill ha kvar.

CCBY