9 modulis · 9.1
Konteinerių supratimas
9 modulis: Docker ir docker compose · Skaitymo laikas: 10 min.
Mokymosi tikslas: Po šios pamokos galėsite paaiškinti, kas yra konteineris, kuo jis skiriasi nuo virtualios mašinos, kur lieka konteinerio duomenys ir kada Docker Jūsų serveryje yra prasmingas.
Pagrindinės sąvokos: atvaizdas (image), konteineris, sluoksnis, registras (Docker Hub), žyma (tag), santrauka (digest), namespaces, cgroups, bendras branduolys, laikina failų sistema, tomas (volume), bind mount, prievado publikavimas, oficialus atvaizdas
Kam reikalingi konteineriai?
Tarkime, savo VPS norite paleisti būsenos puslapį, kuris rodo, ar Jūsų svetainė veikia. Programa parašyta Node.js, jai reikia tam tikros šios platformos versijos ir dar maždaug dviejų šimtų bibliotekų. Be konteinerių visa tai įdiegtumėte tiesiai į serverį, šalia žiniatinklio serverio ir duomenų bazės. Po metų norite antros programos, kuriai reikia kitos Node.js versijos. Ir tada prasideda galvosūkis.
Konteineris šią problemą išsprendžia. Programos kūrėjas pateikia programą kartu su viskuo, ko jai reikia, viename pakete: atvaizde (image). Savo serveryje tą atvaizdą paleidžiate kaip konteinerį. Programa mato savo failus, savo Node.js, savo bibliotekas ir nesikerta su likusia serverio dalimi. Nebereikia? Ištrinate konteinerį, ištrinate atvaizdą, ir /usr ar /etc nieko nebelieka.
Docker yra žinomiausias įrankis atvaizdams atsisiųsti ir konteineriams paleisti. Yra ir alternatyvų (Podman, pats containerd), tačiau sąvokos visur tos pačios.
Atvaizdas, konteineris ir registras
Trys žodžiai, su kuriais susidursite nuolat:
- Atvaizdas (image): tik skaitomas šablonas su failų sistema (programa, bibliotekos, nustatymai) ir komanda, kuri turi būti paleista. Atvaizdas sudarytas iš sluoksnių: bazinio sluoksnio (pavyzdžiui, tuščio Debian), ant jo sluoksnio su Node.js, o ant šio pačios programos. Du atvaizdai su tuo pačiu baziniu sluoksniu Jūsų diske tą sluoksnį naudoja bendrai.
- Konteineris: veikiantis (arba sustabdytas) atvaizdo egzempliorius. Virš tik skaitomų sluoksnių konteineris gauna savo ploną rašymo sluoksnį. Iš vieno atvaizdo galite paleisti dešimt konteinerių.
- Registras (registry): vieta, kurioje laikomi atvaizdai, pavyzdžiui, Docker Hub (
docker.io) arba GitHub registras (ghcr.io). Docker atvaizdą atsisiunčia komandadocker pull.
Atvaizdo pavadinimas atrodo taip:
louislam/uptime-kuma:2
caddy:2
vaultwarden/server:latestDalis po dvitaškio yra žyma (tag): versijos etiketė. Žyma gali keistis: caddy:2 šiandien rodo į kitą build nei po trijų mėnesių, kai išeis nauja 2.x versija. Jei norite tiksliai užfiksuoti, kurį atvaizdą naudojate, naudokite santrauką (digest): turinio pirštų atspaudą, pavyzdžiui, caddy@sha256:.... Ji niekada nesikeičia. Žyma latest yra tiesiog kūrėjo pasirinktas pavadinimas; ji savaime nereiškia „naujausios stabilios versijos“, todėl yra prastas pasirinkimas, jei norite žinoti, kas veikia.
Ne virtuali mašina
Konteineris panašus į mažą virtualią mašiną, bet ja nėra. Šis skirtumas svarbus saugumui.
| Virtuali mašina (kaip Jūsų VPS) | Konteineris | |
|---|---|---|
| Branduolys | Nuosavas branduolys | Naudoja bendrą pagrindinio kompiuterio branduolį |
| Paleidimas | Nuo sekundžių iki minučių, visa operacinė sistema | Dažniausiai per sekundę, tik programa |
| Atskyrimas | Hipervizoriaus, aparatinės įrangos lygmeniu | Branduolio: namespaces ir cgroups |
| Dydis | Gigabaitai | Dažnai nuo dešimčių iki šimtų megabaitų |
Konteineris iš esmės yra įprastas procesas Jūsų serveryje, kurį branduolys patalpina į atskirtą aplinką:
- namespaces užtikrina, kad procesas turėtų savo požiūrį į failus, procesus, tinklą ir naudotojus. Konteineryje programa atrodo kaip procesas numeris 1 ir nemato likusios serverio dalies;
- cgroups riboja, kiek procesoriaus ir atminties ji gali naudoti.
Kadangi visi konteineriai naudoja tą patį branduolį, atskyrimas yra ne toks griežtas kaip tarp dviejų VPS. Branduolio spraga arba konteineris, gavęs per daug teisių, gali paveikti pagrindinį kompiuterį. Todėl šio modulio taisyklės: paleiskite tik tuos atvaizdus, kuriais pasitikite, nesuteikite konteineriams daugiau teisių nei būtina ir niekada neprijunkite /var/run/docker.sock ar / konteineryje (pamokos 9.3 ir 10.2).
Kur lieka Jūsų duomenys?
Tai klasikiniai pradedančiųjų spąstai. Konteinerio rašymo sluoksnis yra laikinas: ištrynus konteinerį (pavyzdžiui, atnaujinant, pamoka 9.4), dingsta viskas, ką programa jame įrašė. Todėl duomenys, kurie turi išlikti, turi būti už konteinerio ribų:
- Tomas (volume): saugojimo vieta, kurią valdo pats Docker (kataloge
/var/lib/docker/volumes/). Suteikiate jam pavadinimą, pavyzdžiui,uptime-kuma, ir susiejate su konteinerio katalogu:-v uptime-kuma:/app/data. - Bind mount: įprastas Jūsų serverio katalogas, kurį prijungiate prie konteinerio:
-v /srv/vaultwarden:/data. Patogu, nes failus matote tiesiogiai ir lengvai įtraukiate į atsarginę kopiją (modulis 8).
Konteinerį su tinkamais tomais galite išmesti ir sukurti iš naujo nieko neprarasdami. Būtent taip ir veikia atnaujinimas: atsisiunčiate naują atvaizdą, pašalinate seną konteinerį, paleidžiate naują su tais pačiais tomais. Todėl įtraukite tomus į savo atsarginių kopijų planą (pamoka 8.1).
Prievadų publikavimas
Konteineris turi savo tinklą. Žiniatinklio programa, kuri konteineryje klausosi 3001 prievado, iš išorės nepasiekiama, kol to prievado nepublikuojate: -p 3001:3001 (pagrindinio kompiuterio prievadas:konteinerio prievadas). Atkreipkite dėmesį: nenurodžius adreso, Docker publikuoja prievadą visais Jūsų serverio adresais, t. y. 0.0.0.0 ir [::]. Tai reiškia, kad jis pasiekiamas iš viso interneto, o Docker tai sutvarko apeidamas ufw (pamoka 9.3). Saugus įprotis: publikuoti per loopback, -p 127.0.0.1:3001:3001, o priešais pastatyti reverse proxy su https (pamoka 9.4).
Kas sukuria atvaizdą?
Atvaizdas yra kito asmens programinė įranga, kuri Jūsų serveryje gali veikti kaip root. Todėl patikrinkite, kas yra kūrėjas:
- Docker Official Images (pavyzdžiui,
caddy,nginx,postgres) prižiūri Docker kartu su kūrėjais; - paties kūrėjo atvaizdai (pavyzdžiui,
louislam/uptime-kumairvaultwarden/server), atpažįstami iš pavadinimo, nurodyto projekto svetainėje; - nežinomų asmenų atvaizdai panašiais pavadinimais: nenaudokite.
Visada naudokite pavadinimą, nurodytą oficialioje projekto svetainėje, o ne pirmą pasitaikiusį paieškos rezultatą.
Kada verta, kada ne?
Docker patogus programoms, kurias kūrėjas pateikia kaip atvaizdą, paslaugoms, kurias norite greitai pašalinti ar perkelti, ir kai šalia viena kitos reikia paleisti kelias programas su skirtingais reikalavimais. Serverio pagrindui (SSH, užkardai, atnaujinimams) konteinerių nenaudokite. O viena svetainė su nginx ir PHP iš paketų saugyklos (pamoka 7.2) puikiai veikia ir be Docker. Konteineris prideda sluoksnį, kurį reikia suprasti ir atnaujinti; naudokite jį tada, kai tai duoda naudos.
Santrauka
- Atvaizdas yra tik skaitomas šablonas iš sluoksnių; konteineris yra veikiantis egzempliorius su savo rašymo sluoksniu.
- Konteineriai naudoja bendrą pagrindinio kompiuterio branduolį ir yra atskirti namespaces bei cgroups: lengvesni už VM, bet atskirti ne taip griežtai.
- Rašymo sluoksnis yra laikinas: išliekantys duomenys turi būti tome arba bind mount, o šie turi būti įtraukti į atsarginę kopiją.
- Žyma gali keistis, santrauka ne;
latestmažai ką pasako. - Publikuokite prievadus per 127.0.0.1 ir naudokite tik kūrėjo arba oficialius atvaizdus.
Testas (quiz)
Užduotis
Užduotis O9.1: Konteineris ar ne? Pasirinkite dvi programas, kurias norite paleisti savo serveryje (arba kaip pavyzdį naudokite Uptime Kuma ir WordPress svetainę). Kiekvienai programai išsiaiškinkite, ar kūrėjas pateikia oficialų atvaizdą ir kokiu pavadinimu, kokią žymą pasirinktumėte, kuriame kataloge yra išliekantys duomenys ir kokiu prievadu programa klausosi. Tada paaiškinkite, ar paleistumėte ją konteineryje, ar iš paketų saugyklos, ir kodėl.
Užduotis O9.1: Konteineris ar ne?
Šią užduotį atliekate patys; niekas jos netikrina. Pažymėkite, ką atlikote, ir pažymėkite užduotį kaip atliktą.
Uptime Kuma: louislam/uptime-kuma su versijos žyme, duomenys /app/data, prievadas 3001, publikuoti adresu 127.0.0.1 už atvirkštinio tarpinio serverio (reverse proxy). Rinkitės kūrėjo image arba Official Image, su versijos žyme ir pavadintu duomenų aplanku.
Jūsų pažymėti varneliai ir pastabos lieka tik šioje naršyklėje; niekur jų nesiunčiame. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotį atlikote.
Skaitykite daugiau
- Docker dokumentacija, What is a container?: https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/
- Docker dokumentacija, Volumes: https://docs.docker.com/engine/storage/volumes/
- Docker dokumentacija, 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/
