Kaip sukonfigūruoti Docker namų serverį?

Kas tas Docker ir kodėl jis toks populiarus namų serveriams?

Prieš kelerius metus, jei norėjai paleisti kelis skirtingus servisus namų serveryje, turėjai arba sukurti virtualias mašinas kiekvienam projektui, arba viską sugrūsti į vieną sistemą ir melstis, kad programos nesusikonfliktuos tarpusavyje. Docker visiškai pakeitė šią situaciją. Tai tarsi lengvos virtualios mašinos, tik be viso to sunkaus bagažo.

Docker veikia konteinerių principu – kiekviena programa gyvena savo atskirame burbule su visomis reikalingomis bibliotekomis ir priklausomybėmis. Jei vienas konteineris sugenda ar užsikarbia, kiti ramiai dirba toliau. Be to, Docker konteinerius galima paleisti, sustabdyti ir ištrinti per kelias sekundes, o tai neįtikėtinai patogu eksperimentuojant.

Namų serverio kontekste Docker yra idealus sprendimas. Gali paleisti Plex media serverį, Nextcloud debesų saugyklą, Home Assistant protingo namo valdymui, Pi-hole reklamų blokavimui – visa tai vienu metu, ir kiekvienas servisas bus atskirtas nuo kitų. Jei kas nors neveikia, tiesiog ištrini konteinerį ir sukuri naują.

Pasiruošimas darbui: ką reikia turėti prieš pradedant

Pirmiausia tau reikės fizinio serverio ar bent jau kompiuterio, kuris veiks kaip serveris. Tai gali būti senesnis nešiojamas kompiuteris, Raspberry Pi, ar tiesiog atskirai surinktas kompiuteris. Aš pats pradėjau nuo seno Dell Optiplex, kurį nusipirkau už 100 eurų – puikiai veikia jau trečius metus.

Operacinė sistema – čia dauguma renkasi Linux. Ubuntu Server yra geras pasirinkimas pradedantiesiems, nes turi didžiausią bendruomenę ir daugiausia pamokų internete. Debian taip pat puikus, jei nori kažko stabilesnio. Aš asmeniškai naudoju Ubuntu Server 22.04 LTS, nes „LTS” reiškia ilgalaikį palaikymą ir mažiau galvos skausmo su atnaujinimais.

Serverio specifikacijos priklauso nuo to, ką planuoji daryti. Jei tik keletas lengvų konteinerių – užteks 2GB RAM ir dviejų procesorių branduolių. Jei planuoji Plex su transkodavimu ar keletą duomenų bazių – geriau turėti 8GB RAM ir stipresnį procesorių. Kietojo disko vietos reikės priklausomai nuo duomenų kiekio, bet rekomenduoju pradėti bent nuo 256GB SSD sisteminiam diskui ir atskirą HDD duomenims.

Docker įdiegimas žingsnis po žingsnio

Gerai, dabar prie konkretaus darbo. Prisijunk prie savo serverio per SSH arba tiesiogiai prie terminalo. Pirmas dalykas – atnaujink sistemą:

sudo apt update && sudo apt upgrade -y

Dabar įdiegkime Docker. Oficialus būdas yra pridėti Docker repozitoriją ir įdiegti iš ten. Pirmiausia įdiek reikalingus paketus:

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

Tada pridėk Docker GPG raktą:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Ir pridėk Docker repozitoriją:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dabar atnaujink paketų sąrašą ir įdiek Docker:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

Patikrink, ar Docker veikia:

sudo docker run hello-world

Jei matai sveikinimo žinutę – viskas veikia! Dar vienas svarbus dalykas – pridėk savo vartotoją prie docker grupės, kad nereikėtų kaskart rašyti sudo:

sudo usermod -aG docker $USER

Atsijunk ir vėl prisijunk, kad pakeitimai įsigaliotų.

Docker Compose – tikrasis žaidimo keitėjas

Docker Compose yra įrankis, kuris leidžia valdyti kelis konteinerius vienu metu naudojant YAML konfigūracijos failus. Tai skamba sudėtingai, bet iš tikrųjų tai neįtikėtinai supaprastina gyvenimą. Vietoj to, kad rašytum ilgas docker run komandas su dešimtimis parametrų, tiesiog aprašai viską faile ir paleidi vienai komanda.

Įdiekime Docker Compose:

sudo apt install docker-compose-plugin -y

Dabar sukurkime katalogų struktūrą. Aš rekomenduoju laikyti visus Docker projektus vienoje vietoje:

mkdir -p ~/docker
cd ~/docker

Kiekvienam projektui ar servisui sukursi atskirą katalogą su savo docker-compose.yml failu. Pavyzdžiui, jei nori paleisti Nginx web serverį:

mkdir nginx
cd nginx
nano docker-compose.yml

Ir įrašyk tokį turinį:

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    restart: unless-stopped

Išsaugok failą (Ctrl+X, Y, Enter) ir paleisk:

docker compose up -d

Parametras „-d” reiškia detached režimą – konteineris veiks fone. Dabar gali atidaryti naršyklę ir įvesti serverio IP adresą – turėtum matyti Nginx pradžios puslapį.

Praktiniai pavyzdžiai: kokie servisai naudingi namų serveryje

Dabar kai supratai pagrindus, pažiūrėkime į kelis praktinius pavyzdžius, kurie tikrai pravers.

Portainer – Docker valdymo sąsaja

Portainer yra web sąsaja Docker valdymui. Tai ypač patogu, jei nesinori nuolat lįsti į terminalą. Sukurk katalogą ir docker-compose.yml:

version: '3'
services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    restart: unless-stopped

volumes:
  portainer_data:

Po paleidimo eik į http://tavo-serverio-ip:9000 ir sukurk administratoriaus paskyrą. Dabar gali valdyti visus konteinerius per grafinę sąsają.

Pi-hole – reklamų blokavimas visam tinklui

Pi-hole blokuoja reklamas DNS lygmenyje, tai veikia visiems įrenginiams tinkle be jokių papildomų programų:

version: '3'
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:80/tcp"
    environment:
      TZ: 'Europe/Vilnius'
      WEBPASSWORD: 'tavo-slaptazodis'
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped

Po paleidimo pakeisk maršrutizatoriaus DNS nustatymus į serverio IP adresą, ir visos reklamos dingsta.

Nextcloud – asmeninė debesų saugykla

Jei nori turėti savo „Dropbox”, Nextcloud yra puikus pasirinkimas. Čia reikės kelių konteinerių – pačios Nextcloud ir duomenų bazės:

version: '3'
services:
  db:
    image: mariadb:10.6
    container_name: nextcloud-db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=slaptazodis
      - MYSQL_PASSWORD=slaptazodis
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud:latest
    container_name: nextcloud
    restart: unless-stopped
    ports:
      - 8081:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=slaptazodis
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

volumes:
  db:
  nextcloud:

Saugumas ir prieigos valdymas

Dabar kai serveris veikia, reikia pagalvoti apie saugumą. Pirmiausia – niekada neatidaryk visų portų į internetą tiesiogiai. Jei nori pasiekti servisus iš išorės, naudok VPN arba reverse proxy su SSL sertifikatais.

Traefik yra puikus reverse proxy, kuris automatiškai gauna Let’s Encrypt sertifikatus. Tai šiek tiek sudėtingiau konfigūruoti, bet verta. Alternatyva – Nginx Proxy Manager, kuris turi grafinę sąsają ir yra draugiškesnis pradedantiesiems.

Kitas svarbus dalykas – reguliarūs atsarginiai kopijos. Docker konteinerius lengva atkurti, bet duomenys volumes yra kritiniai. Aš naudoju paprastą bash skriptą, kuris kas naktį daro visų volumes tar archyvus ir siunčia juos į išorinį diską:

#!/bin/bash
BACKUP_DIR="/mnt/backup/docker"
DATE=$(date +%Y%m%d)

docker volume ls -q | while read volume; do
    docker run --rm -v $volume:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/${volume}_${DATE}.tar.gz -C /data .
done

Nesudėtinga, bet veikia patikimai. Saugok šį skriptą, pavyzdžiui, /usr/local/bin/docker-backup.sh, padaryk jį vykdomu (chmod +x) ir pridėk į crontab.

Našumo optimizavimas ir stebėjimas

Kai serveris veikia kurį laiką, nori žinoti, kaip jis jaučiasi. Dockge arba Yacht yra geros alternatyvos Portainer, bet aš rekomenduoju įdiegti Grafana su Prometheus stebėjimui.

Taip pat svarbu suprasti, kaip Docker naudoja resursus. Pagal nutylėjimą konteineris gali naudoti visą prieinamą atmintį ir procesorių. Gali apriboti resursus docker-compose.yml faile:

services:
  app:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Dar vienas patarimas – reguliariai valyk nenaudojamus image’us ir konteinerius. Docker turi tendenciją kaupti šiukšles:

docker system prune -a

Ši komanda išvalys viską, kas nenaudojama. Tik būk atsargus – ji ištrins ir sustabdytus konteinerius.

Logging taip pat svarbu. Pagal nutylėjimą Docker kaupia logus neribotai, ir tai gali užpildyti diską. Nustatyk log rotation globaliai /etc/docker/daemon.json faile:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Po pakeitimo reikia perkrauti Docker daemon:

sudo systemctl restart docker

Automatizavimas ir atnaujinimai

Vienas iš didžiausių Docker privalumų – lengvi atnaujinimai. Bet kas nori kiekvieną savaitę rankiniu būdu atnaujinti dešimtis konteinerių? Watchtower yra konteineris, kuris automatiškai atnaujina kitus konteinerius:

version: '3'
services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
    restart: unless-stopped

Šis nustatymas tikrins atnaujinimus kasdien 4 val. ryto ir automatiškai atnaujins konteinerius. WATCHTOWER_CLEANUP=true reiškia, kad seni image’ai bus ištrinti.

Bet būk atsargus su automatiniais atnaujinimais kritiniams servisams. Kartais naujos versijos gali sukelti problemų. Geriau naudok tag’us vietoj „latest”, pavyzdžiui, nginx:1.24 vietoj nginx:latest. Taip kontroliuoji, kada atnaujini.

Kaip viską sujungti į veikiančią sistemą

Dabar žinai pagrindus, bet kaip tai visą sujungti į sklandžiai veikiančią sistemą? Štai mano rekomenduojama struktūra:

Sukurk pagrindinį docker katalogą su tokia struktūra:
– ~/docker/portainer
– ~/docker/nginx-proxy-manager
– ~/docker/servisai/nextcloud
– ~/docker/servisai/pihole
– ~/docker/monitoring/grafana
– ~/docker/utils/watchtower

Kiekviename kataloge turėk docker-compose.yml ir .env failą slaptažodžiams (nepamirštk pridėti .env į .gitignore, jei naudoji git).

Pradėk nuo Portainer – tai bus tavo valdymo centras. Tada įdiek Nginx Proxy Manager arba Traefik, jei planuoji prieigą iš išorės. Po to po vieną pridėk kitus servisus, testuodamas kiekvieną atskirai.

Svarbu suprasti, kad Docker namų serveryje nėra „set and forget” sprendimas. Reikės kartais pasižiūrėti logų, atnaujinti konteinerius, patikrinti, ar viskas veikia. Bet tai užima gal valandą per mėnesį, palyginti su keliais dienomis, kuriuos praleistum konfigūruojant viską tradiciškai.

Dar vienas praktinis patarimas – dokumentuok viską. Sukurk README.md failą kiekviename projekte, aprašyk, ką daro servisas, kokie portai naudojami, kaip prisijungti. Po pusmečio tikrai nebeprisiminsi, kodėl kažką konfigūravai būtent taip.

Ir paskutinis dalykas – nebijok eksperimentuoti. Docker konteinerius galima ištrinti ir sukurti iš naujo per kelias sekundes. Tai saugi aplinka mokytis. Jei kažkas neveikia, tiesiog ištrinki ir bandai iš naujo. Duomenys volumes išlieka, tad net jei sugadini konteinerį, duomenys lieka saugūs.

Su Docker namų serveriu atsivers galimybių pasaulis – nuo media serverių iki protingo namo automatizavimo, nuo asmeninių debesų iki programavimo projektų testavimo aplinkų. Pradėk nuo paprastų dalykų, pamažu pridėk daugiau, ir greitai turėsi profesionaliai atrodantį namų serverį, kuris veiks patikimai ir bus lengvai valdomas.

Опубликовано в Kompiuterių remontas, naujienos.