10. augustil kĂ€ivitus SlĂ”rmis , kus kĂ€sitleme seda tĂ€ielikult â alates pĂ”hialustest kuni vĂ”rgu parameetriteni.
Selles artiklis rÀÀgime Docker'i ajaloo ja selle peamistest abstraktsioonidest: Image, Cli, Dockerfile. Loeng on suunatud algajatele, seega ei pruugi see kogenud kasutajatele huvi pakkuda. Siin ei tule verd, apendekti ning sĂŒgavat sukeldumist. Ainult kĂ”ige alused.

Mis on Docker
Vaadakem Docker'i mÀÀratlust Vikipeediast.
Docker on tarkvara rakenduste automatiseeritud juurutamiseks ja haldamiseks konteineritoetavates keskkondades.
Selle mÀÀratlemisest ei ole midagi selgelt mĂ”istetav. Eriti ei ole arusaadav, mida tĂ€hendab âkonteineritoetavates keskkondadesâ. Selleks, et aru saada, naaseme minevikku. Alustame ajastust, mida ma tinglikult nimetan âMonoliitse ajastuksâ.
Monoliitne aeg
Monoliitne aeg on 2000. aastate algus, kui kĂ”ik rakendused olid monoliitsed, millega kaasnes hulk sĂ”ltuvusi. Arendamine oli aeglane. Sel ajal ei olnud servereid palju, me tundsime neid kĂ”iki nimedega ja jĂ€lgisime neid. On ĂŒks toredaid vĂ”rdlusi:

Lemmikloomad â need on koduloomad. Monoliitses ajas suhtusime oma serveritesse nagu lemmikloomadesse, hoolitsedes ja hellitades ning hoolitsedes, et need oleksid puhtad. Ja parema ressursihalduse jaoks kasutasime virtualiseerimist: vĂ”tsime serveri ja jagasime selle mitmeks virtuaalseks masinaks, tagades sellega keskkonna isolatsiooni.
HĂŒperviisori baasil töötavad virtualiseerimissĂŒsteemid
VirtualiseerimissĂŒsteemidest on kindlasti kĂ”ik kuulnud: VMware, VirtualBox, Hyper-V, Qemu KVM jne. Need tagavad rakenduste isolatsiooni ja ressursihalduse, kuid neil on ka puudusi. Virtualiseerimiseks on vajalik hĂŒperviisor. Ja hĂŒperviisor on ressursside ĂŒlempiir. Lisaks on virtuaalne masin tavaliselt suur â raske pilt, millel on operatsioonisĂŒsteem, Nginx, Apache ja vĂ”ib-olla ka MySQL. Pilt on suur ja virtuaalse masinaga on ebamugav opereerida. Tulemuseks on see, et töötamine virtuaalmasinatega vĂ”ib olla aeglane. Selle probleemi lahendamiseks loodi tuuma tasemel virtualiseerimissĂŒsteemid.
Tuuma tasemel virtualiseerimissĂŒsteemid
Tuuma taseme virtualiseerimist toetavad sĂŒsteemid on OpenVZ, Systemd-nspawn, LXC. Selge nĂ€ide sellisest virtualiseerimisest on LXC (Linux Containers).
LXC on operatsioonisĂŒsteemi tasemel virtualiseerimissĂŒsteem, mis vĂ”imaldab kĂ€itada mitmeid isoleeritud Linuxi operatsioonisĂŒsteemi eksemplare ĂŒhes sĂ”lmes. LXC ei kasuta virtuaalmasinaid, vaid loob virtuaalse keskkonna oma protsesside ruumi ja vĂ”rgu pöörisega.
Tegelikult loob LXC konteinerid. Mis on erinevus virtuaalmasinate ja konteinerite vahel?

Konteiner ei sobi protsesside isoleerimiseks: tuuma taseme virtualiseerimissĂŒsteemides leitakse nĂ”rkusi, mis vĂ”imaldavad konteinerist hosti vĂ€lja pÀÀseda. Seega, kui peate midagi isoleerima, on parem kasutada virtuaalmasinat.
Differentiate virtualiseerimise ja konteineriseerimise vahel saab graafikul nÀha.
On fĂŒĂŒsilisi hĂŒperviisoreid, hĂŒperviisoreid operatsioonisĂŒsteemi peal ja konteinerid.

âRaudâ hĂŒperviisorid on lahedad, kui soovite midagi tĂ”eliselt isoleerida. Sest seal on vĂ”imalus isoleerida mĂ€lu lehekĂŒlgede ja propageerijate tasemel.
On hĂŒperviisoreid kui programme ja on konteinerid, millest me edasi rÀÀgime. Konteinerimise sĂŒsteemides ei ole hĂŒperviisorid, vaid on Container Engine, mis loob ja haldab konteinerite. See on kergem, seega jĂ€relikult on tuuma töö tĂ”ttu ĂŒlekoormus vĂ€iksem vĂ”i puudub see tĂ€ielikult.
Mida kasutatakse konteinerimise taseme isoleerimiseks.
Peamised tehnoloogiad, mis vÔimaldavad luua teistest protsessidest isoleeritud konteineri, on Namespaces ja Control Groups.
Namespaces: PID, Networking, Mount ja User. On veel ka teisi, aga lihtsustamise huvides peatume nendele.
PID Namespace piirab protsesse. Kui me nĂ€iteks loome PID Namespaces ja paneme sinna protsessi, siis saab see PID 1. Tavaliselt on sĂŒsteemides PID 1 systemd vĂ”i init. Seega, kui paneme protsessi uude namespace'i, saadab see samuti PID 1.
Networking Namespace vĂ”imaldab piirata/isoleerida vĂ”rku ja seal sees juba paigutada oma liidesed. Mount on piirang failisĂŒsteemi osas. User on piirang kasutajate osas.
Control Groups: Memory, CPU, IOPS, Network â kokku ligikaudu 12 seadistust. Neid tuntakse ka kui Cgroups (âC-grupidâ).
Control Groups haldavad konteineri ressursse. Control Groups'i kaudu saame öelda, et konteiner ei tohiks tarbida rohkem kui mingi ressursside hulk.
Ette, et konteineriseerimine toimiks tÔhusalt, kasutatakse tÀiendavaid tehnoloogiaid: Capabilities, Copy-on-write ja teised.
Capabilities tĂ€hendab, et me ĂŒtleme protsessile, mida ta tohib teha ja mida mitte. SĂŒsteemi tasandil on need lihtsalt bitikaardid, millel on palju parameetreid. NĂ€iteks root-kasutajal on tĂ€ielikud Ă”igused, ta vĂ”ib teha kĂ”ike. Aja teenus saab muuta sĂŒsteemi aega: tal on capabilities Time Capsule'i osas, ja kĂ”ik. Lubade abil saab paindlikult seadistada piiranguid protsessidele, tagades seelĂ€bi enda turvalisuse.
Copy-on-write sĂŒsteem vĂ”imaldab meil töötada Docker-piltidega ja kasutada neid efektiivsemalt.
Praegu on Dockeril probleeme Cgroups v2 ĂŒhilduvusega, seetĂ”ttu rÀÀgime artiklis just Cgroups v1-st.
Aga naaseme ajalukku.
Kui tuumikutasemel virtualiseerimissĂŒsteemid ilmusid, hakati neid aktiivselt rakendama. HĂŒppervÀÀri kulu kadus, kuid mĂ”ned probleemid jĂ€id:
- suured pildid: OpenVZ-sse surutakse operatsioonisĂŒsteem, raamatukogud ja hulgaliselt erinevat tarkvara ning lĂ”puks on pilt ikka veel ĂŒsna suur;
- puudub normaalne pakendi ja kohaletoimetamise standard, seega jÀÀb alles sĂ”ltuvuste probleem. On olukordi, kus kaks kooditĂŒkki kasutavad ĂŒhte raamatukogu, kuid erinevate versioonidega. Nende vahel vĂ”ib tekkida konflikt.
Kuna kÔik need probleemid lahendada, tuli jÀrgmine ajastu.
Konteinerite ajastu
Konteinerite ajastu tÔi kaasa uue filosoofia nende kasutamiseks:
- Ăks protsess â ĂŒks konteiner.
- Kohandame kÔik vajaliku protsessi sÔltuvused tema konteinerisse. See tÀhendab, et monoliidid tuleb jagada mikroteenusteks.
- Mida vĂ€iksem on pilt, seda parem â vĂ€hem vĂ”imalikke haavatavusi, kiiremini laienev ja nii edasi.
- Instantsid muutuvad efektiivseteks.
Kas sa mĂ€letad, kuidas ma rÀÀkisin koduloomadest vs kasvatustest? Varem olid instantsid nagu koduloomad, nĂŒĂŒd on nad nagu loomakarja. Varem oli monoliit â ĂŒks rakendus. NĂŒĂŒd on see 100 mikroteenust, 100 konteinerit. MĂ”nel konteineril vĂ”ib olla 2-3 koopiat. Meile ei ole enam nii oluline kontrollida iga konteinerit. Meie jaoks on tĂ€htsam teenuse kĂ€ttesaadavus: see, mida see konteinerite komplekt teeb. See muudab jĂ€lgimismeetodeid.
2014-2015. aastal toimus Docker'i tĂ”us â tehnoloogia, millest me nĂŒĂŒd rÀÀgime.
Docker on muutnud filosoofiat ja standardiseerinud rakenduste pakkimise. Dockeriga saame rakenduse pakkida, saata selle registrisse, laadida sealt alla ja kÀivitada.
Docker-konteinerisse paneme kÔik vajaliku, mistÔttu lahendame sÔltuvuste probleemi. Docker tagab korduvuse. Ma arvan, et paljud on kogenud olukordi, kus kÔik töötab, aga kui tÔukate tootmisse, siis see enam ei tööta. Dockeriga see probleem kaob. Kui teie Docker-konteiner kÀivitub ja teeb seda, mida on vaja, siis on tÔenÀoliselt, et see kÀivitub ka tootmises ja teeb seal samu toiminguid.
KĂ€reduse ĂŒle vaidlused
KĂ€reduse ĂŒle on pidevalt vaieldud. MĂ”ned arvavad, et Docker ei too kaasa tĂ€iendavat koormust, kuna kasutab Linuxi tuuma ja kĂ”iki selle konteinerimiseks vajalikke protsesse. Nagu öeldakse: "Kui ĂŒtlete, et Docker on koormus, siis on ka Linuxi tuum koormus."
Teisest kĂŒljest, kui sĂŒĂŒbida, on Dockeris tĂ”epoolest mĂ”ned asjad, mida vĂ”ib venitada, et neid vĂ”iks pidada koormuseks.
Esiteks on see PID namespace. Kui paneme mingi protsessi namespace'i, antakse sellele PID 1. Samas on sellel protsessil veel ĂŒks PID, mis asub hosti namespace'is, konteinerist vĂ€ljaspool. NĂ€iteks, kui kĂ€ivitame Nginx'i konteineris, siis saab see PID 1 (peaprosess). Ja hostil on sellel PID 12623. Ja on keeruline öelda, kui suur koormus see on.
Teine asi on Cgroups. VĂ”tame Cgroups'i mĂ€lu pĂ”hjal, st vĂ”ime piirata konteinerile mĂ€lu. Selle sisselĂŒlitamisel aktiveeritakse arvestid, mĂ€lu arvestus: tuum peab mĂ”istma, kui palju lehti on eraldatud ja kui palju on selle konteineri jaoks veel vaba. See vĂ”ib olla koormus, kuid ma ei ole nĂ€inud tĂ€pseid uuringuid selle kohta, kuidas see mĂ”jutab jĂ”udlust. Ja ma ise ei ole mĂ€rganud, et rakendus, mis on Dockeris kĂ€ivitatud, kaotaks Ă€kki jĂ”udlust.
Ja veel ĂŒks mĂ€rkuse jĂ”udluse kohta. Teatud tuuma parameetrid edastatakse hostist konteinerisse. Eriti mĂ”ned vĂ”rguparameetrid. SeetĂ”ttu, kui soovite Dockeris kĂ€ivitada midagi kĂ”rge jĂ”udlusega, nĂ€iteks midagi, mis kasutab aktiivselt vĂ”rku, peate vĂ€hemalt neid parameetreid kohandama. NĂ€iteks nf_conntrack.
Docker'i kontseptsioonist
Docker koosneb mitmest komponendist:
- Docker Daemon â see on Container Engine; kĂ€ivitab konteinerid.
- Docker CII â tööriist Docker'i haldamiseks.
- Dockerfile â juhis, kuidas pilti koguda.
- Image â pilt, millest konteiner turvaliselt jooksma pannakse.
- Konteiner.
- Docker registry â piltide hoidla.
Skeemiliselt nÀeb see vÀlja umbes nii:

Docker_hostil töötab Docker daemon, mis kÀivitab konteinerid. On olemas Client, mis edastab kÀske: kogu pilt, laadi pilt, kÀivita konteiner. Docker daemon kÀib registry's ja tÀidab neid. Docker-cliendi vÔib pöörduda nii kohalikult (unix-soketile) kui ka TCP kaudu eemalt.
Vaatame igat komponenti.
Docker daemon (demon) â see on serveripool, see töötab host-masinal: laeb pilte ja kĂ€ivitab nendest konteinerid, loob konteinerite vahel vĂ”rgu, kogub logisid. Kui me ĂŒtleme "loo pilt", tegeleb sellega ka demon.
Docker CLI â Docker'i kliendipool, konsooli tööriist demoni korraldamiseks. Kordan, see vĂ”ib töötada mitte ainult kohalikult, vaid ka vĂ”rgus.
PÔhikÀsud:
docker ps â kuvab konteinerid, mis praegu on kĂ€ivitatud Docker-hostis.
docker images â kuvab kohalikult allalaaditud pildid.
docker search <> â pildi otsing registry's.
docker pull <> â laadi pilt registry'st masinasse alla.
docker build <<\/path\/to\/dir>> â koguge pilt.
docker run <> â kĂ€ivita konteiner.
docker rm <> â kustuta konteiner.
docker logs <> â konteineri logid
docker start/stop/restart <> â töödelge konteinerit
Kui olete need kÀsud selgeks saanud ja hakkate neid kindlalt kasutama, siis arvestage, et olete 70% Dockerist kasutaja tasemel omandanud.
Dockerfile â juhis pildi loomiseks. Peaaegu iga kĂ€su juhises â uus kiht. Vaadake nĂ€ite jĂ€rgi.

Umbes nii nĂ€eb Dockerfile vĂ€lja: vasakul kĂ€sud, paremal â argumendid. Iga kĂ€sk, mis siin on (ja ĂŒldiselt kirjutatakse Dockerfile's), loob uue kihi Image'i sees.
Isegi vasaku osa vaadates vĂ”ib umbkaudu aru saada, mis toimub. Ătleme: "loo me kaust" â see on ĂŒks kiht. "Muuda kaust töökeskkonnaks" â see on veel ĂŒks kiht, ja nii edasi. Kihtide kook lihtsustab elu. Kui ma loon veel ĂŒhe Dockerfile'i ja viimases reas midagi muudan â kĂ€ivitan mitte "python" "main.py", vaid midagi muud, vĂ”i installin sĂ”ltuvusi teisest failist â siis eelnevaid kihte kasutatakse kĂ€rg-struktuuri kaudu.
Pilt â see on konteineri pakett, millest kĂ€ivitatakse konteinerid. Kui vaadata Dockerit nagu pakkemanagerit (nagu töötaksime deb vĂ”i rpm-pakkidega), siis image on pĂ”himĂ”tteliselt rpm-pakk. Yumi installimise kaudu saame rakenduse paigaldada, selle eemaldada, leida hoidlast, alla laadida. Siin on sama: konteinerid kĂ€ivitatakse pildist, need salvestatakse Docker registry's (analoogina toaga) ja iga image'il on SHA-256 hash, nimi ja silt.
Image koostatakse Dockerfile'i juhiste jÀrgi. Iga juhis Dockerfile'is loob uue kihi. Kihti saab taaskasutada.
Docker registry â on Docker'i piltide hoidla. Analoogina operatsioonisĂŒsteemidele, on Dockeril avalik standardne registri â dockerhub. Kuid vĂ”ite luua oma hoidla, oma Docker registry.
Konteiner â see, mis kĂ€ivitatakse pildist. Koostasime pildi Dockerfile'i juhiste jĂ€rgi, seejĂ€rel kĂ€ivitame me selle pildist. See konteiner on teistest konteineritest isoleeritud, see peab sisaldama kĂ”ike vajalikku rakenduse töötamiseks. Samuti tĂ€hendab see, et ĂŒks konteiner â ĂŒks protsess. On juhtumeid, kus tuleb teha kaks protsessi, kuid see on veidi vastuolus Docker'i ideoloogiaga.
NĂ”ue "ĂŒks konteiner â ĂŒks protsess" on seotud PID Namespace'iga. Kui Namespace'is kĂ€ivitatakse protsess PID 1-ga ja kui see Ă€kki sureb, siis sureb kogu konteiner samuti. Kui seal kĂ€ivitatakse kaks protsessi: ĂŒks elab, teine sureb, jĂ€tkab konteiner kuidagi elamist. Kuid see puudutab parimaid tavasid, neist rÀÀgime teistes materjalides.
Rohkem teavet kursuse eripÀrade ja tÀieliku programmi kohta leiate lingilt: «».
Autor: Marcel Ibiraev, sertifitseeritud Kubernetes'i administraator, praktiseeriv insener Southbridge'is, esineja ja SlÔrmi kursuste arendaja.
Allikas: habr.com
