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:

  1. hämtar nya images
  2. startar containrar
  3. tar bort oanvända containrar
  4. 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