Under åren har jag installerat och konfigurerat fler servrar än jag egentligen vill erkänna.
Och varje gång såg processen ungefär likadan ut.
Installera program.
Installera beroenden.
Konfigurera tjänster.
Uppdatera systemet.
Och sedan hoppas att ingenting går sönder vid nästa uppdatering.
Efter att ha gjort detta tillräckligt många gånger började jag istället använda Docker för nästan allt i mitt hemmalabb.
Docker gör det möjligt att köra applikationer i containrar, vilket innebär att varje tjänst körs i en isolerad miljö.
Det ger flera fördelar:
- enklare installationer
- färre konflikter mellan program
- snabbare uppdateringar
- mycket enklare återställning av servrar
Den här guiden är inte tänkt som en komplett Docker-kurs.
Det är snarare min egen dokumentation över hur jag brukar sätta upp mina servrar.
Målet är att bryta ner varje kommando så att man faktiskt förstår vad varje del gör.
Installera Docker
Ta bort gamla Docker-versioner
sudo apt-get remove docker docker-engine docker.io containerd runc
Detta tar bort äldre Docker-paket som annars kan skapa konflikter.
Debian Install (Official Docker Repository)
Installera först några beroenden.
apt-get update
apt-get install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
Ladda ner Docker GPG-nyckel.
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
Lägg till Docker repository.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Uppdatera paketlistan.
apt-get update
Installera Docker.
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker Permissions
Docker kör normalt som root.
För att slippa skriva sudo varje gång kan vi lägga till vår användare i docker-gruppen.
Create the docker group
sudo groupadd docker
Add your user to the docker group
sudo gpasswd -a $USER docker
Aktivera gruppändringen direkt
newgrp docker
Docker Volumes
Volumes används för att lagra data utanför containern.
Detta är viktigt eftersom containrar annars kan tas bort utan att datan försvinner.
Ett vanligt scenario är att lagra data på en NFS-server.
Create volume
sudo docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
Example
Uppdelning av kommandot
Tells Docker you want to create a volume
sudo docker volume create
Detta är huvudkommandot som skapar en Docker-volume.
Tells Docker that the volume is local
--driver local
Anger att Docker ska använda den lokala volume-drivern.
Tells Docker that the volume is using NFS
--opt type=nfs
Anger att volymen använder NFS-protokollet.
Tells Docker the IP address where the volume is located
--opt o=addr=192.168.1.1,rw
Här definieras:
- IP-adressen till NFS-servern
- att volymen monteras read/write
The volume mapping of the volume
--opt device=:/path/to/dir
Detta är katalogen på NFS-servern.
Name of the volume
Example
Det sista argumentet är namnet på volymen.
Docker Network
Docker-nätverk används för att isolera containrar från varandra.
Det gör att tjänster kan prata med varandra utan att exponeras direkt mot internet.
Create a network
sudo docker network create \
--subnet=172.28.0.0/24 \
--gateway=172.28.0.1 \
-o parent=eth0 \
Example
Uppdelning av kommandot
Tells Docker you want to create a network
sudo docker network create
Skapar ett nytt Docker-nätverk.
Tells Docker the subnet IP range
--subnet=172.28.0.0/24
Definierar vilket IP-intervall nätverket ska använda.
Tells Docker the gateway IP
--gateway=172.28.0.1
Gateway-adressen används av containrar för att nå andra nätverk.
Tells Docker the interface
-o parent=eth0
Anger vilket nätverksinterface på hosten som används.
Name of the network
Example
Namnet på nätverket.
Docker Commands
Pull new images
sudo docker-compose pull
Start containers
sudo docker-compose up -d
Startar containrar i bakgrunden.
Stop and remove containers
sudo docker-compose down
Stoppar och tar bort containrar.
Stop container
sudo docker-compose stop <container>
Stoppar en specifik container.
Remove container
sudo docker-compose rm <container>
Tar bort en container.
Restart container
sudo docker-compose restart <container>
Startar om containern.
List containers
sudo docker-compose ps -a
Visar alla containrar.
List compose projects
sudo docker-compose ls -a
Visar alla docker-compose projekt.
Kill container
sudo docker-compose kill <container>
Tvingar containern att avslutas.
Recreate container
sudo docker-compose up -d --force-recreate <container>
Skapar om containern.
Show logs
sudo docker-compose logs <container>
Visar container-loggar.
Update Script
sudo docker-compose pull && sudo docker-compose up -d --remove-orphans && sudo docker image prune -af
Detta script:
- hämtar nya images
- startar containrar
- tar bort oanvända containrar
- rensar gamla images
docker-compose.yml Template
Example
version: "3"
services:
test:
image: test/test
container_name: test
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Stockholm
volumes:
- /home/user/docker/test:/test
- test:/test
networks:
dockers:
ipv4_address: 172.28.0.100
restart: always
networks:
dockers:
external: true
name: dockers
volumes:
test:
external: true
name: test
Uppdelning av docker-compose
Compose version
version: "3"
Definierar vilken version av Docker Compose som används.
Services
services:
Här definieras alla containrar.
Service
test:
Namnet på tjänsten.
Image
image: test/test
Docker image som containern skapas från.
Container name
container_name: test
Namnet på containern i Docker CLI.
Environment
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Stockholm
Miljövariabler som skickas till containern.
Volumes
volumes:
- /config:/config
- test:/config
Vänster sida = host
Höger sida = container
Restart policy
restart: unless-stopped
Containern startar automatiskt om den kraschar.
Pullio – Automatic Container Updates
Pullio används för att automatiskt uppdatera Docker-containrar.
Install Pullio
sudo curl -fsSL "https://raw.githubusercontent.com/hotio/pullio/master/pullio.sh" -o /usr/local/bin/pullio
sudo chmod +x /usr/local/bin/pullio
Pullio Labels Example
labels:
- "org.hotio.pullio.notify=true"
- "org.hotio.pullio.update=true"
- "org.hotio.pullio.discord.webhook=https://discord.com/api/webhooks/..."
- "org.hotio.pullio.generic.webhook=https://some.domain.com/api/webhooks/..."
- "org.hotio.pullio.author.avatar=https://domain.com/logo.png"
- "org.hotio.pullio.script.notify=bash /notify-script.sh"
- "org.hotio.pullio.script.update=bash /update-script.sh"
- "org.hotio.pullio.registry.authfile=/authfile.txt"
Fix pullio.sh
Create script.
nano /home/$USER/docker/env/pullio.sh
Add:
#!/bin/bash
sudo /usr/local/bin/pullio > /home/$USER/docker/pullio/pullio.log 2>&1
Make executable.
sudo chmod +x pullio.sh
Copy to other servers.
sudo scp /home/$USER/docker/env/pullio.sh /home/$USER/servers/env/pullio.sh
Diskussion