Pereiti prie turinio
Pagrindinis » IT ir technologijos » Docker technologijos veikimas

Docker technologijos veikimas

Kas ta Docker ir kodėl visi apie ją kalba

Jei kada nors bandėte paleisti programą savo kompiuteryje ir gavote pranešimą „bet mano kompiuteryje veikė”, tai tikrai suprasite, kodėl Docker tapo tokia populiaria. Ši technologija iš esmės išsprendė amžiną programuotojų problemą – kaip užtikrinti, kad programa veiktų vienodai visur: nuo kūrėjo nešiojamojo iki produkcijos serverio.

Docker atsirado maždaug 2013 metais, kai Solomon Hykes ir jo komanda pristatė šią technologiją. Nors konteinerių idėja egzistavo ir anksčiau (Linux konteineriai buvo nuo 2008-ųjų), Docker padarė juos prieinamus plačiajai visuomenei. Tai buvo tarsi iPhone momentas konteinerių pasaulyje – technologija egzistavo, bet niekas jos nesugebėjo padaryti tokios patogios naudoti.

Paprasčiausiai tariant, Docker leidžia „supakuoti” programą kartu su visomis jos priklausomybėmis į vieną konteinerį. Įsivaizduokite, kad siunčiate ne tik tortą, bet ir visą kepyklą, kurioje jis buvo pagamintas – su visais reikalingais įrankiais, ingredientais ir instrukcijomis.

Kaip Docker skiriasi nuo virtualių mašinų

Daugelis žmonių painioja Docker konteinerius su virtualiomis mašinomis, bet tai visiškai skirtingi dalykai. Virtuali mašina – tai tarsi visas kompiuteris kompiuteryje. Ji turi savo operacinę sistemą, branduolį, virtualius įrenginius. Jei paleidžiate tris virtualias mašinas, jūsų kompiuteris iš esmės veikia keturias operacines sistemas vienu metu.

Docker konteineriai veikia visiškai kitaip. Jie dalijasi pagrindine operacine sistema su jūsų kompiuteriu, bet veikia izoliuotoje aplinkoje. Tai tarsi butai daugiabutyje – visi naudoja tą pačią infrastruktūrą (vandentiekį, elektros tinklą), bet kiekvienas butas yra atskiras ir nepriklausomas.

Praktiškai tai reiškia, kad Docker konteineriai yra daug lengvesni ir greičiau paleidžiami. Virtuali mašina gali užimti kelis gigabaitus ir užsikrauti kelias minutes, o Docker konteineris dažnai užima šimtus megabaitų ir paleidžiamas per kelias sekundes. Tai milžiniškas skirtumas, ypač kai reikia paleisti dešimtis ar šimtus programų vienu metu.

Docker variklio anatomija

Docker architektūra susideda iš kelių pagrindinių dalių, kurios kartu sudaro veikiančią sistemą. Pirmiausia yra Docker daemonas – tai tarsi dirigentas, kuris valdo visus konteinerius jūsų sistemoje. Jis veikia fone ir laukia komandų.

Paskui turime Docker klientą – tai programa, per kurią jūs bendraujate su daemonu. Kai įvedate komandą terminale, pavyzdžiui `docker run`, iš tikrųjų kreipiamės į daemoną ir sakome jam, ką daryti.

Trečias svarbus elementas – Docker registras. Tai tarsi programėlių parduotuvė konteinerių pasaulyje. Populiariausias yra Docker Hub, kur galite rasti tūkstančius paruoštų konteinerių atvaizdų – nuo paprastos Ubuntu operacinės sistemos iki sudėtingų duomenų bazių ar web serverių.

Pats konteineris yra paleistas atvaizdo (image) egzempliorius. Atvaizdas – tai tarsi receptas, o konteineris – pagal tą receptą pagamintas patiekalas. Galite turėti vieną atvaizdą ir paleisti iš jo dešimtis konteinerių.

Dockerfile – konteinerių kūrimo instrukcija

Dockerfile yra tekstinis failas, kuriame aprašote, kaip sukurti savo konteinerį. Tai tarsi LEGO konstrukcijos instrukcija – žingsnis po žingsnio nurodote, ką reikia daryti.

Paprastas Dockerfile pavyzdys galėtų atrodyti taip:

„`
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3
COPY mano_programa.py /app/
CMD [„python3”, „/app/mano_programa.py”]
„`

Pirmoji eilutė nurodo, nuo ko pradedame – šiuo atveju nuo Ubuntu 20.04 operacinės sistemos. Antroji įdiegia Python. Trečioji nukopijuoja jūsų programą į konteinerį. Ketvirtoji nurodo, ką paleisti, kai konteineris užsikrauna.

Dockerfile sluoksniavimo principas yra genialus. Kiekviena instrukcija sukuria naują sluoksnį, kuris yra kešuojamas. Jei pakeisite tik paskutinę eilutę, Docker nepersikurs visko iš naujo – panaudos ankstesnius sluoksnius iš kešo. Tai sutaupo neįtikėtinai daug laiko.

Tinklų ir duomenų valdymas Docker aplinkoje

Vienas iš sudėtingesnių Docker aspektų – kaip konteineriai bendrauja tarpusavyje ir su išoriniu pasauliu. Docker sukuria virtualius tinklus, per kuriuos konteineriai gali kalbėtis. Galite turėti web serverį viename konteineryje ir duomenų bazę kitame, ir jie puikiai bendraus per Docker tinklą.

Yra keletas tinklų tipų. Bridge tinklas – numatytasis variantas, kai konteineriai tame pačiame kompiuteryje gali kalbėtis tarpusavyje. Host tinklas leidžia konteineriui naudoti pagrindinio kompiuterio tinklo sąsają tiesiogiai. Overlay tinklai naudojami, kai konteineriai yra skirtinguose fiziniuose kompiuteriuose.

Duomenų saugojimas Docker konteineriuose taip pat turi savo ypatumus. Konteineriai pagal nutylėjimą yra laikini – kai juos ištrinate, visa informacija dingsta. Todėl Docker turi „volumes” – tai tarsi išoriniai kietieji diskai, kurie gyvuoja nepriklausomai nuo konteinerių. Jei kuriate duomenų bazę, tikrai norėsite naudoti volume, kad neprarastumėte duomenų.

Docker Compose ir kelių konteinerių orkestravimas

Kai jūsų programa auga, greičiausiai reikės ne vieno, o kelių konteinerių. Pavyzdžiui, web aplikacijai gali prireikti web serverio, duomenų bazės, Redis kešavimo sistemos ir dar kelių dalykų. Paleisti juos visus rankiniu būdu būtų košmaras.

Čia į sceną įžengia Docker Compose. Tai įrankis, leidžiantis aprašyti visą kelių konteinerių aplikaciją viename YAML faile. Nurodote, kokius konteinerius reikia paleisti, kaip jie turėtų būti susieti, kokius tinklus naudoti – ir viena komanda `docker-compose up` visa sistema užsikrauna.

Docker Compose failas atrodo maždaug taip:

„`yaml
version: ‘3’
services:
web:
build: .
ports:
– „5000:5000”
database:
image: postgres
environment:
POSTGRES_PASSWORD: slaptazodis
„`

Tai neįtikėtinai patogu kūrimo metu. Naujas komandos narys gali parsisiųsti projektą, paleisti `docker-compose up` ir per kelias minutes turėti veikiančią visą sistemą savo kompiuteryje. Nereikia valandų praleisti konfigūruojant aplinką.

Saugumo klausimai ir geriausia praktika

Docker konteineriai nėra magiškas saugumo sprendimas – jie suteikia izoliaciją, bet ne absoliučią apsaugą. Konteineris dalijasi branduoliu su pagrindine sistema, todėl branduolio pažeidžiamumas gali paveikti visus konteinerius.

Viena svarbiausių taisyklių – niekada nepaleidžiakite konteinerių su root teisėmis, jei tai nėra būtina. Sukurkite atskirą vartotoją konteineryje ir naudokite jį. Taip pat reguliariai atnaujinkite bazinį atvaizdą – seni atvaizdai gali turėti žinomų saugumo spragų.

Kitas svarbus dalykas – niekada neįtraukite slaptažodžių ar API raktų į Dockerfile. Naudokite aplinkos kintamuosius arba Docker secrets funkciją. Dockerfile yra dažnai įkeliamas į viešus repozitorijus, ir ten esantys slaptažodžiai tampa viešais.

Taip pat verta naudoti oficialius atvaizdus iš patikimų šaltinių. Docker Hub pilnas įvairių atvaizdų, bet ne visi jie yra saugūs. Geriau naudoti oficialius, pavyzdžiui, `nginx`, `postgres`, `python`, nei kažkieno nepatikrinto vartotojo sukurtus.

Kai konteinerių pasaulis tampa realybe

Docker iš tiesų pakeitė tai, kaip kuriame ir diegiame programas. Tai, kas anksčiau užimdavo valandas ar net dienas – aplinkos paruošimas, priklausomybių įdiegimas, konfigūravimas – dabar užima minutes. Kūrėjai gali sutelkti dėmesį į kodo rašymą, o ne į infrastruktūros valdymą.

Žinoma, Docker nėra visų problemų sprendimas. Labai mažoms aplikacijoms tai gali būti per daug. Jei kuriate paprastą skriptą, kuris veikia vieną kartą per dieną, konteinerizacija gali būti nereikalinga komplikacija. Bet kai tik jūsų projektas pradeda augti, kai reikia užtikrinti vienodą veikimą skirtingose aplinkose, kai komanda didėja – Docker tampa neįkainojamu įrankiu.

Gražiausia, kad pradėti naudoti Docker nėra sunku. Galite parsisiųsti Docker Desktop, paleisti kelis pavyzdinius konteinerius ir per kelias valandas suprasti pagrindus. Tikrasis mokymasis prasideda praktikuojant – sukurkite Dockerfile savo projektui, pabandykite Docker Compose su keliomis paslaugomis, eksperimentuokite su tinklais ir volumes.

Technologija nuolat tobulėja – atsiranda nauji įrankiai, tobulinamos saugumo funkcijos, didėja našumas. Bet pagrindinė Docker idėja – programa kartu su visa jos aplinka vienoje dėžutėje – išlieka ta pati ir toliau keičia programinės įrangos kūrimo pasaulį.