Moodul 9 · 9.3
Docker compose ja tulemüür
Moodul 9: Docker ja docker compose · Lugemisaeg: 12 minutit
Õpieesmärk: Pärast seda õppetundi oskad kirjeldada teenuseid compose-failis, neid käivitada, uuendada ja peatada ning selgitad, miks Dockeri avaldatud pordid lähevad ufw-st mööda ja kuidas seda vältida.
Põhimõisted: compose.yaml, services, image, ports, volumes, environment, .env, restart, networks, depends_on, healthcheck, docker compose up -d, pull, logs, down, aegunud version:, Docker ja ufw, DOCKER-USER, avaldamine aadressil 127.0.0.1, saladused, docker.sock
Miks compose?
Käsuga docker run (õppetund 9.2) käivitad ühe konteineri pika rea valikutega. Päris rakendus koosneb sageli mitmest konteinerist: programm, andmebaas, pöördproksi. Nende ridade meelespidamine ja pärast taaskäivitust või uuendust uuesti sisestamine läheb ühel hetkel viltu.
Docker Compose kirjeldab kõik rakenduse konteinerid ühes failis: compose.yaml. Paned selle faili eraldi kausta, näiteks /srv/status/compose.yaml, ja haldad kõike käsuga docker compose. Fail on ühtlasi sinu dokumentatsioon: mis töötab, milline image, millised pordid, kus andmed asuvad. Lisa see kaust oma varukoopiasse (õppetund 8.1) ja saad rakenduse uuel serveril mõne minutiga taastada.
Plugina nimi on docker compose (tühikuga, versioon 2). Vana eraldi programm docker-compose (sidekriipsuga) on asendatud; seda näed veel vanades juhendites. Ka vanade failide ülaosas olev väli version: "3.8" on aegunud: Compose kasutab alati uusimat skeemi ja annab version: puhul ainult hoiatuse.
Compose-faili lugemine
Näide programmi ja PostgreSQL-andmebaasiga:
# /srv/notities/compose.yaml
services:
app:
image: ghcr.io/example/notities:1.4
restart: unless-stopped
ports:
- "127.0.0.1:8081:8080"
environment:
DB_HOST: db
DB_USER: notities
DB_PASSWORD: ${DB_PASSWORD}
depends_on:
db:
condition: service_healthy
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_USER: notities
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U notities"]
interval: 10s
retries: 5
volumes:
db-data:Samm-sammult:
- services: igast teenusest saab konteiner. Nimi (
app,db) on ühtlasi hostinimi, millega konteinerid üksteist leiavad. Compose loob rakendusele oma võrgu, seegaappühendub andmebaasiga aadressildb:5432. - image: alati versioonisildiga (õppetund 9.1).
- restart: mida Docker teeb, kui konteiner peatub või server taaskäivitub.
unless-stoppedkäivitab selle uuesti, välja arvatud juhul, kui sina selle teadlikult peatasid. Ilma taaskäivituspoliitikata ei tule su rakendus pärast taaskäivitust (õppetund 4.2) tagasi. - ports: ainult rakendus avaldab pordi ja ainult aadressil
127.0.0.1. Andmebaas ei avalda midagi: rakendus jõuab selleni sisevõrgu kaudu. Andmebaas seadistusegaports: - "5432:5432"on üks levinumaid vigu (vaata allpool). - environment: programmi seaded. Parool ei ole seal sõna-sõnalt kirjas, vaid kujul
${DB_PASSWORD}. - volumes: nimega köide
db-datahoiab andmebaasi alles, kui konteiner asendatakse. - depends_on koos healthcheck'iga: rakendus käivitub alles siis, kui andmebaas on päriselt valmis, mitte lihtsalt käivitatud.
Saladused .env-failis
Compose loeb muutujaid nagu ${DB_PASSWORD} samas kaustas olevast failist .env:
# /srv/notities/.env
DB_PASSWORD=Kies-hier-een-lang-willekeurig-wachtwoordanna@web1:/srv/notities$ sudo chmod 600 .envNii ei ole parool compose-failis, mida võib-olla hoiad Gitis või kleebid abi saamiseks foorumisse. Lisa .env faili .gitignore. Loo parool paroolihalduriga või käsuga openssl rand -base64 24.
Igapäevane kasutamine
Kõik käsud käivitad compose-failiga kaustas:
anna@web1:/srv/notities$ sudo docker compose config # kontrolli faili, muutujad täidetud
anna@web1:/srv/notities$ sudo docker compose up -d # käivita kõik (või uuenda faili järgi)
anna@web1:/srv/notities$ sudo docker compose ps # olek teenuste kaupa
anna@web1:/srv/notities$ sudo docker compose logs -f app
anna@web1:/srv/notities$ sudo docker compose pull # tõmba uued image'id
anna@web1:/srv/notities$ sudo docker compose up -d # asenda konteinerid uute image'itega
anna@web1:/srv/notities$ sudo docker compose down # peata ja eemalda konteineriddown jätab köited alles. down -v kustutab ka rakenduse köited ja koos nendega su andmebaasi. Sisesta see ainult siis, kui tahad päriselt otsast alustada.
docker compose config on käskude nginx -t ja sshd -t vaste: see näitab enne käivitamist, kuidas Compose su faili mõistab, kõik muutujad sisse pandud. Ära kleebi seda väljundit kuhugi, sest paroolid on selles kirjas.
Docker läheb ufw-st mööda
Nüüd selle mooduli kõige olulisem turvapunkt. Õppetunnis 5.2 seadistasid ufw reeglile „keela kõik, välja arvatud SSH, 80 ja 443“. Võiks eeldada, et konteiner seadistusega ports: - "5432:5432" ei ole siis kättesaadav. See ei ole nii.
Dockeri dokumentatsioon ütleb seda otse: Docker ja ufw kasutavad tulemüürireegleid viisil, mis omavahel kokku ei sobi. Kui avaldad pordi, lisab Docker ise reeglid kerneli tulemüüri. Need reeglid suunavad liikluse konteinerisse (aadressiteisendus, DNAT) enne, kui ufw reegleid rakendatakse. Pakett läheb seega ufw-st mööda. ufw status ei näita midagi erilist, kuigi port on kogu internetist kättesaadav. Sama kehtib firewalld kohta.
Lisaks avaldab Docker ilma aadressita pordi aadressidel 0.0.0.0 ja [::], seega nii IPv4 kui ka IPv6 kaudu (õppetund 9.1).
Kolm viisi seda õigesti teha, lihtsast keerulisemani:
- Ära avalda midagi, mis ei pea avalik olema. Andmebaasid, vahemälud ja siseteenused ei saa
ports:. Sama compose-rakenduse konteinerid jõuavad üksteiseni sisevõrgu kaudu. - Avalda loopback-aadressil.
"127.0.0.1:8081:8080". Siis pääseb sellele ligi ainult server ise ja selle ette paned pöördproksi (nginx või Caddy, moodul 7), mis kuulab porti 443. Dockerile saab selle ka vaikimisi seadeks teha: deemoni seade suunab kõik ilma aadressita avaldatud pordid aadressile127.0.0.1. - Reeglid ahelas DOCKER-USER. Docker loob tühja ahela
DOCKER-USER, mida läbitakse enne tema enda reegleid. Sinna saad ise reegleid lisada, näiteks „ainult see IP-aadress tohib avaldatud portidele ligi“. See on edasijõudnute töö iptablesi või nftablesiga ja selles on lihtne eksida. Enamikule väikestele serveritele piisab variantidest 1 ja 2.
Kontrolli alati väljastpoolt, nagu õppetunnis 5.1: nc -vz -w 3 <ip> 5432 oma sülearvutist või kursuse kontrolliga ülesannetes Z5.1 ja Z10.4.
Veel kaks asja, mida sa ei tee
- Ära ühenda konteinerisse
/var/run/docker.sock, kui sa täpselt ei tea, miks. Konteiner, millel on ligipääs Dockeri soklile, saab ise konteinereid käivitada, ka sellise, millel on kogu hosti ketas (õppetund 9.2). Mõned abiprogrammid (juhtpaneelid, automaatsed uuendajad) küsivad seda; sisuliselt annad sellele programmile root-õigused. - Ära kasuta
privileged: trueeganetwork_mode: hostainult sellepärast, et juhend nii ütleb. Mõlemad eemaldavad suure osa konteineri isolatsioonist. Kasuta neid ainult siis, kui tegija selgitab, miks see vajalik on.
Kokkuvõte
- Compose-fail (
compose.yaml) kirjeldab kõik rakenduse konteinerid; see on ühtlasi dokumentatsioon ja kuulub su varukoopiasse. - Kasuta versioonisilte, taaskäivituspoliitikat, nimega köiteid, võimaluse korral healthchecki ning saladusi failis
.envõigustega 600. docker compose config,up -d,ps,logs,pull,down;down -vkustutab ka köited.- Avaldatud pordid lähevad ufw-st ja firewalld-st mööda. Avalda ainult see, mis peab avalik olema, ja muu aadressil
127.0.0.1, pöördproksi ees. - Ilma mõjuva põhjuseta ei mingit docker.sock'i,
privilegedeganetwork_mode: host.
Test (quiz)
Ülesanne
Ülesanne Z9.3: Compose-faili ülevaatamine. Näidisfailis compose-nakijken.txt on (tekstifailina) väikese veebipoe compose-fail, milles on rakendus, andmebaas, vahemälu ja haldustööriist. Selles on kuus viga, mida on käsitletud selles õppetunnis või õppetundides 9.1 ja 9.2. Märgi iga nummerdatud ridade ploki kohta, kas see on õige või vale, ja vali iga vea puhul õige parandus. Programm võrdleb vastuseid kindla võtmega. Kui sul on oma compose-fail, vaata see pärast samade punktide järgi läbi.
Loe edasi
- Dockeri dokumentatsioon, How Compose works (compose.yaml): https://docs.docker.com/compose/intro/compose-application-model/
- Dockeri dokumentatsioon, Version and name top-level elements: https://docs.docker.com/reference/compose-file/version-and-name/
- Dockeri dokumentatsioon, Packet filtering and firewalls (Docker and ufw): https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Dockeri dokumentatsioon, Port publishing and mapping: https://docs.docker.com/engine/network/port-publishing/
- Dockeri dokumentatsioon, Interpolation (muutujad ja .env): https://docs.docker.com/reference/compose-file/interpolation/
