VM o Docker?

Paano mo malalaman kung kailangan mo ng Docker at hindi isang VM? Kailangan mong matukoy kung ano ang eksaktong gusto mong ihiwalay. Kung gusto mong ihiwalay ang isang system na may garantisadong nakalaang mga mapagkukunan at virtual na hardware, kung gayon ang pagpipilian ay dapat na isang VM. Kung kailangan mong ihiwalay ang mga tumatakbong application bilang hiwalay na mga proseso ng system, kakailanganin mo ang Docker.

Kaya ano ang pagkakaiba sa pagitan ng mga lalagyan ng Docker at mga VM?

Virtual machine (VM) ay isang virtual na computer na may lahat ng virtual na device at isang virtual na hard disk kung saan naka-install ang isang bagong independiyenteng OS kasama ng mga driver ng virtual device, pamamahala ng memorya at iba pang mga bahagi. Ibig sabihin, nakakakuha kami ng abstraction ng pisikal na hardware na nagpapahintulot sa amin na magpatakbo ng maraming virtual na computer sa isang computer.
Ang isang naka-install na VM ay maaaring tumagal ng espasyo sa disk ng iyong computer sa iba't ibang paraan:

  • fixed hard disk space, na nagbibigay-daan sa mas mabilis na pag-access sa virtual hard disk at iniiwasan ang pagkapira-piraso ng file;
  • dynamic na paglalaan ng memorya. Kapag nag-i-install ng mga karagdagang application, dynamic na ilalaan ang memorya para sa kanila hanggang sa maabot nito ang maximum na halagang nakalaan dito.

Ang mas maraming virtual machine sa bawat server, mas maraming espasyo ang kinukuha nila, at nangangailangan din ng patuloy na suporta para sa kapaligiran na kinakailangan para tumakbo ang iyong application.

Manggagawa sa pantalan ay software para sa paglikha ng mga application na nakabatay sa lalagyan. Ang mga container at virtual machine ay may magkatulad na benepisyo, ngunit iba ang pagpapatakbo. Ang mga container ay kumukuha ng mas kaunting espasyo dahil... muling gumamit ng mas maraming nakabahaging mapagkukunan ng host system kaysa sa VM, dahil hindi tulad ng VM, nagbibigay ito ng virtualization sa antas ng OS, hindi sa antas ng hardware. Ang diskarte na ito ay nagreresulta sa mas mababang memory footprint, mas mabilis na pag-deploy, at mas madaling pag-scale.

Nagbibigay ang container ng mas mahusay na mekanismo para sa pag-encapsulate ng mga application sa pamamagitan ng pagbibigay ng mga kinakailangang interface sa host system. Ang feature na ito ay nagbibigay-daan sa mga container na ibahagi ang core ng system, na ang bawat container ay tumatakbo bilang isang hiwalay na proseso ng host OS na may sarili nitong hanay ng mga memory area (sariling virtual address space). Dahil ang virtual address space ng bawat container ay sarili nitong, ang data na kabilang sa iba't ibang memory area ay hindi mababago.
Ang katutubong OS para sa Docker ay Linux (Maaari ding gamitin ang Docker sa Windows at MacOS), ginagamit nito ang mga pangunahing bentahe nito, na nagbibigay-daan dito upang ayusin ang paghihiwalay ng kernel. Ang pagpapatakbo ng mga container ng Docker sa Windows ay magaganap sa loob ng isang virtual machine na nagpapatakbo ng Linux OS, dahil ibinabahagi ng mga lalagyan ang OS ng host system at ang pangunahing OS para sa kanila ay Linux.

Lalagyan - paano ito gumagana?

Lalagyan ay isang abstraction sa antas ng aplikasyon na pinagsasama ang code at mga dependency. Palaging ginagawa ang mga lalagyan mula sa mga larawan, nagdaragdag ng nasusulat na tuktok na layer at nagpapasimula ng iba't ibang mga parameter. Dahil ang isang container ay may sarili nitong write layer at lahat ng pagbabago ay naka-store sa layer na iyon, maraming container ang maaaring magbahagi ng access sa parehong master image.

Ang bawat lalagyan ay maaaring i-configure sa pamamagitan ng isang file sa proyekto ng docker-compose na kasama sa pangunahing solusyon - docker-compose.yml. Doon maaari kang magtakda ng iba't ibang mga parameter tulad ng pangalan ng container, mga port, mga identifier, mga limitasyon ng mapagkukunan, mga dependency sa pagitan ng iba pang mga container. Kung hindi ka tumukoy ng pangalan ng container sa mga setting, gagawa ang Docker ng bagong container sa bawat pagkakataon, na bibigyan ito ng pangalan nang random.

Kapag nagsimula ang isang lalagyan mula sa isang imahe, inilalagay ng Docker ang isang read-write na filesystem sa ibabaw ng anumang mga layer sa ibaba. Dito tatakbo ang lahat ng prosesong gusto naming patakbuhin ng aming Docker container.

Noong unang nagsimula ng container ang Docker, walang laman ang paunang read-write layer. Kapag naganap ang mga pagbabago, inilalapat ang mga ito sa layer na ito; halimbawa, kung gusto mong baguhin ang isang file, ang file na iyon ay makokopya mula sa read-only na layer sa ibaba hanggang sa read-write na layer.
Iiral pa rin ang read-only na bersyon ng file, ngunit nakatago na ito ngayon sa ilalim ng kopya. Ginagamit ang mga volume upang mag-imbak ng data, anuman ang cycle ng buhay ng container. Sinisimulan ang mga volume kapag ginawa ang container.

Paano nauugnay ang larawan sa lalagyan?

Larawan β€” ang pangunahing elemento para sa bawat lalagyan. Ang imahe ay nilikha mula sa isang Dockerfile na idinagdag sa proyekto at isang set ng mga file system (mga layer) na naka-layer sa ibabaw ng bawat isa at pinagsama-sama, read-only; ang maximum na bilang ng mga layer ay 127.

Sa gitna ng bawat imahe ay isang base na imahe, na tinukoy ng FROM command - ang entry point kapag binubuo ang Dockerfile na imahe. Ang bawat layer ay isang readonly na layer at kinakatawan ng isang command na nagbabago sa file system, na nakasulat sa isang Dockerfile.
Upang pagsamahin ang mga layer na ito sa iisang larawan, ginagamit ng Docker ang Advanced multi layered Union file system (Ang AuFS ay binuo sa ibabaw ng UnionFS), na nagpapahintulot sa iba't ibang mga file at direktoryo mula sa iba't ibang mga layer ng file na maging malinaw na na-overlay, na lumilikha ng isang cohesive na file system.

Ang mga layer ay naglalaman ng metadata na nagbibigay-daan sa iyong mag-imbak ng nauugnay na impormasyon tungkol sa bawat layer sa panahon ng runtime at oras ng pagbuo. Ang bawat layer ay naglalaman ng isang link sa susunod na layer; kung ang isang layer ay walang link, kung gayon ito ang pinakamataas na layer sa imahe.

Ang Dockerfile ay maaaring maglaman ng mga utos tulad ng:

  • FROM β€” entry point kapag bumubuo ng isang imahe;
  • MAINTAINER - pangalan ng may-ari ng imahe;
  • RUN - pagpapatupad ng utos sa panahon ng pagpupulong ng imahe;
  • ADD - pagkopya ng host file sa isang bagong imahe; kung tinukoy mo ang URL ng file, ida-download ito ng Docker sa tinukoy na direktoryo;
  • ENV - mga variable ng kapaligiran;
  • CMD - nagsisimula sa paglikha ng isang bagong lalagyan batay sa imahe;
  • ENTRYPOINT - ang utos ay isinasagawa kapag nagsimula ang lalagyan.
  • Ang WORKDIR ay ang gumaganang direktoryo para sa pagpapatupad ng CMD command.
  • USER - itinatakda ang UID para sa lalagyang ginawa batay sa larawan.
  • VOLUME - ini-mount ang direktoryo ng host sa lalagyan.
  • Ang EXPOSE ay isang set ng mga port na pinakinggan sa container.

Paano gumagana ang UnionFS?

UnionFS - utility stack file system (FS) para sa Linux at FreeBSD. Ang FS na ito ay nagpapatupad ng isang copy-on-write na mekanismo (Copy-On-Write, COW). Ang working unit ng UnionFS ay isang layer; ang bawat layer ay dapat isaalang-alang bilang isang hiwalay na ganap na file system na may hierarchy ng mga direktoryo mula sa mismong ugat. Lumilikha ang UnionFS ng union mount para sa iba pang mga file system at pinapayagan ang mga file at direktoryo mula sa iba't ibang file system (tinatawag na mga forks) na pagsamahin sa isang magkakaugnay na file system, nang malinaw sa user.

Ang mga nilalaman ng mga direktoryo na may parehong mga landas ay lilitaw nang magkasama sa isang pinag-isang direktoryo (sa isang solong namespace) ng resultang file system.

Pinagsasama ng UnionFS ang mga layer batay sa mga sumusunod na prinsipyo:

  • ang isa sa mga layer ay nagiging top-level na layer, ang pangalawa at kasunod na mga layer ay nagiging lower-level na mga layer;
  • ang mga layer na bagay ay magagamit sa gumagamit "mula sa itaas hanggang sa ibaba", i.e. kung ang hiniling na bagay ay nasa "itaas" na layer, ito ay ibinalik, anuman ang pagkakaroon ng isang bagay na may parehong pangalan sa "ibaba" na layer; kung hindi man ang bagay ng "ibaba" na layer ay ibinalik; kung ang hiniling na bagay ay wala doon o doon, ang error na "Walang ganoong file o direktoryo" ay ibinalik;
  • ang gumaganang layer ay ang "nangungunang", ibig sabihin, ang lahat ng pagkilos ng user upang baguhin ang data ay makikita lamang sa top-level na layer, nang hindi naaapektuhan ang mga nilalaman ng mga layer ng mas mababang antas.

Ang Docker ay ang pinakakaraniwang teknolohiya para sa paggamit ng mga container para magpatakbo ng mga application. Ito ay naging pamantayan sa larangan, na binuo sa mga cgroup at namespace na ibinigay ng Linux kernel.

Binibigyang-daan kami ng Docker na mabilis na mag-deploy ng mga application at gawin ang pinakamahusay na paggamit ng file system sa pamamagitan ng paghahati ng OS kernel sa lahat ng mga container, na tumatakbo bilang hiwalay na mga proseso ng OS.

Pinagmulan: www.habr.com

Magdagdag ng komento