Begreber
Tre kerneord du møder hele tiden: et image er en uforanderlig skabelon (kode + afhængigheder), en container er en kørende instans af et image, og Compose beskriver en eller flere containere deklarativt i en YAML-fil så hele stacken starter med én kommando.
Installation
Ubuntu / DebianBrug Dockers officielle apt-repo frem for distro-pakken — den er nyere og inkluderer Compose v2 som plugin.
sudo apt remove docker docker-engine docker.io containerd runc # hvis til stede
sudo apt update
sudo apt install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$VERSION_CODENAME ikke genkendes af repoet, sæt det manuelt til den Ubuntu/Debian-base din version bygger på (fx noble eller bookworm).sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin -y
sudo docker run --rm hello-world
docker compose version
Post-install
Kør Docker uden sudo og lad daemonen starte ved boot.
sudo usermod -aG docker $USER
# log ud/ind eller:
newgrp docker
sudo systemctl enable --now docker
docker-gruppen svarer reelt til root-adgang (man kan montere værtsfilsystemet ind i en container). Giv kun betroede brugere adgang, og overvej rootless-mode på multi-user-systemer.Docker Compose
deklarativtBeskriv din stack i compose.yaml og styr den med docker compose. Eksempel-skelet:
services:
app:
image: nginx:latest
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
volumes:
- ./data:/usr/share/nginx/html:ro
networks: [ web ]
networks:
web:
| Kommando | Funktion |
|---|---|
docker compose up -d | Start stack i baggrunden (detached) |
docker compose down | Stop og fjern containere + netværk |
docker compose pull | Hent nyeste images |
docker compose logs -f | Følg logs live |
docker compose ps | Status for stackens services |
docker compose restart | Genstart services |
docker compose exec app sh | Åbn shell i en kørende container |
docker compose pull && docker compose up -d henter nye images og genskaber kun de containere der ændrede sig.CLI-reference
| Kommando | Funktion |
|---|---|
docker ps / docker ps -a | Kørende / alle containere |
docker images | Liste lokale images |
docker logs -f NAME | Følg en containers logs |
docker exec -it NAME sh | Interaktiv shell i container |
docker stop / start / restart NAME | Livscyklus-styring |
docker rm NAME / docker rmi IMAGE | Fjern container / image |
docker inspect NAME | Fuld JSON-metadata (netværk, mounts, config) |
docker stats | Live CPU/RAM/IO pr. container |
docker system df | Diskforbrug fordelt på images/containere/volumes |
docker system prune -a | Ryd ubrugte images/containere/netværk (frigør plads) |
prune -a: Den fjerner alle images der ikke er i brug af en container — også dem du vil beholde. Tilføj --volumes kun hvis du bevidst vil slette ikke-monterede volumes (kan betyde datatab).Netværk
Containere på samme bruger-definerede netværk kan nå hinanden via servicenavn som hostname — det er sådan n8n finder sin database.
| Type | Brug |
|---|---|
| bridge (default) | Standard isoleret netværk pr. Compose-stack; service-navn = DNS |
| host | Deler værtens netværksstak direkte (ingen isolation — undgå hvis muligt) |
| none | Ingen netværk — fuld isolation |
| internal | Bridge uden udgående internet — godt til databaser |
internal-netværk så den ikke kan nå internettet, og applikationen på både det interne og et proxy-netværk. Eksponér aldrig databaseporten på værten.Volumes & persistens
Containere er flygtige — data der skal overleve en genskabelse skal i et volume eller bind-mount.
docker volume create n8n_data
docker volume ls
docker volume inspect n8n_data
# i compose: ./data:/app/data
# giver dig direkte adgang til filerne på værten
/var/lib/docker/volumes/. Til din restic/pCloud-stack kan du enten backuppe den sti, eller bedre: docker compose exec db pg_dump … for konsistente database-dumps frem for at kopiere rå filer mens databasen kører.Hærdning
| Kontrol | Anbefaling |
|---|---|
| Port-binding | Bind til 127.0.0.1, eksponér kun via reverse-proxy |
| restart-policy | unless-stopped så tjenester kommer op efter reboot |
| Image-tags | Pin til konkrete versioner, ikke blindt latest, i produktion |
| read-only | read_only: true + tmpfs hvor muligt |
| capabilities | cap_drop: [ALL] og tilføj kun det nødvendige |
| no-new-privileges | security_opt: [no-new-privileges:true] |
| UFW | Bemærk: Docker manipulerer iptables og kan omgå UFW-regler — bind til localhost frem for at stole på UFW alene |
| Opdatering | Regelmæssig pull + genskab; overvåg base-image-CVE'er |
0.0.0.0, er den ofte åben mod internettet uanset UFW. Løsningen: bind altid til 127.0.0.1:PORT for interne tjenester, eller brug ufw-docker-projektet til at rette regelrækkefølgen.