9. modulis · 9.1
Izpratne par konteineriem
9. modulis: Docker un docker compose · Lasīšanas laiks: 10 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet izskaidrot, kas ir konteiners, kā tas atšķiras no virtuālās mašīnas, kur paliek konteinera dati un kad Docker uz Jūsu servera ir lietderīgs.
Pamatjēdzieni: attēls (image), konteiners, slānis, reģistrs (Docker Hub), tags (tag), digest, namespaces, cgroups, koplietots kodols, gaistoša failu sistēma, sējums (volume), bind mount, porta publicēšana, oficiālais attēls
Kāpēc konteineri?
Iedomājieties: Jūs vēlaties savā VPS darbināt statusa lapu, kas parāda, vai Jūsu vietne darbojas. Programma ir uzrakstīta Node.js valodā, tai vajadzīga noteikta Node.js versija un vēl apmēram divi simti bibliotēku. Bez konteineriem Jūs to visu instalējat uz servera blakus tīmekļa serverim un datubāzei. Pēc gada Jums vajadzīga otra programma, kurai nepieciešama cita Node.js versija. Tad sākas galvassāpes.
Konteiners to atrisina. Programmas autors piegādā programmu kopā ar visu, kas tai vajadzīgs, vienā pakotnē: attēlā (image). Uz servera Jūs šo attēlu palaižat kā konteineru. Programma redz savus failus, savu Node.js, savas bibliotēkas un netraucē pārējam serverim. Vairs nav vajadzīga? Konteineru dzēšat, attēlu dzēšat, un mapēs /usr vai /etc nekas nepaliek pāri.
Docker ir pazīstamākais rīks attēlu lejupielādei un konteineru darbināšanai. Ir arī alternatīvas (Podman, pats containerd), taču jēdzieni visur ir vienādi.
Attēls, konteiners un reģistrs
Trīs vārdi, ar kuriem Jūs saskarsieties visu laiku:
- Attēls: tikai lasāma veidne ar failu sistēmu (programma, bibliotēkas, iestatījumi) un komandu, kurai jāpalaižas. Attēls sastāv no slāņiem: pamata slānis (piemēram, tukšs Debian), virs tā slānis ar Node.js, virs tā pati programma. Divi attēli ar vienādu pamata slāni koplieto šo slāni Jūsu diskā.
- Konteiners: darbojošs (vai apturēts) attēla eksemplārs. Virs tikai lasāmajiem slāņiem konteiners saņem savu plānu rakstīšanas slāni. No viena attēla Jūs varat palaist desmit konteinerus.
- Reģistrs: vieta, kur glabājas attēli, piemēram, Docker Hub (
docker.io) vai GitHub reģistrs (ghcr.io). Docker lejupielādē attēlu ardocker pull.
Attēla nosaukums izskatās šādi:
louislam/uptime-kuma:2
caddy:2
vaultwarden/server:latestDaļa aiz kola ir tags: versijas apzīmējums. Tags var mainīties: caddy:2 šodien norāda uz citu būvējumu nekā pēc trim mēnešiem, tiklīdz iznāk jauna 2.x versija. Ja vēlaties precīzi fiksēt, kuru attēlu darbināt, izmantojiet digest: satura pirkstu nospiedumu, piemēram, caddy@sha256:.... Tas nekad nemainās. Tags latest ir vienkārši nosaukums, ko izvēlas autors; tas automātiski nenozīmē "jaunākā stabilā versija", tāpēc tā ir slikta izvēle, ja vēlaties zināt, kas darbojas.
Nav virtuālā mašīna
Konteiners atgādina mazu virtuālo mašīnu, taču tā nav. Šī atšķirība ir svarīga drošībai.
| Virtuālā mašīna (piemēram, Jūsu VPS) | Konteiners | |
|---|---|---|
| Kodols | Savs kodols | Koplieto resursdatora kodolu |
| Palaišana | No sekundēm līdz minūtēm, vesela operētājsistēma | Parasti sekundes laikā, tikai programma |
| Nošķiršana | Ar hipervizoru, aparatūras līmenī | Ar kodolu: namespaces un cgroups |
| Izmērs | Gigabaiti | Bieži no desmitiem līdz simtiem megabaitu |
Konteiners būtībā ir parasts process uz Jūsu servera, ko kodols ievieto norobežotā vidē:
- namespaces nodrošina, ka procesam ir savs skatījums uz failiem, procesiem, tīklu un lietotājiem. Konteinerā programma šķiet esam process numur 1 un neredz pārējo serveri;
- cgroups ierobežo, cik daudz procesora un atmiņas tā drīkst izmantot.
Tā kā visi konteineri koplieto vienu kodolu, nošķiršana ir mazāk stingra nekā starp diviem VPS. Ievainojamība kodolā vai konteiners ar pārāk plašām tiesībām var skart resursdatoru. Tāpēc šī moduļa noteikumi: darbiniet tikai attēlus, kuriem uzticaties, nedodiet konteineriem vairāk tiesību, nekā nepieciešams, un nekad nepievienojiet (mount) konteinerā /var/run/docker.sock vai / (nodarbība 9.3 un 10.2).
Kur paliek Jūsu dati?
Šis ir klasisks iesācēju slazds. Konteinera rakstīšanas slānis ir gaistošs: ja dzēšat konteineru (piemēram, atjaunināšanas laikā, nodarbība 9.4), viss, ko programma tajā ierakstīja, pazūd. Tāpēc datiem, kuriem jāsaglabājas, jāatrodas ārpus konteinera:
- Sējums (volume): glabātuve, ko pārvalda pats Docker (zem
/var/lib/docker/volumes/). Jūs piešķirat tam nosaukumu, piemēram,uptime-kuma, un piesaistāt to mapei konteinerā:-v uptime-kuma:/app/data. - Bind mount: parasta mape uz Jūsu servera, ko pievienojat konteinerā:
-v /srv/vaultwarden:/data. Ērti, jo failus redzat tieši un tos viegli iekļaut rezerves kopijā (modulis 8).
Konteineru ar labi iestatītiem sējumiem Jūs varat izmest un izveidot no jauna, neko nezaudējot. Tieši tā darbojas atjaunināšana: lejupielādēt jaunu attēlu, dzēst veco konteineru, palaist jaunu konteineru ar tiem pašiem sējumiem. Tāpēc iekļaujiet sējumus savā rezerves kopiju plānā (nodarbība 8.1).
Portu publicēšana
Konteineram ir savs tīkls. Tīmekļa programma, kas konteinerā klausās portā 3001, no ārpuses nav sasniedzama, kamēr Jūs šo portu nepublicējat: -p 3001:3001 (resursdatora ports:konteinera ports). Uzmanību: ja adrese nav norādīta, Docker publicē portu visās servera adresēs, tātad 0.0.0.0 un [::]. Tas nozīmē: sasniedzams no visa interneta, un Docker to nokārto, apejot ufw (nodarbība 9.3). Droši ir pieradināt sevi publicēt uz loopback, -p 127.0.0.1:3001:3001, un priekšā likt reverso starpniekserveri ar https (nodarbība 9.4).
Kas veido attēlu?
Attēls ir kāda cita programmatūra, kas uz Jūsu servera var darboties kā root. Tāpēc pārbaudiet, kas ir autors:
- Docker Official Images (piemēram,
caddy,nginx,postgres) uztur Docker kopā ar autoriem; - paša autora attēli (piemēram,
louislam/uptime-kumaunvaultwarden/server), atpazīstami pēc nosaukuma, ko norāda projekta vietne; - nezināmu personu attēli ar līdzīgiem nosaukumiem: neizmantojiet.
Vienmēr izmantojiet nosaukumu, kas norādīts projekta oficiālajā vietnē, nevis pirmo, ko atrod meklēšana.
Kad jā, kad nē?
Docker ir ērts programmām, kuras autors piegādā kā attēlu, pakalpojumiem, kurus vēlaties ātri izmest vai pārvietot, un vairāku programmu ar atšķirīgām prasībām darbināšanai blakus. Servera pamatiem (SSH, ugunsmūris, atjauninājumi) konteinerus neizmantojiet. Arī viena vietne ar nginx un PHP no pakotņu avota (nodarbība 7.2) lieliski darbojas bez Docker. Konteiners pievieno slāni, kas Jums jāsaprot un jāatjaunina; izmantojiet to, ja tas sniedz labumu.
Kopsavilkums
- Attēls ir tikai lasāma veidne slāņos; konteiners ir darbojošs eksemplārs ar savu rakstīšanas slāni.
- Konteineri koplieto resursdatora kodolu un ir norobežoti ar namespaces un cgroups: vieglāki par VM, taču mazāk stingri nošķirti.
- Rakstīšanas slānis ir gaistošs: pastāvīgiem datiem jāatrodas sējumā vai bind mount, un tiem jābūt Jūsu rezerves kopijā.
- Tags var mainīties, digest ne;
latestpasaka maz. - Publicējiet portus uz 127.0.0.1 un izmantojiet tikai autora vai oficiālos attēlus.
Tests (quiz)
Uzdevums
Uzdevums O9.1: Konteiners vai nē? Izvēlieties divas programmas, kuras vēlaties darbināt uz sava servera (vai izmantojiet kā piemēru Uptime Kuma un WordPress vietni). Katrai programmai noskaidrojiet, vai autors piedāvā oficiālu attēlu un ar kādu nosaukumu, kuru tagu Jūs izvēlētos, kurā mapē atrodas pastāvīgie dati un kurā portā programma klausās. Pēc tam paskaidrojiet, vai Jūs to darbinātu konteinerā vai no pakotņu avota, un kāpēc.
Uzdevums O9.1: Konteiners vai nē?
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Uptime Kuma: louislam/uptime-kuma ar versijas tagu, dati mapē /app/data, ports 3001, publicēt uz 127.0.0.1 aiz reverse proxy. Izvēlieties izstrādātāja image vai Official Image, ar versijas tagu un nosauktu datu mapi.
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- Docker dokumentācija, What is a container?: https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/
- Docker dokumentācija, Volumes: https://docs.docker.com/engine/storage/volumes/
- Docker dokumentācija, 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/
