Pag-unawa sa Docker

Ilang buwan na akong gumagamit ng Docker para ayusin ang proseso ng pagbuo/paghahatid ng mga proyekto sa web. Nag-aalok ako sa mga mambabasa ng Habrakhabr ng pagsasalin ng panimulang artikulo tungkol sa docker - "Pag-unawa sa docker".

Ano ang docker?

Ang Docker ay isang bukas na platform para sa pagbuo, paghahatid, at pagpapatakbo ng mga application. Ang Docker ay idinisenyo upang maihatid ang iyong mga application nang mas mabilis. Sa docker, maaari mong ihiwalay ang iyong aplikasyon mula sa iyong imprastraktura at ituring ang imprastraktura bilang isang pinamamahalaang aplikasyon. Tinutulungan ka ng Docker na ipadala ang iyong code nang mas mabilis, subukan ang mas mabilis, ipadala ang mga application nang mas mabilis, at bawasan ang oras sa pagitan ng pagsulat ng code at pagpapatakbo ng code. Ginagawa ito ng Docker sa pamamagitan ng isang magaan na platform ng virtualization ng container, gamit ang mga proseso at utility na tumutulong sa iyong pamahalaan at i-host ang iyong mga application.

Sa kaibuturan nito, pinapayagan ka ng docker na magpatakbo ng halos anumang application, na ligtas na nakahiwalay sa isang lalagyan. Nagbibigay-daan sa iyo ang secure na paghihiwalay na magpatakbo ng maraming container sa parehong host sa parehong oras. Ang magaan na katangian ng lalagyan, na tumatakbo nang walang karagdagang pasanin ng isang hypervisor, ay nagbibigay-daan sa iyong masulit ang iyong hardware.

Ang platform at mga tool sa virtualization ng container ay maaaring maging kapaki-pakinabang sa mga sumusunod na kaso:

  • i-package ang iyong application (at ang mga bahaging ginagamit mo) sa mga lalagyan ng docker;
  • pamamahagi at paghahatid ng mga lalagyang ito sa iyong mga koponan para sa pagpapaunlad at pagsubok;
  • paglalagay ng mga container na ito sa iyong mga production site, sa mga data center at sa cloud.

Ano ang magagamit ko sa docker?

Mabilis na i-publish ang iyong mga application

Ang Docker ay mahusay para sa pag-aayos ng cycle ng pag-unlad. Pinapayagan ng Docker ang mga developer na magpatakbo ng mga lokal na container na may mga application at serbisyo. Na sa dakong huli ay nagbibigay-daan sa iyong isama sa proseso ng tuluy-tuloy na pagsasama at daloy ng trabaho sa pag-deploy.

Halimbawa, lokal na nagsusulat ng code ang iyong mga developer at ibinabahagi ang kanilang development stack (isang hanay ng mga larawan ng Docker) sa mga kasamahan. Kapag handa na sila, itinutulak nila ang code at mga lalagyan sa site ng pagsubok at nagpapatakbo ng anumang kinakailangang pagsubok. Mula sa site ng pagsubok, maaari silang magpadala ng code at mga larawan sa produksyon.

Mas madaling paglalatag at paglalahad

Pinapadali ng docker container-based na platform na i-port ang iyong payload. Ang mga docker container ay maaaring tumakbo sa iyong lokal na makina, alinman sa tunay o sa isang virtual machine sa isang data center, o sa cloud.

Ang portability at magaan na katangian ng docker ay ginagawang madali upang dynamic na pamahalaan ang iyong workload. Maaari mong gamitin ang docker upang i-deploy o i-shutdown ang iyong application o mga serbisyo. Binibigyang-daan ito ng bilis ng docker na gawin ito nang malapit sa real time.

Mas mataas na load at mas maraming payload

Ang Docker ay magaan at mabilis. Nagbibigay ito ng nababanat, cost-effective na alternatibo sa hypervisor-based virtual machine. Ito ay lalong kapaki-pakinabang sa mga kapaligirang may mataas na load, halimbawa, kapag gumagawa ng sarili mong cloud o platform-as-service. Ngunit ito ay kapaki-pakinabang din para sa maliliit at katamtamang laki ng mga application kapag gusto mong masulit ang mga mapagkukunan na mayroon ka.

Pangunahing Mga Bahagi ng Docker

Ang Docker ay binubuo ng dalawang pangunahing bahagi:

  • Docker: isang open source virtualization platform;
  • Docker Hub: Ang aming platform-as-a-service para sa pamamahagi at pamamahala ng mga container ng Docker.

Tandaan! Ang Docker ay ipinamahagi sa ilalim ng lisensya ng Apache 2.0.

Arkitektura ng Docker

Gumagamit ang Docker ng arkitektura ng client-server. Nakikipag-ugnayan ang kliyente ng Docker sa Docker daemon, na siyang umaako sa paggawa, pagpapatakbo, at pamamahagi ng iyong mga container. Parehong client at server ay maaaring tumakbo sa parehong sistema, maaari mong ikonekta ang kliyente sa isang remote docker daemon. Ang kliyente at server ay nakikipag-usap sa pamamagitan ng isang socket o isang RESTful API.

Pag-unawa sa Docker

Docker daemon

Gaya ng ipinapakita sa diagram, ang daemon ay tumatakbo sa host machine. Ang user ay hindi direktang nakikipag-ugnayan sa server, ngunit ginagamit ang kliyente para dito.

Kliyente ng Docker

Ang Docker client, ang docker program, ay ang pangunahing interface sa Docker. Tumatanggap ito ng mga utos mula sa user at nakikipag-ugnayan sa docker daemon.

Sa loob ng pantalan

Upang maunawaan kung ano ang binubuo ng docker, kailangan mong malaman ang tungkol sa tatlong bahagi:

  • mga larawan
  • pagpapatala
  • Lalagyan

Mga Larawan

Ang imahe ng Docker ay isang read-only na template. Halimbawa, ang imahe ay maaaring maglaman ng Ubuntu operating system na may Apache at isang application dito. Ang mga imahe ay ginagamit upang lumikha ng mga lalagyan. Pinapadali ng Docker na lumikha ng mga bagong larawan, i-update ang mga dati nang larawan, o maaari kang mag-download ng mga larawang ginawa ng ibang tao. Ang mga larawan ay mga bahagi ng isang docker build.

Magparehistro

Ang Docker registry ay nag-iimbak ng mga larawan. May mga pampubliko at pribadong rehistro kung saan maaari kang mag-download o mag-upload ng mga larawan. Ang isang pampublikong pagpapatala ng Docker ay Docker hub. Mayroong isang malaking koleksyon ng mga imahe na nakaimbak doon. Tulad ng alam mo, ang mga larawan ay maaari mong likhain o maaari mong gamitin ang mga larawang ginawa ng iba. Ang mga rehistro ay isang bahagi ng pamamahagi.

Mga lalagyan

Ang mga lalagyan ay katulad ng mga direktoryo. Ang mga container ay naglalaman ng lahat ng kailangan ng application para tumakbo. Ang bawat lalagyan ay nilikha mula sa isang imahe. Maaaring gawin, simulan, ihinto, i-migrate o tanggalin ang mga container. Ang bawat container ay nakahiwalay at nagbibigay ng secure na platform para sa application. Ang mga lalagyan ay mga bahagi ng gawain.

Kaya paano gumagana ang Docker?

Sa ngayon alam natin na:

  • maaari kaming lumikha ng mga imahe kung saan matatagpuan ang aming mga application;
  • maaari tayong lumikha ng mga lalagyan mula sa mga larawan upang magpatakbo ng mga application;
  • Maaari naming ipamahagi ang mga larawan sa pamamagitan ng Docker Hub o isa pang rehistro ng larawan.

Tingnan natin kung paano magkatugma ang mga sangkap na ito.

Paano gumagana ang imahe?

Alam na namin na ang isang imahe ay isang read-only na template kung saan nilikha ang isang lalagyan. Ang bawat larawan ay binubuo ng isang hanay ng mga antas. Ginagamit ng Docker sistema ng file ng unyon upang pagsamahin ang mga antas na ito sa isang larawan. Ang Union file system ay nagpapahintulot sa mga file at direktoryo mula sa iba't ibang file system (iba't ibang sangay) na mag-overlap nang malinaw, na lumilikha ng magkakaugnay na file system.

Isa sa mga dahilan kung bakit magaan ang docker ay dahil gumagamit ito ng mga layer na tulad nito. Kapag binago mo ang imahe, tulad ng pag-update ng isang application, isang bagong layer ang gagawin. Kaya, nang hindi pinapalitan ang buong imahe o muling itayo ito, tulad ng maaaring kailanganin mong gawin sa isang virtual machine, ang layer lamang ang idinaragdag o ina-update. At hindi mo kailangang ipamahagi ang buong bagong larawan, ang pag-update lamang ang ipinamamahagi, na ginagawang mas madali at mas mabilis ang pamamahagi ng mga larawan.

Sa puso ng bawat larawan ay isang batayang larawan. Halimbawa, ang ubuntu, ang batayang imahe ng Ubuntu, o fedora, ang batayang larawan ng pamamahagi ng Fedora. Maaari mo ring gamitin ang mga imahe bilang batayan para sa paglikha ng mga bagong larawan. Halimbawa, kung mayroon kang isang apache na imahe, maaari mo itong gamitin bilang isang batayang larawan para sa iyong mga web application.

Tandaan! Karaniwang kinukuha ng Docker ang mga larawan mula sa registry ng Docker Hub.

Maaaring malikha ang mga imahe ng Docker mula sa mga batayang larawang ito; tinatawag namin ang mga hakbang upang gawin ang mga tagubiling ito ng mga larawan. Ang bawat pagtuturo ay lumilikha ng isang bagong imahe o antas. Ang mga tagubilin ay ang mga sumusunod:

  • run command
  • pagdaragdag ng file o direktoryo
  • paglikha ng variable ng kapaligiran
  • mga tagubilin sa kung ano ang tatakbo kapag inilunsad ang lalagyan ng larawang ito

Ang mga tagubiling ito ay naka-imbak sa isang file Dockerfile. Binabasa ito ng Docker Dockerfile, kapag binuo mo ang imahe, isasagawa ang mga tagubiling ito at ibabalik ang huling larawan.

Paano gumagana ang docker registry?

Ang registry ay isang repository para sa mga docker na imahe. Kapag nalikha na ang larawan, maaari mo itong i-publish sa pampublikong rehistro ng Docker Hub o sa iyong personal na rehistro.

Gamit ang docker client, maaari kang maghanap ng mga na-publish na larawan at i-download ang mga ito sa iyong docker machine para gumawa ng mga container.

Nagbibigay ang Docker Hub ng mga pampubliko at pribadong imbakan ng imahe. Ang paghahanap at pag-download ng mga larawan mula sa mga pampublikong repositoryo ay available sa lahat. Ang mga nilalaman ng mga pribadong imbakan ay hindi kasama sa mga resulta ng paghahanap. At ikaw lang at ang iyong mga user ang makakatanggap ng mga larawang ito at makakagawa ng mga lalagyan mula sa kanila.

Paano gumagana ang isang lalagyan?

Ang isang lalagyan ay binubuo ng isang operating system, mga file ng user, at metadata. Tulad ng alam natin, ang bawat lalagyan ay nilikha mula sa isang imahe. Sinasabi ng larawang ito sa docker kung ano ang nasa container, kung anong proseso ang sisimulan, kung kailan magsisimula ang container, at iba pang data ng configuration. Ang imahe ng Docker ay read-only. Kapag nagsimula ang docker ng isang lalagyan, lumilikha ito ng read/write layer sa ibabaw ng imahe (gamit ang unyon file system gaya ng nakasaad dati) kung saan maaaring patakbuhin ang application.

Ano ang mangyayari kapag nagsimula ang lalagyan?

O gamit ang programa docker, o gamit ang RESTful API, sasabihin ng docker client sa docker daemon na simulan ang container.

$ sudo docker run -i -t ubuntu /bin/bash

Tingnan natin ang utos na ito. Ang kliyente ay inilunsad gamit ang command docker, na may opsyon run, na nagsasabing may ilulunsad na bagong container. Ang mga minimum na kinakailangan para magpatakbo ng container ay ang mga sumusunod na katangian:

  • aling larawan ang gagamitin para gawin ang lalagyan. Sa kaso natin ubuntu
  • ang utos na gusto mong patakbuhin kapag sinimulan ang lalagyan. Sa kaso natin /bin/bash

Ano ang mangyayari sa ilalim ng hood kapag pinapatakbo namin ang utos na ito?

Ginagawa ng Docker, sa pagkakasunud-sunod, ang mga sumusunod:

  • dina-download ang imahe ng ubuntu: sinusuri ng docker ang pagkakaroon ng larawan ubuntu sa lokal na makina, at kung wala ito, pagkatapos ay i-download ito mula sa Docker hub. Kung mayroong isang imahe, ginagamit ito upang lumikha ng isang lalagyan;
  • lumilikha ng lalagyan: kapag natanggap ang imahe, ginagamit ito ng docker upang lumikha ng isang lalagyan;
  • sinisimulan ang filesystem at ini-mount ang read-only na antas: ang lalagyan ay nilikha sa file system at ang imahe ay idinagdag sa read-only na antas;
  • sinisimulan ang network/tulay: lumilikha ng interface ng network na nagpapahintulot sa docker na makipag-ugnayan sa host machine;
  • Pagtatakda ng IP address: hinahanap at itinatakda ang address;
  • Magsisimula sa tinukoy na proseso: inilulunsad ang iyong aplikasyon;
  • Nagproseso at gumagawa ng output mula sa iyong aplikasyon: nagkokonekta at nagla-log sa karaniwang input, output, at stream ng error ng iyong application upang masubaybayan mo kung paano gumaganap ang iyong application.

Mayroon ka na ngayong gumaganang lalagyan. Maaari mong pamahalaan ang iyong container, makipag-ugnayan sa iyong application. Kapag nagpasya kang ihinto ang application, tanggalin ang container.

Mga teknolohiyang ginamit

Ang Docker ay nakasulat sa Go at gumagamit ng ilang feature ng Linux kernel para ipatupad ang functionality sa itaas.

Mga namespace

Gumagamit ng teknolohiya ang Docker namespaces upang ayusin ang mga nakahiwalay na workspace, na tinatawag naming mga container. Kapag nagsimula kami ng container, gagawa ang docker ng set ng mga namespace para sa container na iyon.

Lumilikha ito ng nakahiwalay na layer, na ang bawat aspeto ng container ay tumatakbo sa sarili nitong namespace at walang access sa external na system.

Listahan ng ilang namespace na ginagamit ng docker:

  • pid: upang ihiwalay ang proseso;
  • net: para sa pamamahala ng mga interface ng network;
  • ipc: upang pamahalaan ang mga mapagkukunan ng IPC. (ICP: InterProccess Communication);
  • mnt: upang pamahalaan ang mga mount point;
  • utc: upang ihiwalay ang kernel at kontrolin ang pagbuo ng bersyon (UTC: Unix timesharing system).

Mga pangkat ng kontrol

Gumagamit din ang Docker ng teknolohiya cgroups o control group. Ang susi sa pagpapatakbo ng isang application sa paghihiwalay ay upang bigyan ang application ng mga mapagkukunan lamang na gusto mong ibigay. Tinitiyak nito na ang mga lalagyan ay magiging mabuting kapitbahay. Nagbibigay-daan sa iyo ang mga control group na magbahagi ng mga available na mapagkukunan ng hardware at, kung kinakailangan, magtakda ng mga limitasyon at paghihigpit. Halimbawa, limitahan ang posibleng dami ng memorya para sa lalagyan.

Union File System

Ang Union File Sysem o UnionFS ay isang file system na gumagana sa pamamagitan ng paggawa ng mga layer, ginagawa itong napakagaan at mabilis. Gumagamit ang Docker ng UnionFS upang likhain ang mga bloke kung saan binuo ang lalagyan. Maaaring gumamit ang Docker ng ilang variant ng UnionFS kabilang ang: AUFS, btrfs, vfs at DeviceMapper.

Mga Format ng Lalagyan

Pinagsasama ng Docker ang mga bahaging ito sa isang wrapper na tinatawag naming format ng lalagyan. Ang default na format ay tinatawag libcontainer. Sinusuportahan din ng Docker ang tradisyonal na format ng lalagyan sa Linux gamit LXC. Sa hinaharap, maaaring suportahan ng Docker ang iba pang mga format ng container. Halimbawa, ang pagsasama sa BSD Jails o Solaris Zones.

Pinagmulan: www.habr.com

Magdagdag ng komento