Moodul 9 · 9.1
Konteinerite mõistmine
Moodul 9: Docker ja docker compose · Lugemisaeg: 10 minutit
Õpieesmärk: Selle õppetunni järel oskad selgitada, mis on konteiner, kuidas see erineb virtuaalmasinast, kuhu jäävad konteineri andmed ja millal on Dockerist sinu serveris kasu.
Põhimõisted: image (tõmmis), konteiner, kiht, registry (Docker Hub), tag (silt), digest (räsi), namespaces, cgroups, jagatud kernel, mittepüsiv failisüsteem, volume (andmeköide), bind mount, pordi avaldamine, ametlik image
Miks konteinerid?
Oletame, et tahad oma VPS-is käitada olekulehte, mis näitab, kas su veebisait töötab. Programm on kirjutatud Node.js-is, vajab sellest kindlat versiooni ja lisaks umbes kakssada teeki. Ilma konteineriteta paigaldad selle kõik oma serverisse, veebiserveri ja andmebaasi kõrvale. Aasta pärast tahad teist programmi, mis vajab teist Node.js-i versiooni. Siis algab nuputamine.
Konteiner lahendab selle. Programmi autor tarnib programmi koos kõige vajalikuga ühes paketis: see on image. Oma serveris käivitad selle image'i konteinerina. Programm näeb oma faile, oma Node.js-i ja oma teeke ega lähe ülejäänud serveriga konflikti. Ei vaja seda enam? Kustuta konteiner ja image ning /usr või /etc alla ei jää midagi maha.
Docker on tuntuim tööriist image'ite allalaadimiseks ja konteinerite käitamiseks. On ka alternatiive (Podman, containerd ise), kuid mõisted on kõikjal samad.
Image, konteiner ja registry
Kolm sõna, mida kohtad pidevalt:
- Image: kirjutuskaitstud mall, milles on failisüsteem (programm, teegid, seaded) ja käsk, mis tuleb käivitada. Image koosneb kihtidest: baaskiht (näiteks paljas Debian), selle peal kiht Node.js-iga ja selle peal programm. Kaks sama baaskihiga image'it jagavad seda kihti sinu kettal.
- Konteiner: image'i töötav (või peatatud) eksemplar. Kirjutuskaitstud kihtide peale saab konteiner oma õhukese kirjutatava kihi. Ühest image'ist saad käivitada kümme konteinerit.
- Registry: koht, kus image'id asuvad, näiteks Docker Hub (
docker.io) või GitHubi registry (ghcr.io). Docker laadib image'i alla käsugadocker pull.
Image'i nimi näeb välja selline:
louislam/uptime-kuma:2
caddy:2
vaultwarden/server:latestKoolonijärgne osa on tag: versiooni silt. Tag võib muutuda: caddy:2 osutab täna teisele buildile kui kolme kuu pärast, kui ilmub uus 2.x. Kui tahad täpselt fikseerida, millist image'it käitad, kasuta digesti: sisu sõrmejälge, näiteks caddy@sha256:.... See ei muutu kunagi. Tag latest on lihtsalt nimi, mille autor valib; see ei tähenda automaatselt "uusim stabiilne versioon" ja on seepärast halb valik, kui tahad teada, mis töötab.
Mitte virtuaalmasin
Konteiner sarnaneb väikese virtuaalmasinaga, kuid pole seda. See erinevus on turvalisuse jaoks oluline.
| Virtuaalmasin (nagu sinu VPS) | Konteiner | |
|---|---|---|
| Kernel | Oma kernel | Jagab hosti kernelit |
| Käivitumine | Sekunditest minutiteni, terve operatsioonisüsteem | Enamasti sekundiga, ainult programm |
| Eraldatus | Hüperviisori abil, riistvara tasemel | Kerneli abil: namespaces ja cgroups |
| Suurus | Gigabaidid | Sageli kümned kuni sajad megabaidid |
Konteiner on tegelikult tavaline protsess sinu serveris, mille kernel paneb eraldatud keskkonda:
- namespaces tagavad, et protsessil on oma vaade failidele, protsessidele, võrgule ja kasutajatele. Konteineris näib programm olevat protsess number 1 ega näe ülejäänud serverit;
- cgroups piiravad, kui palju protsessorit ja mälu see kasutada tohib.
Kuna kõik konteinerid jagavad sama kernelit, on eraldatus vähem range kui kahe VPS-i vahel. Kerneli turvaauk või konteiner, millel on liiga palju õigusi, võib mõjutada hosti. Sellest tulenevad selle mooduli reeglid: käita ainult image'eid, mida usaldad, ära anna konteineritele rohkem õigusi kui vaja ja ära kunagi mount'i /var/run/docker.sock ega / konteinerisse (õppetund 9.3 ja 10.2).
Kuhu jäävad sinu andmed?
See on algajate klassikaline lõks. Konteineri kirjutatav kiht on mittepüsiv: kui kustutad konteineri (näiteks uuendamisel, õppetund 9.4), kaob kõik, mida programm sinna kirjutas. Andmed, mis peavad säilima, kuuluvad seepärast konteinerist välja:
- Volume: hoiukoht, mida haldab Docker ise (kaustas
/var/lib/docker/volumes/). Annad sellele nime, näiteksuptime-kuma, ja seod selle konteineri kaustaga:-v uptime-kuma:/app/data. - Bind mount: tavaline kaust sinu serveris, mille ühendad konteinerisse:
-v /srv/vaultwarden:/data. Mugav, sest näed faile otse ja saad need hõlpsasti varukoopiasse (moodul 8) lisada.
Heade volume'idega konteineri saad ära visata ja uuesti luua ilma midagi kaotamata. Täpselt nii uuendamine käibki: laadi alla uus image, kustuta vana konteiner ja loo uus konteiner samade volume'itega. Lisa volume'id seepärast oma varundusplaani (õppetund 8.1).
Portide avaldamine
Konteineril on oma võrk. Veebiprogramm, mis kuulab konteineris porti 3001, pole serverist väljastpoolt kättesaadav enne, kui avaldad selle pordi: -p 3001:3001 (hostiport:konteineriport). Tähelepanu: ilma aadressita avaldab Docker pordi kõigil sinu serveri aadressidel, seega 0.0.0.0 ja [::]. See tähendab: kättesaadav kogu internetist, ja Docker korraldab selle ufw-st mööda (õppetund 9.3). Turvaline harjumus on avaldada loopbackil, -p 127.0.0.1:3001:3001, ja panna ette https-iga reverse proxy (õppetund 9.4).
Kes image'i teeb?
Image on kellegi teise tarkvara, mis võib sinu serveris töötada root'ina. Vaata seepärast, kes on autor:
- Docker Official Images (näiteks
caddy,nginx,postgres) hooldab Docker koos autoritega; - autori enda image'id (näiteks
louislam/uptime-kumajavaultwarden/server), mida tunned ära nime järgi, mida projekti veebisait nimetab; - tundmatute image'id sarnaste nimedega: ära kasuta.
Kasuta alati nime, mis on projekti ametlikul veebisaidil, mitte esimest, mille otsing annab.
Millal jah, millal mitte?
Docker on mugav programmide jaoks, mida autor tarnib image'ina, teenuste jaoks, mida tahad kiiresti ära visata või teise kohta viia, ja selleks, et käitada kõrvuti mitut erinevate nõuetega programmi. Serveri aluse (SSH, tulemüür, uuendused) jaoks konteinereid ei kasuta. Ja üksik veebisait nginxi ja paketiallika PHP-ga (õppetund 7.2) töötab suurepäraselt ka ilma Dockerita. Konteiner lisab kihi, mida pead mõistma ja uuendama; kasuta seda siis, kui sellest on kasu.
Kokkuvõte
- Image on kihtidest koosnev kirjutuskaitstud mall; konteiner on töötav eksemplar oma kirjutatava kihiga.
- Konteinerid jagavad hosti kernelit ja on eraldatud namespaces'i ja cgroups'i abil: kergemad kui VM, kuid vähem rangelt eraldatud.
- Kirjutatav kiht on mittepüsiv: püsivad andmed kuuluvad volume'isse või bind mount'i ja need omakorda varukoopiasse.
- Tag võib muutuda, digest mitte;
latestütleb vähe. - Avalda porte aadressil 127.0.0.1 ja kasuta ainult autori image'eid või ametlikke image'eid.
Test (quiz)
Ülesanne
Ülesanne O9.1: Konteiner või mitte? Vali kaks programmi, mida tahad oma serveris käitada (või kasuta näitena Uptime Kumat ja WordPressi saiti). Uuri iga programmi kohta, kas autor tarnib ametliku image'i ja mis nime all, millise tagi valiksid, milline kaust sisaldab püsivaid andmeid ja millist porti programm kuulab. Seejärel selgita, kas käitaksid seda konteineris või paketiallikast, ja miks.
Ülesanne O9.1: Konteiner või mitte?
Selle ülesande teed ise, keegi ei kontrolli seda. Märgi ära, mida tegid, ja märgi ülesanne tehtuks.
Uptime Kuma: louislam/uptime-kuma koos versioonisildiga, andmed kaustas /app/data, port 3001, avaldamine aadressil 127.0.0.1 pöördpuhverserveri taga. Vali tootja image või Official Image, koos versioonisildiga ja nimega andmekaustaga.
Su linnukesed ja märkmed jäävad ainult sellesse brauserisse, me ei saada neid kuhugi. Kui oled sisse loginud, salvestame Minu kursustes ainult info, et tegid ülesande ära.
Loe edasi
- Dockeri dokumentatsioon, What is a container?: https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/
- Dockeri dokumentatsioon, Volumes: https://docs.docker.com/engine/storage/volumes/
- Dockeri dokumentatsioon, Port publishing and mapping: https://docs.docker.com/engine/network/port-publishing/
- Docker Official Images: https://docs.docker.com/docker-hub/repos/manage/trusted-content/official-images/
