Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Ilianza tarehe 10 Agosti katika Slurm Kozi ya video ya Docker, ambayo sisi kuchambua kabisa - kutoka abstractions msingi kwa vigezo mtandao.

Katika nakala hii tutazungumza juu ya historia ya Docker na vifupisho vyake kuu: Picha, Cli, Dockerfile. Mhadhara huo umekusudiwa kwa wanaoanza, kwa hivyo hakuna uwezekano wa kuwa na riba kwa watumiaji wenye uzoefu. Hakutakuwa na damu, kiambatisho au kuzamishwa kwa kina. Mambo ya msingi sana.

Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Docker ni nini

Wacha tuangalie ufafanuzi wa Docker kutoka Wikipedia.

Docker ni programu ya kusambaza otomatiki na usimamizi wa programu katika mazingira yaliyo na vyombo.

Hakuna kilicho wazi kutoka kwa ufafanuzi huu. Haijulikani hasa ni nini maana ya "katika mazingira ambayo yanasaidia uwekaji vyombo". Ili kujua, turudi nyuma wakati. Wacha tuanze na enzi ambayo mimi kawaida huiita "Enzi ya Monolithic."

Enzi ya monolithic

Enzi ya monolithic ni mapema miaka ya 2000, wakati maombi yote yalikuwa monolithic, na kundi la utegemezi. Maendeleo yalichukua muda mrefu. Wakati huo huo, hakukuwa na seva nyingi; sote tulizijua kwa majina na kuzifuatilia. Kuna kulinganisha kwa kuchekesha kama hii:

Wanyama wa kipenzi ni wanyama wa nyumbani. Katika enzi ya monolithic, tulishughulikia seva zetu kama wanyama kipenzi, tulioandaliwa na kuthaminiwa, tukipeperusha vumbi. Na kwa usimamizi bora wa rasilimali, tulitumia uboreshaji: tulichukua seva na kuikata kwenye mashine kadhaa za kawaida, na hivyo kuhakikisha kutengwa kwa mazingira.

Mifumo ya uvumbuzi ya msingi wa Hypervisor

Labda kila mtu amesikia kuhusu mifumo ya uboreshaji: VMware, VirtualBox, Hyper-V, Qemu KVM, n.k. Wanatoa utengaji wa programu na usimamizi wa rasilimali, lakini pia wana hasara. Ili kufanya virtualization, unahitaji hypervisor. Na hypervisor ni rasilimali ya juu. Na mashine ya kawaida yenyewe ni colossus nzima - picha nzito iliyo na mfumo wa uendeshaji, Nginx, Apache, na labda MySQL. Picha ni kubwa na mashine pepe si rahisi kufanya kazi. Kama matokeo, kufanya kazi na mashine za kawaida kunaweza kuwa polepole. Ili kutatua tatizo hili, mifumo ya virtualization iliundwa katika ngazi ya kernel.

Mifumo ya uboreshaji wa kiwango cha Kernel

Uboreshaji wa kiwango cha Kernel unasaidiwa na mifumo ya OpenVZ, Systemd-nspawn, LXC. Mfano wa kushangaza wa uboreshaji kama huo ni LXC (Vyombo vya Linux).

LXC ni mfumo wa uboreshaji wa kiwango cha mfumo wa uendeshaji wa kuendesha matukio mengi ya pekee ya mfumo wa uendeshaji wa Linux kwenye nodi moja. LXC haitumii mashine pepe, lakini huunda mazingira ya mtandaoni yenye nafasi yake ya mchakato na mrundikano wa mtandao.

Kimsingi LXC huunda vyombo. Kuna tofauti gani kati ya mashine halisi na kontena?

Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Chombo hakifai kwa michakato ya kutenganisha: udhaifu hupatikana katika mifumo ya uboreshaji katika kiwango cha kernel inayowaruhusu kutoroka kutoka kwa kontena hadi kwa seva pangishi. Kwa hivyo, ikiwa unahitaji kutenganisha kitu, ni bora kutumia mashine ya kawaida.

Tofauti kati ya uboreshaji na uwekaji vyombo zinaweza kuonekana kwenye mchoro.
Kuna hypervisors za vifaa, hypervisors juu ya OS, na vyombo.

Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Hypervisors ya vifaa ni nzuri ikiwa unataka kutenga kitu. Kwa sababu inawezekana kujitenga kwa kiwango cha kurasa za kumbukumbu na wasindikaji.

Kuna hypervisors kama programu, na kuna vyombo, na tutazungumza juu yao zaidi. Mifumo ya Containerization haina hypervisor, lakini kuna Injini ya Kontena ambayo huunda na kudhibiti vyombo. Jambo hili ni nyepesi zaidi, hivyo kutokana na kufanya kazi na msingi kuna chini ya juu au hakuna kabisa.

Ni nini kinachotumika kwa uwekaji wa vyombo kwenye kiwango cha kernel

Teknolojia kuu zinazokuruhusu kuunda kontena iliyotengwa na michakato mingine ni Nafasi za Majina na Vikundi vya Kudhibiti.

Nafasi za Majina: PID, Mitandao, Mlima na Mtumiaji. Kuna zaidi, lakini kwa urahisi wa kuelewa tutazingatia haya.

Michakato ya mipaka ya nafasi ya majina ya PID. Wakati, kwa mfano, tunaunda Nafasi ya Jina ya PID na kuweka mchakato hapo, inakuwa na PID 1. Kawaida katika mifumo PID 1 ni systemd au init. Ipasavyo, tunapoweka mchakato katika nafasi mpya ya majina, pia hupokea PID 1.

Networking Namespace hukuruhusu kuweka kikomo/kutenganisha mtandao na kuweka violesura vyako ndani. Mount ni kizuizi cha mfumo wa faili. Mtumiaji - kizuizi kwa watumiaji.

Vikundi vya Kudhibiti: Kumbukumbu, CPU, IOPS, Mtandao - kuhusu mipangilio 12 kwa jumla. Vinginevyo pia huitwa Vikundi ("C-groups").

Vikundi vya Kudhibiti hudhibiti rasilimali za kontena. Kupitia Vikundi vya Udhibiti tunaweza kusema kwamba kontena haipaswi kutumia zaidi ya kiasi fulani cha rasilimali.

Ili uwekaji vyombo kufanya kazi kikamilifu, teknolojia za ziada hutumiwa: Uwezo, Copy-on-write na zingine.

Uwezo ni wakati tunaambia mchakato kile kinachoweza na kisichoweza kufanya. Katika kiwango cha kernel, hizi ni bitmaps zilizo na vigezo vingi. Kwa mfano, mtumiaji wa mizizi ana marupurupu kamili na anaweza kufanya kila kitu. Seva ya saa inaweza kubadilisha muda wa mfumo: ina uwezo kwenye Kibonge cha Muda, na ndivyo ilivyo. Kwa kutumia mapendeleo, unaweza kusanidi vizuizi kwa michakato kwa urahisi, na kwa hivyo kujilinda.

Mfumo wa Copy-on-write huturuhusu kufanya kazi na picha za Docker na kuzitumia kwa ufanisi zaidi.

Docker kwa sasa ina maswala ya utangamano na Cgroups v2, kwa hivyo nakala hii inaangazia haswa Cgroups v1.

Lakini turudi kwenye historia.

Wakati mifumo ya virtualization ilipoonekana kwenye kiwango cha kernel, ilianza kutumika kikamilifu. Sehemu ya juu kwenye hypervisor ilipotea, lakini shida zingine zilibaki:

  • picha kubwa: wanasukuma mfumo wa uendeshaji, maktaba, rundo la programu tofauti kwenye OpenVZ sawa, na mwishowe picha bado inageuka kuwa kubwa kabisa;
  • Hakuna kiwango cha kawaida cha ufungaji na utoaji, hivyo tatizo la utegemezi bado. Kuna hali wakati vipande viwili vya nambari hutumia maktaba sawa, lakini kwa matoleo tofauti. Kunaweza kuwa na mgogoro kati yao.

Ili kutatua matatizo haya yote, enzi inayofuata imekuja.

Enzi ya chombo

Wakati Enzi ya Kontena ilipofika, falsafa ya kufanya kazi nao ilibadilika:

  • Mchakato mmoja - chombo kimoja.
  • Tunawasilisha vitegemezi vyote ambavyo mchakato unahitaji kwenye kontena lake. Hii inahitaji kukata monoliths katika microservices.
  • Picha ndogo, ni bora - kuna udhaifu mdogo unaowezekana, inatoka kwa kasi, na kadhalika.
  • Matukio huwa ya muda mfupi.

Unakumbuka nilichosema kuhusu wanyama wa kipenzi dhidi ya ng'ombe? Hapo awali, matukio yalikuwa kama wanyama wa nyumbani, lakini sasa wamekuwa kama ng'ombe. Hapo awali, kulikuwa na monolith - maombi moja. Sasa ni huduma ndogo 100, vyombo 100. Vyombo vingine vinaweza kuwa na nakala 2-3. Inakuwa sio muhimu kwetu kudhibiti kila kontena. Kilicho muhimu zaidi kwetu ni upatikanaji wa huduma yenyewe: seti hii ya vyombo hufanya nini. Hii inabadilisha mbinu za ufuatiliaji.

Mnamo 2014-2015, Docker ilistawi - teknolojia ambayo tutazungumza juu yake sasa.

Docker ilibadilisha falsafa na ufungaji sanifu wa programu. Kwa kutumia Docker, tunaweza kufunga programu, kuituma kwa hazina, kuipakua kutoka hapo, na kuipeleka.

Tunaweka kila kitu tunachohitaji kwenye chombo cha Docker, kwa hivyo tatizo la utegemezi linatatuliwa. Docker inahakikisha uzalishwaji tena. Nadhani watu wengi wamekumbana na kutoweza kuzaliana tena: kila kitu kinakufanyia kazi, unasukuma kwa uzalishaji, na huko huacha kufanya kazi. Na Docker shida hii inaisha. Ikiwa chombo chako cha Docker kitaanza na kufanya kile kinachohitajika kufanya, basi kwa kiwango cha juu cha uwezekano kitaanza katika uzalishaji na kufanya vivyo hivyo huko.

Kichepuo kuhusu juu

Kuna migogoro kila wakati kuhusu overheads. Watu wengine wanaamini kuwa Docker haibebi mzigo wa ziada, kwani hutumia kinu cha Linux na michakato yake yote muhimu kwa uwekaji wa vyombo. Kama, "ikiwa unasema kwamba Docker iko juu, basi kernel ya Linux iko juu."

Kwa upande mwingine, ukienda zaidi, kuna vitu kadhaa kwenye Docker ambavyo, kwa kunyoosha, vinaweza kusemwa kuwa vya juu.

Ya kwanza ni nafasi ya majina ya PID. Tunapoweka mchakato katika nafasi ya majina, inapewa PID 1. Wakati huo huo, mchakato huu una PID nyingine, ambayo iko kwenye nafasi ya majina ya mwenyeji, nje ya chombo. Kwa mfano, tulizindua Nginx kwenye chombo, ikawa PID 1 (mchakato mkuu). Na juu ya mwenyeji ina PID 12623. Na ni vigumu kusema ni kiasi gani cha juu.

Jambo la pili ni Makundi. Wacha tuchukue Vikundi kwa kumbukumbu, ambayo ni, uwezo wa kupunguza kumbukumbu ya chombo. Inapowashwa, vihesabu na uhasibu wa kumbukumbu huwashwa: kernel inahitaji kuelewa ni kurasa ngapi zimetengwa na ni ngapi ambazo bado hazina malipo kwa chombo hiki. Hii labda ni ya ziada, lakini sijaona tafiti zozote sahihi juu ya jinsi inavyoathiri utendaji. Na mimi mwenyewe sikugundua kuwa programu inayoendesha Docker ghafla ilipata hasara kubwa katika utendaji.

Na dokezo moja zaidi kuhusu utendaji. Vigezo vingine vya kernel hupitishwa kutoka kwa mwenyeji hadi kwenye kontena. Hasa, baadhi ya vigezo vya mtandao. Kwa hiyo, ikiwa unataka kuendesha kitu cha juu cha utendaji katika Docker, kwa mfano, kitu ambacho kitatumia kikamilifu mtandao, basi unahitaji angalau kurekebisha vigezo hivi. Baadhi ya nf_conntrack, kwa mfano.

Kuhusu dhana ya Docker

Docker ina vifaa kadhaa:

  1. Docker Daemon ni Injini sawa ya Kontena; inazindua makontena.
  2. Docker CII ni matumizi ya usimamizi wa Docker.
  3. Dockerfile - maagizo ya jinsi ya kuunda picha.
  4. Picha - picha ambayo chombo kinatolewa.
  5. Chombo.
  6. Usajili wa Docker ni hifadhi ya picha.

Kwa utaratibu inaonekana kitu kama hiki:

Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Daemon ya Docker inaendesha kwenye Docker_host na kuzindua vyombo. Kuna Mteja anayetuma amri: jenga picha, pakua picha, uzindua chombo. Daemon ya Docker huenda kwa Usajili na kuitekeleza. Mteja wa Docker anaweza kufikia ndani (kwa soketi ya Unix) na kupitia TCP kutoka kwa seva pangishi ya mbali.

Wacha tupitie kila sehemu.

Daemon ya Docker - hii ni sehemu ya seva, inafanya kazi kwenye mashine ya mwenyeji: kupakua picha na kuzindua vyombo kutoka kwao, huunda mtandao kati ya vyombo, kukusanya magogo. Tunaposema "unda sanamu," pepo anafanya hivyo pia.

Docker CLI - Sehemu ya mteja wa Docker, matumizi ya koni ya kufanya kazi na daemon. Narudia, inaweza kufanya kazi sio tu ndani ya nchi, lakini pia kwenye mtandao.

Amri za msingi:

docker ps - onyesha vyombo ambavyo kwa sasa vinaendeshwa kwenye mwenyeji wa Docker.
picha za docker - onyesha picha zilizopakuliwa ndani ya nchi.
utaftaji wa docker <> - tafuta picha kwenye Usajili.
docker pull <> - pakua picha kutoka kwa Usajili hadi kwa mashine.
ujenzi wa docker < > - kukusanya picha.
docker run <> - zindua chombo.
docker rm <> - ondoa chombo.
kumbukumbu za docker <> - kumbukumbu za chombo
docker start/stop/restart <> - kufanya kazi na chombo

Ikiwa unafahamu amri hizi na unajiamini kuzitumia, fikiria kuwa una ujuzi wa 70% katika Docker katika kiwango cha mtumiaji.

Dockerfile - maagizo ya kuunda picha. Karibu kila amri ya maagizo ni safu mpya. Hebu tuangalie mfano.

Docker ni nini: safari fupi katika historia na vifupisho vya kimsingi

Hivi ndivyo Dockerfile inavyoonekana: amri upande wa kushoto, hoja upande wa kulia. Kila amri ambayo iko hapa (na kwa ujumla iliyoandikwa kwenye Dockerfile) huunda safu mpya kwenye Picha.

Hata ukiangalia upande wa kushoto, unaweza kuelewa kinachotokea. Tunasema: "tutengenezee folda" - hii ni safu moja. "Fanya folda ifanye kazi" ni safu nyingine, na kadhalika. Keki ya safu hurahisisha maisha. Ikiwa nitaunda faili nyingine ya Docker na kubadilisha kitu kwenye mstari wa mwisho - ninaendesha kitu kingine isipokuwa "python" "main.py", au kusakinisha vitegemezi kutoka kwa faili nyingine - basi tabaka zilizopita zitatumika tena kama kache.

Image - hii ni ufungaji wa chombo; vyombo vinazinduliwa kutoka kwa picha. Ikiwa tutaangalia Docker kutoka kwa mtazamo wa msimamizi wa kifurushi (kana kwamba tunafanya kazi na vifurushi vya deb au rpm), basi picha kimsingi ni kifurushi cha rpm. Kupitia yum install tunaweza kusakinisha programu, kuifuta, kuipata kwenye hifadhi, na kuipakua. Ni sawa hapa: vyombo vinazinduliwa kutoka kwa picha, vinahifadhiwa kwenye Usajili wa Docker (sawa na yum, kwenye hifadhi), na kila picha ina SHA-256 hash, jina na tag.

Picha imeundwa kulingana na maagizo kutoka kwa Dockerfile. Kila maagizo kutoka kwa Dockerfile huunda safu mpya. Tabaka zinaweza kutumika tena.

Usajili wa Docker ni hazina ya picha ya Docker. Sawa na OS, Docker ina usajili wa kawaida wa umma - dockerhub. Lakini unaweza kujenga hazina yako mwenyewe, usajili wako wa Docker.

Chombo - ni nini kilichozinduliwa kutoka kwa picha. Tulijenga picha kulingana na maagizo kutoka kwa Dockerfile, kisha tunazindua kutoka kwa picha hii. Chombo hiki kimetengwa na vyombo vingine na lazima kiwe na kila kitu muhimu ili programu kufanya kazi. Katika kesi hii, chombo kimoja - mchakato mmoja. Inatokea kwamba lazima ufanye michakato miwili, lakini hii ni kinyume na itikadi ya Docker.

Mahitaji ya "chombo kimoja, mchakato mmoja" yanahusiana na Nafasi ya Jina ya PID. Wakati mchakato na PID 1 unapoanza katika Namespace, ikiwa itafa ghafla, basi chombo kizima kinakufa pia. Ikiwa michakato miwili inaendesha huko: moja iko hai na nyingine imekufa, basi chombo bado kitaendelea kuishi. Lakini hili ni swali la Mazoezi Bora, tutazungumza juu yao katika nyenzo zingine.

Ili kusoma huduma na programu kamili ya kozi hiyo kwa undani zaidi, tafadhali fuata kiunga: "Kozi ya video ya Docker'.

Mwandishi: Marcel Ibraev, msimamizi aliyeidhinishwa wa Kubernetes, mhandisi anayefanya mazoezi huko Southbridge, spika na msanidi wa kozi za Slurm.

Chanzo: mapenzi.com

Kuongeza maoni