10. augustil alustas Sloermis , kus me kĂ€sitleme seda pĂ”hjalikult â alates pĂ”hialustest kuni vĂ”rguparameetriteni.
Selles artiklis rÀÀgime Docker'i ajalukku ja selle peamistest kontseptsioonidest: Image, Cli, Dockerfile. Loeng on suunatud algajatele, seega ei pruugi see huvi pakkuda kogenud kasutajatele. Siin ei ole verd, pimesoole ja sĂŒgavat sukeldumist. KĂ”ige alus.

Mis on Docker
Vaadake Docker'i mÀÀratlust Vikipeediast.
Docker on tarkvara, mis automatiseerib rakenduste juurutamist ja haldamist konteineritootmiseks toetavates keskkondades.
Sellest mÀÀratlusest ei saa midagi aru. Eriti ei ole selge, mida tÀhendab "konteineritootmist toetavates keskkondades". Et paremini aru saada, naaseme tagasi minevikku. Alustame ajastust, mida ma tinglikult nimetaksin "Monoliitse ajastuks".
Monoliitne aeg
Monoliitne aeg on 2000. aastate algus, mil kÔik rakendused olid monoliidsed, koos hulga sÔltuvustega. Arendamine kestis kaua. Samuti ei olnud palju servereid, me tundsime neid kÔiki nimedega ja jÀlgisime neid. On selline naljakas vÔrdlus:

Lemmikud â need on koduloomad. Monoliitsetera ajal kohtlesime oma servereid nagu koduloomi, hoolitsedes ja hellitades neid, Ńöljem tolmu. Parema ressursihaldamise nimel kasutasime virtualiseerimist: vĂ”tsime serveri ja lĂ”ikasime mitmeks virtuaalseks masinaks, tagades sellega keskkonna isoleerituse.
HĂŒpperviisoril pĂ”hinevad virtualiseerimissĂŒsteemid
TĂ”enĂ€oliselt olete kĂ”ik kuulnud virtualiseerimissĂŒsteemidest nagu VMware, VirtualBox, Hyper-V, Qemu KVM jne. Need tagavad rakenduste isoleerimise ja ressursihalduse, kuid neil on ka puudusi. Virtualiseerimiseks on vajalik hĂŒpperviisor. HĂŒpperviisor toob kaasa ressursitaseme ĂŒlekoormuse. Ja tavaliselt on virtuaalne masin suur ja raske â sellel on operatsioonisĂŒsteem, Nginx, Apache ja vĂ”ib-olla ka MySQL. Pilt on suur, virtuaalse masinaga on ebamugav opereerida. SeetĂ”ttu vĂ”ib virtuaalmasinatega töötamine olla aeglane. Selle probleemi lahendamiseks loodi tuumatasandi virtualiseerimissĂŒsteemid.
Tuumatasandi virtualiseerimissĂŒsteemid
Tuumatasandi virtualiseerimist toetavad sĂŒsteemid nagu OpenVZ, Systemd-nspawn, LXC. TĂŒĂŒpiline nĂ€ide sellisest virtualiseerimisest on LXC (Linux Containers).
LXC â operatsioonisĂŒsteemi tasemel virtualiseerimis sĂŒsteem, mis vĂ”imaldab kĂ€ivitada mitu eraldatud Linuxi operatsioonisĂŒsteemi instantsi ĂŒhel sĂ”lmel. LXC ei kasutata virtuaalmasinaid, vaid loob virtuaalse keskkonna oma protsesside ruumiga ja vĂ”rgu tarkvaraga.
Sisuliselt loob LXC konteinerid. Milline on erinevus virtuaalmasinate ja konteinerite vahel?

Konteiner ei sobi protsesside isoleerimiseks: tuuma taseme virtualiseerimissĂŒsteemides leitud haavatavused vĂ”imaldavad pÀÀseda konteinerist vĂ€lja hosti peale. SeetĂ”ttu, kui soovite midagi isoleerida, on parem kasutada virtuaalmasinat.
Erinevusi virtualiseerimise ja konteineriseerimise vahel on vÔimalik nÀha skeemilt.
Eksisteerivad riistvaralised hĂŒperviisorid, hĂŒperviisorid operatsioonisĂŒsteemi peal ja konteinerid.

"Riistvaralised" hĂŒperviisorid on suurepĂ€rane valik, kui soovite midagi tĂ”eliselt isoleerida. Sest seal on vĂ”imalik isoleerida mĂ€lu lehekĂŒlgede ja protsessorite tasemel.
On olemas hĂŒperviisoreid programmidena ja konteinerid, millest me edaspidi rÀÀgime. Konteinerimise sĂŒsteemides hĂŒperviisorit ei ole, ent olemas on Container Engine, mis loob ja haldab konteinersid. See on kergem lahendus, mistĂ”ttu on tuumaga töötamisega seotud overhead vĂ€iksem vĂ”i isegi puudub.
Mis on kasutusel konteinerimise tasemel tuumas?
Peamised tehnoloogiad, mis vÔimaldavad luua teistest protsessidest isoleeritud konteinerit, on Namespaces ja Control Groups.
Namespaces: PID, Networking, Mount ja User. On veel, kuid lihtsuse huvides peatume nendel.
PID Namespace piirab protsesse. Kui me nĂ€iteks loome PID Namespacet ja paneme sinna protsessi, siis saab see PID 1. Tavalistes sĂŒsteemides on PID 1 tavaliselt systemd vĂ”i init. Seega, kui paneme protsessi uude namespace'i, saabki see PID 1.
Networking Namespace vĂ”imaldab piirata/isoleerida vĂ”rku ning sinna paigutada oma liidested. Mount â see on piirang failisĂŒsteemis. User â piirangute seaded kasutajatele.
Control Groups: Memory, CPU, IOPS, Network â kokku umbes 12 seadistust. Neid tuntakse ka kui Cgroups ('C-groups').
Control Groups haldavad konteineri ressursse. Control Groups'i kaudu saame öelda, et konteiner ei tohiks tarbida rohkem kui teatud kogus ressursse.
Konteinerimise tÔhusaks toimimiseks kasutatakse tÀiendavaid tehnoloogiaid: Capabilities, Copy-on-write ja teised.
Capabilities â see tĂ€hendab, et me ĂŒtleme protsessile, mida ta teha tohib ja mida mitte. SĂŒsteemi tasemel on need lihtsalt bitikaardid, kus on palju parameetreid. NĂ€iteks, kasutajal root on tĂ€isĂ”igused, ta vĂ”ib teha kĂ”ike. Aja server vĂ”ib muuta sĂŒsteemi kellaaega: tal on Time Capsule'i capabilities ja kĂ”ik. Privileegide abil saab paindlikult seadistada protsesside piiranguid ja seelĂ€bi end kaitsta.
Copy-on-write sĂŒsteem vĂ”imaldab meil töötada Docker'i piltidega, kasutades neid efektiivsemalt.
Praegu on Docker'il probleeme Cgroups v2 ĂŒhilduvusega, seetĂ”ttu kĂ€sitletakse artiklis Cgroups v1.
Kuid naaseme ajalukku.
Kui tuumatasandi virtualiseerimissĂŒsteemid ilmusid, hakati neid aktiivselt rakendama. HĂŒperevisori ĂŒlekoormus kadus, kuid mĂ”ned probleemid jĂ€id alles:
- suured pildid: sama OpenVZ-sse tĂ”ukatakse operatsioonisĂŒsteem, raamatukogud, palju erinevat tarkvara, ja lĂ”puks on pilt ikkagi ĂŒsna suur;
- normaalset pakendamise ja tarne standardit ei ole, seetĂ”ttu jÀÀb probleem sĂ”ltuvustele. On olukordi, kus kaks koodi osa kasutavad ĂŒhte ja sama raamatukogu, aga erinevate versioonidega. Nende vahel vĂ”ivad tekkida konfliktid.
Nende probleemide lahendamiseks algas jÀrgmine ajastu.
Konteinerite ajastu
Kui saabus konteinerite ajastu, muutus ka nende kasutamise filosoofia:
- Ăks protsess â ĂŒks konteiner.
- Kohandame kÔik protsessile vajalikud sÔltuvused tema konteinerisse. See nÔuab monoliitide jagamist mikroteenusteks.
- Mida vĂ€iksem on pilt, seda parem â vĂ€hem vĂ”imalikke haavatavusi, kiiremini paigaldatav jne.
- Instantsid muutuvad efemeerseteks.
Kas sa mĂ€letad, kuidas ma rÀÀkisin lemmikloomadest ja karjast? Varem olid instantsid sarnased lemmikloomadele, nĂŒĂŒd aga on nad nagu karja â veised. Varem oli monoliit â ĂŒks rakendus. NĂŒĂŒd on see 100 mikroteenust, 100 konteinerit. MĂ”nel konteineril vĂ”ib olla 2-3 koopiat. Me ei pea enam iga konteineri ĂŒle nii palju kontrollima. Meie jaoks on olulisem teenuse kĂ€ttesaadavus: see, mida see konteinerite komplekt teeb. See muudab jĂ€lgimise lĂ€henemist.
Aastatel 2014-2015 toimus Docker'i tĂ”us â tehnoloogia, millest me praegu rÀÀgime.
Docker muutis filosoofiat ja standardiseeris rakenduste pakendamise. Docker'i abil saame pakendada rakenduse, saata selle hoidlasse, alla laadida sealt ja juurutada.
Docker-konteinerisse paneme kĂ”ik vajaliku, seega lahendab see sĂ”ltuvuste probleemi. Docker tagab reprodutseeritavuse. Ma arvan, et paljud on kokku puutunud olukordadega, kus kĂ”ik töötab, kuid kui lĂŒkkad selle tootmisse, enam ei tööta. Dockeriga kaob see probleem. Kui sinu Docker-konteiner kĂ€ivitub ja teeb seda, mida peab tegema, siis on suure tĂ”enĂ€osusega, et see kĂ€ivitub ka tootmises ja teeb seal sama.
Ăks kĂ”rvalepĂ”ige ooverheadi teemal
Ooverheadi osas kĂ€ivad pidevalt vaidlused. MĂ”ned arvavad, et Docker ei too tĂ€iendavat koormust, kuna kasutab Linuxi tuuma ja kĂ”iki selle protsesse, mis on vajalikud konteinerimiseks. Nagu, "kui sa ĂŒtled, et Docker on ooverhead, siis on ka Linuxi tuum ooverhead."
Teisest kĂŒljest, kui sĂŒveneda, siis on Dockeris tĂ”epoolest mĂ”ned asjad, mida vĂ”iks pingutades nimetada ooverheadiks.
Esimene on PID namespace. Kui paneme protsessi namespace'isse, antakse sellele PID 1. Samas on sellel protsessil ka teine PID, mis asub hosti namespace'is, konteineri vÀljaspool. NÀiteks, kui kÀivitasime konteineris Nginxi, sai sellest PID 1 (master-protsess). Kuid hostis on selle PID 12623. Ja on keeruline öelda, kui suur see overhead on.
Teine asi on Cgroups. Vaatame Cgroups'i mĂ€lule, st vĂ”imalust piirata konteineri mĂ€lu. Kui see on sisse lĂŒlitatud, aktiveeritakse arvestid, memory accounting: kernel peab aru saama, kui palju lehti on eraldatud ja kui palju on veel saadaval selle konteineri jaoks. See vĂ”ib olla overhead, kuid ma ei ole nĂ€inud tĂ€pset uurimist, kuidas see jĂ”udlust mĂ”jutab. Samuti ei ole ma mĂ€rganud, et rakendus, mis on kĂ€ivitatud Docker'is, kaotaks jĂ€rsult jĂ”udlust.
Ja veel ĂŒks tĂ€helepanek jĂ”udluse kohta. Teatud sĂŒdamiku parameetrid edastatakse hostist konteinerisse. EelkĂ”ige 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 need parameetrid kohandama. NĂ€iteks nf_conntrack.
Docker kontseptsioonist
Docker koosneb mitmest komponendist:
- Docker Daemon â see on Container Engine; kĂ€ivitab konteinerid.
- Docker CLI â Docker'i haldamise tööriist.
- Dockerfile â juhis pildi koostamiseks.
- Image â pilt, millest konteiner kĂ€ivitatakse.
- Container.
- Docker registry â piltide hoidla.
Skeemiliselt nÀeb see vÀlja umbes selline:

Docker_hostis töötab Docker daemon, mis kÀivitab konteinerid. On Client, mis edastab kÀske: kogu pilt, laadi pilt alla, kÀivita konteiner. Docker daemon lÀheb registrisse ja tÀidab need. Docker klient vÔib pöörduda nii kohalikult (Unix-soketi kaudu) kui ka TCP kaudu eemal asuvalt hostilt.
KÀime lÀbi iga komponendi.
Docker daemon (daemon) â see server pool, which operates on the host machine: downloads images and starts containers, creates a network between containers, and collects logs. When we say 'create an image', this task is also carried out by the daemon.
Docker CLI â the client side of Docker, a console utility for interacting with the daemon. Let me emphasize, it can work not only locally but also over a network.
Basic commands:
docker ps â display the containers that are currently running on the Docker host.
docker images â display the images downloaded locally.
docker search â search for an image in the registry.
docker pull â download an image from the registry to the machine.
docker build <> â build an image.
docker run â run a container.
docker rm â remove a container.
docker logs â logs of the container.
docker start/stop/restart â manage the container.
If you master these commands and use them confidently, consider that you have mastered Docker at the user level by 70%.
Dockerfile â an instruction for creating an image. Almost every command in the instruction is a new layer. Let's look at an example.

Umbes nii nĂ€eb Dockerfile vĂ€lja: vasakul on kĂ€sud, paremal â argumendid. Iga kĂ€sk, mis siin on (ja mida ĂŒldiselt Dockerfile'is kirjutatakse), loob uue kihi pildis.
Isegi vasakut poolt vaadates vĂ”ib enam-vĂ€hem aru saada, mis toimub. Ătleme: "loo me kaust" â see on ĂŒks kiht. "Muuda kaust tööks" â see on veel ĂŒks kiht ja nii edasi. Kihtide kook lihtsustab elu. Kui ma teen veel ĂŒhe Dockerfile'i ja muudan viimases reas midagi â kĂ€ivitan mitte "python" "main.py", vaid midagi muud vĂ”i installin sĂ”ltuvused teisest failist â siis eelnevaid kihte kasutatakse uuesti, nagu vahemĂ€lu.
Image â see on konteineri pakendamine, piltidest kĂ€ivitatakse konteinerid. Kui vaadata Dockerit nagu paketihaldurit (nagu töötaksime deb vĂ”i rpm pakettidega), siis image on sisuliselt rpm-pakett. YUM installimise kaudu saame rakenduse paigaldada, selle eemaldada, leida repos, alla laadida. Siin on umbes sama: piltidest kĂ€ivitatakse konteinerid, need on salvestatud Docker registry's (sarnaselt YUM-ile, repos) ja igal pildil on SHA-256 hash, nimi ja silt.
Pilt luuakse Dockerfile'i juhendi jÀrgi. Iga juhend Dockerfile'is loob uue kihi. Kihti saab taaskasutada.
Docker registry on Docker'i piltide hoidla. Sarnaselt operatsioonisĂŒsteemidele, on Docker'il avalik standardne registri â dockerhub. Kuid vĂ”ite luua ka oma hoidla, oma Docker registry.
Konteiner on see, mis kĂ€ivitatakse pildist. Dockerfile'i juhendi jĂ€rgi koostasime pildi, nĂŒĂŒd kĂ€ivitame selle pildi pĂ”hjal. See konteiner on isoleeritud teistest konteineritest ja peab sisaldama kĂ”ike vajalikku rakenduse töötamiseks. Samas ĂŒks konteiner â ĂŒks protsess. Juhtub, et tuleb luua kaks protsessi, kuid see lĂ€heb natuke vastuollu Docker'i ideoloogiaga.
NĂ”ue Â«ĂŒks konteiner â ĂŒks protsess» on seotud PID nimelastega. Kui nimelaste sees kĂ€ivitatakse protsess PID 1, siis kui see sureb, sureb ka kogu konteiner. Kui seal on kĂ€ivitatud kaks protsessi: ĂŒks elab, teine on surnud, elab konteiner ikkagi edasi. Kuid see on parimate praktika kĂŒsimus, millest rÀÀgime teistes materjalides.
Kursuse omaduste ja tÀieliku programmi lÀhemalt uurimiseks vÔite klÔpsata lingile: «».
Autor: Marsel Ibrajev, sertifitseeritud Kubernetes administraator, praktikainsener Southbridge'is, esineja ja SlĂžrmi kursuste arendaja.
Allikas: habr.com
