9. modulis · 9.3
Docker compose un ugunsmūris
9. modulis: Docker un docker compose · Lasīšanas laiks: 12 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet aprakstīt pakalpojumus compose failā, tos palaist, atjaunināt un apturēt, kā arī izskaidrot, kāpēc Docker publicētie porti apiet ufw un kā to novērst.
Pamatjēdzieni: compose.yaml, services, image, ports, volumes, environment, .env, restart, networks, depends_on, healthcheck, docker compose up -d, pull, logs, down, novecojis version:, Docker un ufw, DOCKER-USER, publicēšana uz 127.0.0.1, noslēpumi, docker.sock
Kāpēc compose?
Ar docker run (nodarbība 9.2) Jūs palaižat vienu konteineru ar garu opciju rindu. Īsta lietotne bieži sastāv no vairākiem konteineriem: programmas, datubāzes, reversā starpniekservera. Šīs rindas atcerēties un pēc restartēšanas vai atjauninājuma ierakstīt no jauna agri vai vēlu neizdosies.
Docker Compose apraksta visus lietotnes konteinerus vienā failā: compose.yaml. Šo failu Jūs ievietojat atsevišķā mapē, piemēram, /srv/status/compose.yaml, un visu pārvaldāt ar docker compose. Fails vienlaikus ir Jūsu dokumentācija: kas darbojas, kurš attēls (image), kuri porti, kur atrodas dati. Iekļaujiet šo mapi savā rezerves kopijā (nodarbība 8.1), un lietotni jaunā serverī varēsiet atjaunot dažās minūtēs.
Spraudnis saucas docker compose (ar atstarpi, 2. versija). Vecā atsevišķā programma docker-compose (ar defisi) ir aizstāta; to vēl var redzēt vecās pamācībās. Arī lauks version: "3.8" vecu failu sākumā ir novecojis: Compose vienmēr izmanto jaunāko shēmu un, sastopot version:, tikai parāda brīdinājumu.
Compose faila lasīšana
Piemērs ar programmu un PostgreSQL datubāzi:
# /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:Soli pa solim:
- services: katrs pakalpojums kļūst par konteineru. Nosaukums (
app,db) ir arī resursdatora nosaukums (hostname), pēc kura konteineri atrod viens otru. Compose izveido lietotnei atsevišķu tīklu, tāpēcappsavienojas ar datubāzi adresēdb:5432. - image: vienmēr ar versijas tagu (nodarbība 9.1).
- restart: ko Docker dara, ja konteiners apstājas vai serveris tiek restartēts.
unless-stoppedto palaiž no jauna, izņemot gadījumu, kad Jūs to apturējāt apzināti. Bez restartēšanas politikas Jūsu lietotne pēc restartēšanas (nodarbība 4.2) neatsāks darbu. - ports: portu publicē tikai lietotne, un tikai uz
127.0.0.1. Datubāze nepublicē neko: lietotne to sasniedz caur iekšējo tīklu. Datubāze arports: - "5432:5432"ir viena no visbiežāk pieļautajām kļūdām (skatiet tālāk). - environment: programmas iestatījumi. Parole tajā nav ierakstīta burtiski, bet kā
${DB_PASSWORD}. - volumes: nosauktais sējums
db-datasaglabā datubāzi, kad konteiners tiek aizstāts. - depends_on ar healthcheck: lietotne startē tikai tad, kad datubāze ir patiešām gatava, nevis tikai palaista.
Noslēpumi .env failā
Compose nolasa tādus mainīgos kā ${DB_PASSWORD} no faila .env tajā pašā mapē:
# /srv/notities/.env
DB_PASSWORD=Kies-hier-een-lang-willekeurig-wachtwoordanna@web1:/srv/notities$ sudo chmod 600 .envTādējādi parole neatrodas compose failā, kuru Jūs, iespējams, glabājat Git vai ievietojat forumā, lūdzot palīdzību. Pievienojiet .env failam .gitignore. Izveidojiet paroli ar paroļu pārvaldnieku vai ar openssl rand -base64 24.
Ikdienas lietošana
Visas komandas izpildiet mapē, kurā atrodas compose fails:
anna@web1:/srv/notities$ sudo docker compose config # pārbaudīt failu, mainīgie aizpildīti
anna@web1:/srv/notities$ sudo docker compose up -d # palaist visu (vai atjaunināt atbilstoši failam)
anna@web1:/srv/notities$ sudo docker compose ps # statuss katram pakalpojumam
anna@web1:/srv/notities$ sudo docker compose logs -f app
anna@web1:/srv/notities$ sudo docker compose pull # lejupielādēt jaunos attēlus
anna@web1:/srv/notities$ sudo docker compose up -d # aizstāt konteinerus ar jaunajiem attēliem
anna@web1:/srv/notities$ sudo docker compose down # apturēt un noņemt konteinerusdown Jūsu sējumus atstāj neskartus. down -v dzēš arī lietotnes sējumus, un līdz ar to Jūsu datubāzi. Ierakstiet to tikai tad, ja patiešām vēlaties sākt no jauna.
docker compose config ir nginx -t un sshd -t ekvivalents: tas parāda, kā Compose saprot Jūsu failu ar visiem aizpildītajiem mainīgajiem, pirms Jūs kaut ko palaižat. Uzmanieties, lai šo izvadi nekur neievietotu, jo tajā ir redzamas paroles.
Docker apiet ufw
Tagad svarīgākais šī moduļa drošības jautājums. Nodarbībā 5.2 Jūs iestatījāt ufw uz "aizliegt visu, izņemot SSH, 80 un 443". Varētu sagaidīt, ka konteiners ar ports: - "5432:5432" tad nav sasniedzams. Tā nav.
Docker dokumentācijā tas teikts tieši: Docker un ufw izmanto ugunsmūra noteikumus savstarpēji nesaderīgā veidā. Kad Jūs publicējat portu, Docker pats ievieto noteikumus kodola ugunsmūrī. Šie noteikumi novirza datplūsmu uz konteineru (adrešu translācija, DNAT), pirms tiek piemēroti ufw noteikumi. Tādējādi pakete apiet ufw. ufw status nerāda neko īpašu, kaut gan ports ir sasniedzams no visa interneta. Tas pats attiecas uz firewalld.
Turklāt Docker bez norādītas adreses publicē uz 0.0.0.0 un [::], tātad gan IPv4, gan IPv6 (nodarbība 9.1).
Trīs veidi, kā to izdarīt pareizi, no vienkāršākā līdz sarežģītākajam:
- Nepublicējiet neko, kam nav jābūt publiski pieejamam. Datubāzes, kešatmiņas un iekšējie pakalpojumi nesaņem
ports:. Konteineri vienā compose lietotnē sasniedz viens otru caur iekšējo tīklu. - Publicējiet uz loopback.
"127.0.0.1:8081:8080". Tad tam var piekļūt tikai pats serveris, un priekšā Jūs novietojat reverso starpniekserveri (nginx vai Caddy, modulis 7), kas klausās portā 443. Docker to var iestatīt arī kā noklusējumu: dēmona iestatījums liek visiem publicētajiem portiem bez adreses nonākt uz127.0.0.1. - Noteikumi ķēdē DOCKER-USER. Docker izveido tukšu ķēdi
DOCKER-USER, kas tiek apstrādāta pirms tā paša noteikumiem. Tur Jūs varat ievietot savus noteikumus, piemēram, "tikai šī IP adrese drīkst piekļūt publicētajiem portiem". Tas ir darbs pieredzējušiem lietotājiem ar iptables vai nftables, un tajā viegli kļūdīties. Lielākajai daļai mazu serveru pietiek ar 1. un 2. variantu.
Vienmēr pārbaudiet no ārpuses, kā nodarbībā 5.1: nc -vz -w 3 <ip> 5432 no sava klēpjdatora vai ar kursa pārbaudi uzdevumos Z5.1 un Z10.4.
Vēl divas lietas, ko nedarīt
- Nemontējiet
/var/run/docker.sockkonteinerā, ja vien precīzi nezināt, kāpēc. Konteiners ar piekļuvi Docker ligzdai (socket) var pats palaist konteinerus, arī tādu, kam ir pieejams viss resursdatora disks (nodarbība 9.2). Daži palīgrīki (vadības paneļi, automātiskie atjauninātāji) to pieprasa; faktiski tas nozīmē dot šai programmai root tiesības. - Neizmantojiet
privileged: truevainetwork_mode: hosttikai tāpēc, ka tā teikts pamācībā. Abi lielā mērā noņem konteinera izolāciju. Izmantojiet tos tikai tad, ja izstrādātājs paskaidro, kāpēc tas ir nepieciešams.
Kopsavilkums
- Compose fails (
compose.yaml) apraksta visus lietotnes konteinerus; tas vienlaikus ir dokumentācija un jāiekļauj Jūsu rezerves kopijā. - Izmantojiet versiju tagus, restartēšanas politiku, nosauktus sējumus, healthcheck, kur iespējams, un noslēpumus failā
.envar tiesībām 600. docker compose config,up -d,ps,logs,pull,down;down -vdzēš arī sējumus.- Publicētie porti apiet ufw un firewalld. Publicējiet tikai to, kam jābūt publiskam, pārējo uz
127.0.0.1ar reverso starpniekserveri priekšā. - Nekādu docker.sock,
privilegedvainetwork_mode: hostbez pamatota iemesla.
Tests (quiz)
Uzdevums
Uzdevums Z9.3: Compose faila pārbaude. Piemēra failā compose-nakijken.txt (kā teksta failā) ir neliela interneta veikala compose fails ar lietotni, datubāzi, kešatmiņu un pārvaldības rīku. Tajā ir sešas kļūdas, kas aplūkotas šajā nodarbībā vai nodarbībās 9.1 un 9.2. Katram numurētajam rindu blokam norādiet, vai tas ir pareizs vai kļūdains, un katrai kļūdai izvēlieties pareizo labojumu. Programma salīdzina ar fiksēto atslēgu. Ja Jums ir savs compose fails, pēc tam pārbaudiet to pēc tiem pašiem punktiem.
Vairāk lasīt
- Docker dokumentācija, How Compose works (compose.yaml): https://docs.docker.com/compose/intro/compose-application-model/
- Docker dokumentācija, Version and name top-level elements: https://docs.docker.com/reference/compose-file/version-and-name/
- Docker dokumentācija, Packet filtering and firewalls (Docker and ufw): https://docs.docker.com/engine/network/packet-filtering-firewalls/
- Docker dokumentācija, Port publishing and mapping: https://docs.docker.com/engine/network/port-publishing/
- Docker dokumentācija, Interpolation (mainīgie un .env): https://docs.docker.com/reference/compose-file/interpolation/
- VPS: no pirmās pieteikšanās līdz drošam serverim 6.2: Jūsu darba mape ar compose.yaml, .env un Caddy
- VPS: no pirmās pieteikšanās līdz drošam serverim 6.3: Docker un ugunsmūris: kā droši publicēt portus
