{"id":91905,"date":"2020-08-20T07:42:23","date_gmt":"2020-08-20T05:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii"},"modified":"2020-08-20T07:42:23","modified_gmt":"2020-08-20T05:42:23","slug":"chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","title":{"rendered":"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>10 sierpnia w S\u0142urmie rozpocz\u0105\u0142 si\u0119 <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">kurs wideo dotycz\u0105cy Dockera<\/a><\/noindex>, w kt\u00f3rym omawiamy go w ca\u0142o\u015bci \u2014 od podstawowych abstrakcji po parametry sieciowe. <\/p>\n<p><\/p>\n<p>W tym artykule om\u00f3wimy histori\u0119 pojawienia si\u0119 Dockera i jego podstawowe abstrakcje: Image, Cli, Dockerfile. Wyk\u0142ad jest przeznaczony dla nowicjuszy, wi\u0119c raczej nie b\u0119dzie interesuj\u0105cy dla do\u015bwiadczonych u\u017cytkownik\u00f3w. Nie b\u0119dzie tu krwi, wyrostka i g\u0142\u0119bokiego zag\u0142\u0119bienia. Same podstawy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje\" src=\"\/wp-content\/uploads\/2020\/08\/f01af417f24c838577b09bdf90f02fb9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"chto-takoe-docker\">Czym jest Docker<\/h2>\n<p><\/p>\n<p>Sp\u00f3jrzmy na definicj\u0119 Dockera z Wikipedii.<\/p>\n<p><\/p>\n<blockquote><p>Docker to oprogramowanie do automatyzacji wdra\u017cania i zarz\u0105dzania aplikacjami w \u015brodowiskach wspieraj\u0105cych konteneryzacj\u0119.<\/p><\/blockquote>\n<p>Z tej definicji nic nie wynika. Szczeg\u00f3lnie niejasne jest, co oznacza \u201ew \u015brodowiskach wspieraj\u0105cych konteneryzacj\u0119\u201d. Aby to zrozumie\u0107, wr\u00f3\u0107my do przesz\u0142o\u015bci. Zacznijmy od epoki, kt\u00f3r\u0105 nazywam \u201eEpok\u0105 monolit\u00f3w\u201d.<\/p>\n<p><\/p>\n<h2 id=\"monolitnaya-era\">Epoka monolit\u00f3w<\/h2>\n<p><\/p>\n<p>Epoka monolit\u00f3w to pocz\u0105tek lat 2000, kiedy wszystkie aplikacje by\u0142y monolityczne, z mn\u00f3stwem zale\u017cno\u015bci. Proces rozwoju trwa\u0142 d\u0142ugo. Serwer\u00f3w nie by\u0142o zbyt du\u017co, wszyscy znali\u015bmy je po imieniu i monitorowali\u015bmy. Istnieje zabawne por\u00f3wnanie:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"Od7e6hqis7A\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/Od7e6hqis7A\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Pets \u2014 to zwierz\u0119ta domowe. W epoce monolit\u00f3w odnosili\u015bmy si\u0119 do naszych serwer\u00f3w jak do zwierz\u0105t domowych, piel\u0119gnowali\u015bmy je, dbali\u015bmy o nie, zdmuchiwali\u015bmy kurz. A aby lepiej zarz\u0105dza\u0107 zasobami, u\u017cywali\u015bmy wirtualizacji: brali\u015bmy serwer i dzielili\u015bmy go na kilka maszyn wirtualnych, zapewniaj\u0105c tym samym izolacj\u0119 \u015brodowiska.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-baze-gipervizora\">Systemy wirtualizacji oparte na hipernadzorze<\/h2>\n<p><\/p>\n<p>O systemach wirtualizacji zapewne wszyscy s\u0142yszeli: VMware, VirtualBox, Hyper-V, Qemu KVM itd. Zapewniaj\u0105 one izolacj\u0119 aplikacji i zarz\u0105dzanie zasobami, ale maj\u0105 te\u017c swoje wady. Aby uzyska\u0107 wirtualizacj\u0119, potrzebny jest hipernadzorca. A hipernadzorca to nadmiar zasob\u00f3w. Poza tym sama maszyna wirtualna zazwyczaj jest du\u017cym bytem \u2014 ci\u0119\u017cki obraz, na kt\u00f3rym znajduje si\u0119 system operacyjny, Nginx, Apache, a by\u0107 mo\u017ce i MySQL. Obraz jest du\u017cy, trudno operowa\u0107 maszyn\u0105 wirtualn\u0105. W konsekwencji praca z wirtualkami mo\u017ce by\u0107 wolna. Aby rozwi\u0105za\u0107 ten problem, stworzono systemy wirtualizacji na poziomie j\u0105dra.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-urovne-yadra\">Systemy wirtualizacji na poziomie j\u0105dra<\/h2>\n<p><\/p>\n<p>Wirtualizacj\u0119 na poziomie j\u0105dra wspieraj\u0105 systemy OpenVZ, Systemd-nspawn, LXC. Jaskrawym przyk\u0142adem takiej wirtualizacji s\u0105 LXC (Linux Containers). <\/p>\n<p><\/p>\n<p>LXC \u2014 system wirtualizacji na poziomie systemu operacyjnego, kt\u00f3ry umo\u017cliwia uruchamianie wielu izolowanych instancji systemu operacyjnego Linux na jednym w\u0119\u017ale. LXC nie korzysta z maszyn wirtualnych, lecz tworzy \u015brodowisko wirtualne z w\u0142asn\u0105 przestrzeni\u0105 proces\u00f3w i stosu sieciowego.<\/p>\n<p><\/p>\n<p>W zasadzie LXC tworzy kontenery. Jaka jest r\u00f3\u017cnica mi\u0119dzy maszynami wirtualnymi a kontenerami?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje\" src=\"\/wp-content\/uploads\/2020\/08\/55afdcfd700d4869c9de488033a8e314.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kontener nie nadaje si\u0119 do izolowania proces\u00f3w: w systemach wirtualizacji na poziomie j\u0105dra odkrywane s\u0105 luki, kt\u00f3re pozwalaj\u0105 na wydostanie si\u0119 z kontenera na ho\u015bcie. Dlatego je\u015bli chcesz co\u015b izolowa\u0107, lepiej u\u017cy\u0107 maszyny wirtualnej.<\/p>\n<p><\/p>\n<p>R\u00f3\u017cnice mi\u0119dzy wirtualizacj\u0105 a konteneryzacj\u0105 mo\u017cna zobaczy\u0107 na schemacie.<br \/>\nS\u0105 hyperwizory sprz\u0119towe, hyperwizory nad systemem operacyjnym i kontenery. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje\" src=\"\/wp-content\/uploads\/2020\/08\/a0c06e9adc1fab3b4b5e9e1b05b51d66.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00abSprz\u0119towe\u00bb hyperwizory to \u015bwietne narz\u0119dzie, je\u015bli naprawd\u0119 chcesz co\u015b izolowa\u0107. Poniewa\u017c istnieje mo\u017cliwo\u015b\u0107 izolowania na poziomie stron pami\u0119ci i procesor\u00f3w.<\/p>\n<p><\/p>\n<p>S\u0105 hyperwizory jako programy, a s\u0105 kontenery, o kt\u00f3rych b\u0119dziemy m\u00f3wi\u0107 dalej. W systemach konteneryzacji nie ma hyperwizora, ale jest Container Engine, kt\u00f3ry tworzy kontenery i zarz\u0105dza nimi. Jest to l\u017cejsze rozwi\u0105zanie, dlatego dzi\u0119ki pracy z j\u0105drem overhead jest mniejszy lub wr\u0119cz nie wyst\u0119puje.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"chto-ispolzuetsya-dlya-konteynerizacii-na-urovne-yadra\">Co jest u\u017cywane do konteneryzacji na poziomie j\u0105dra<\/h2>\n<p>Podstawowe technologie, kt\u00f3re umo\u017cliwiaj\u0105 tworzenie kontener\u00f3w izolowanych od innych proces\u00f3w, to Namespaces i Control Groups.<\/p>\n<p>Namespaces: PID, Networking, Mount i User. Jest ich wi\u0119cej, ale dla uproszczenia zatrzymamy si\u0119 na tych.<\/p>\n<p>Namespace PID ogranicza procesy. Gdy na przyk\u0142ad tworzymy namespace PID i umieszczamy w nim proces, staje si\u0119 on PID 1. Zwykle w systemach PID 1 to systemd lub init. Odpowiednio, kiedy umieszczamy proces w nowym namespace, r\u00f3wnie\u017c otrzymuje PID 1.<\/p>\n<p>Networking Namespace pozwala na ograniczenie\/izolacj\u0119 sieci i wewn\u0105trz ju\u017c umieszczanie w\u0142asnych interfejs\u00f3w. Mount to ograniczenie w systemie plik\u00f3w. User to ograniczenie dotycz\u0105ce u\u017cytkownik\u00f3w.<\/p>\n<p>Control Groups: Pami\u0119\u0107, CPU, IOPS, Sie\u0107 \u2014 \u0142\u0105cznie oko\u0142o 12 ustawie\u0144. Inaczej nazywane Cgroups (C grupy).<\/p>\n<p>Control Groups zarz\u0105dzaj\u0105 zasobami dla kontenera. Dzi\u0119ki Control Groups mo\u017cemy powiedzie\u0107, \u017ce kontener nie powinien zu\u017cywa\u0107 wi\u0119cej ni\u017c okre\u015blon\u0105 ilo\u015b\u0107 zasob\u00f3w.<\/p>\n<p>Aby konteneryzacja mog\u0142a dzia\u0142a\u0107 w pe\u0142ni, wykorzystuje si\u0119 dodatkowe technologie: Capabilities, Copy-on-write i inne.<\/p>\n<p>Capabilities to sytuacja, w kt\u00f3rej m\u00f3wimy procesowi, co mo\u017ce robi\u0107, a czego nie. Na poziomie j\u0105dra to po prostu bitmapy z wieloma parametrami. Na przyk\u0142ad u\u017cytkownik root ma pe\u0142ne uprawnienia i mo\u017ce robi\u0107 wszystko. Serwer czasu mo\u017ce zmienia\u0107 czas systemowy: ma capabilities na Time Capsule i ju\u017c. Dzi\u0119ki uprawnieniom mo\u017cna elastycznie dostosowa\u0107 ograniczenia dla proces\u00f3w, co pozwala zwi\u0119kszy\u0107 bezpiecze\u0144stwo.<\/p>\n<p>System Copy-on-write pozwala nam skuteczniej pracowa\u0107 z obrazami Docker.<\/p>\n<p><em>Obecnie Docker ma problemy z kompatybilno\u015bci\u0105 Cgroups v2, dlatego w artykule skupiamy si\u0119 na Cgroups v1.<\/em><\/p><\/blockquote>\n<p>Ale wr\u00f3\u0107my do historii. <\/p>\n<p><\/p>\n<p>Kiedy pojawi\u0142y si\u0119 systemy wirtualizacji na poziomie j\u0105dra, zacz\u0119to je intensywnie wykorzystywa\u0107. Opr\u00f3cz obci\u0105\u017cenia hipernadzorc\u0105, pojawi\u0142y si\u0119 inne problemy:<\/p>\n<p><\/p>\n<ul>\n<li>du\u017ce obrazy: do OpenVZ wrzuca si\u0119 system operacyjny, biblioteki, mas\u0119 r\u00f3\u017cnych program\u00f3w, a w efekcie obraz i tak okazuje si\u0119 by\u0107 sporych rozmiar\u00f3w;<\/li>\n<li>brak normalnego standardu pakowania i dostarczania, co prowadzi do problemu z zale\u017cno\u015bciami. Czasami dwa kawa\u0142ki kodu u\u017cywaj\u0105 tej samej biblioteki, ale w r\u00f3\u017cnych wersjach. Mi\u0119dzy nimi mo\u017ce wyst\u0105pi\u0107 konflikt.<\/li>\n<\/ul>\n<p><\/p>\n<p>Aby rozwi\u0105za\u0107 te wszystkie problemy, nasta\u0142a kolejna era.<\/p>\n<p><\/p>\n<h2 id=\"era-konteynerov\">Era kontener\u00f3w<\/h2>\n<p><\/p>\n<p>Kiedy nasta\u0142a Era kontener\u00f3w, zmieni\u0142a si\u0119 filozofia pracy z nimi:<\/p>\n<p><\/p>\n<ul>\n<li>Jeden proces \u2014 jeden kontener.<\/li>\n<li>Wszystkie niezb\u0119dne zale\u017cno\u015bci dla procesu dostarczamy do jego kontenera. Wymaga to rozbicia monolit\u00f3w na mikrous\u0142ugi.<\/li>\n<li>Im mniejszy obraz, tym lepiej \u2014 mniej potencjalnych luk w zabezpieczeniach, szybsze wdra\u017canie i tak dalej.<\/li>\n<li>Instancje staj\u0105 si\u0119 efemeryczne. <\/li>\n<\/ul>\n<p><\/p>\n<p>Pami\u0119tacie, m\u00f3wi\u0142em o zwierz\u0119tach domowych i bydle? Kiedy\u015b instancje by\u0142y jak zwierz\u0119ta domowe, a teraz sta\u0142y si\u0119 jak byd\u0142o. Kiedy\u015b by\u0142 monolit \u2014 jedna aplikacja. Teraz to 100 mikrous\u0142ug, 100 kontener\u00f3w. Niekt\u00f3re kontenery mog\u0105 mie\u0107 po 2-3 repliki. Nie jest ju\u017c dla nas tak wa\u017cne kontrolowanie ka\u017cdego kontenera. Bardziej liczy si\u0119 dost\u0119pno\u015b\u0107 samej us\u0142ugi: tego, co robi ten zbi\u00f3r kontener\u00f3w. To zmienia podej\u015bcie do monitorowania.<\/p>\n<p><\/p>\n<p>W latach 2014-2015 nast\u0105pi\u0142 rozkwit Dockera \u2014 tej technologii, o kt\u00f3rej b\u0119dziemy teraz m\u00f3wi\u0107.<\/p>\n<p><\/p>\n<p>Docker zmieni\u0142 filozofi\u0119 i znormalizowa\u0142 pakowanie aplikacji. Dzi\u0119ki Docker mo\u017cemy zapakowa\u0107 aplikacj\u0119, wys\u0142a\u0107 j\u0105 do repozytorium, pobra\u0107 stamt\u0105d i wdro\u017cy\u0107. <\/p>\n<p><\/p>\n<p>W kontenerze Docker pakujemy wszystko, co niezb\u0119dne, wi\u0119c rozwi\u0105zujemy problem zale\u017cno\u015bci. Docker gwarantuje reprodukowalno\u015b\u0107. My\u015bl\u0119, \u017ce wielu spotka\u0142o si\u0119 z brakiem reprodukowalno\u015bci: wszystko dzia\u0142a u Ciebie, wrzucasz to na produkcj\u0119, a tam przestaje dzia\u0142a\u0107. Z Dockerem ten problem znika. Je\u015bli Tw\u00f3j kontener Docker uruchamia si\u0119 i wykonuje to, co ma robi\u0107, to z du\u017cym prawdopodobie\u0144stwem uruchomi si\u0119 na produkcji i tam tak\u017ce zrobi to samo.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"otstuplenie-pro-overhed\">Dygresja o overheadzie<\/h2>\n<p>Wok\u00f3\u0142 overheadu trwaj\u0105 nieustanne dyskusje. Niekt\u00f3rzy twierdz\u0105, \u017ce Docker nie niesie dodatkowego obci\u0105\u017cenia, poniewa\u017c korzysta z j\u0105dra Linuxa i wszystkich jego proces\u00f3w potrzebnych do konteneryzacji. M\u00f3wi\u0105, \u017ce \"je\u015bli m\u00f3wisz, \u017ce Docker to overhead, to w takim razie j\u0105dro Linuxa te\u017c jest overheadem\".<\/p>\n<p>Z drugiej strony, je\u017celi zag\u0142\u0119bimy si\u0119 w temat, to w Dockerze rzeczywi\u015bcie istnieje kilka aspekt\u00f3w, kt\u00f3re mo\u017cna by z trudem okre\u015bli\u0107 jako overhead.<\/p>\n<p>Pierwszy \u2014 to przestrze\u0144 nazw PID. Kiedy umieszczamy jaki\u015b proces w przestrzeni nazw, przypisywany jest mu PID 1. Jednocze\u015bnie ten proces ma jeszcze jeden PID, kt\u00f3ry znajduje si\u0119 w przestrzeni nazw hosta, poza kontenerem. Na przyk\u0142ad uruchamiamy Nginx w kontenerze, staje si\u0119 on PID 1 (proces g\u0142\u00f3wny). A na ho\u015bcie ma PID 12623. Trudno powiedzie\u0107, na ile to jest overhead.<\/p>\n<p>Drug\u0105 kwesti\u0105 s\u0105 Cgroups. We\u017amy Cgroups dla pami\u0119ci, czyli mo\u017cliwo\u015b\u0107 ograniczania pami\u0119ci kontenerowi. Po jej w\u0142\u0105czeniu aktywuj\u0105 si\u0119 liczniki, accounting pami\u0119ci: j\u0105dro musi rozumie\u0107, ile stron zosta\u0142o przydzielonych, a ile jeszcze jest wolnych dla tego kontenera. Mo\u017ce to by\u0107 overhead, ale nie spotka\u0142em si\u0119 z dok\u0142adnymi badaniami na temat tego, jak wp\u0142ywa to na wydajno\u015b\u0107. I sam nie zauwa\u017cy\u0142em, \u017ceby aplikacja uruchomiona w Dockerze nagle traci\u0142a na wydajno\u015bci. <\/p>\n<p>I jeszcze jedna uwaga dotycz\u0105ca wydajno\u015bci. Niekt\u00f3re parametry j\u0105dra s\u0105 przekazywane z hosta do kontenera. W szczeg\u00f3lno\u015bci niekt\u00f3re parametry sieciowe. Dlatego je\u015bli chcesz uruchomi\u0107 w Dockerze co\u015b o wysokiej wydajno\u015bci, na przyk\u0142ad co\u015b, co b\u0119dzie aktywnie wykorzystywa\u0107 sie\u0107, to musisz przynajmniej te parametry dostosowa\u0107. Na przyk\u0142ad nf_conntrack. <\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"o-koncepcii-docker\">O koncepcji Dockera<\/h2>\n<p><\/p>\n<p>Docker sk\u0142ada si\u0119 z kilku komponent\u00f3w: <\/p>\n<p><\/p>\n<ol>\n<li>Docker Daemon \u2014 to w\u0142a\u015bnie jest Container Engine; uruchamia kontenery. <\/li>\n<li>Docker CII \u2014 narz\u0119dzie do zarz\u0105dzania Dockerem.<\/li>\n<li>Dockerfile \u2014 instrukcja dotycz\u0105ca tego, jak zbudowa\u0107 obraz.<\/li>\n<li>Image \u2014 obraz, z kt\u00f3rego budowany jest kontener.<\/li>\n<li>Kontener.<\/li>\n<li>Docker registry \u2014 magazyn obraz\u00f3w.<\/li>\n<\/ol>\n<p><\/p>\n<p>Schematycznie wygl\u0105da to mniej wi\u0119cej tak:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje\" src=\"\/wp-content\/uploads\/2020\/08\/73ccc02c14485f72cfd7c64e3074f3b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na Docker_host dzia\u0142a Docker daemon, uruchamiaj\u0105c kontenery. Jest Client, kt\u00f3ry przesy\u0142a polecenia: zbuduj obraz, pobierz obraz, uruchom kontener. Docker daemon komunikuje si\u0119 z registry i wykonuje te polecenia. Klient Docker mo\u017ce \u0142\u0105czy\u0107 si\u0119 zar\u00f3wno lokalnie (z gniazda unixowego), jak i przez TCP z zdalnego hosta.<\/p>\n<p><\/p>\n<p>Przejd\u017amy do ka\u017cdego komponentu.<\/p>\n<p><\/p>\n<p><u>Docker daemon (demon)<\/u> \u2014 to cz\u0119\u015b\u0107 serwerowa, dzia\u0142aj\u0105ca na maszynie hosta: pobiera obrazy i uruchamia z nich kontenery, tworzy sie\u0107 mi\u0119dzy kontenerami, zbiera logi. Kiedy m\u00f3wimy \u201estw\u00f3rz obraz\u201d, r\u00f3wnie\u017c zajmuje si\u0119 tym demon.<\/p>\n<p><\/p>\n<p><u>Docker CLI<\/u> \u2014 to cz\u0119\u015b\u0107 klienta Docker, konsolowe narz\u0119dzie do pracy z demonem. Podkre\u015blam, \u017ce mo\u017ce dzia\u0142a\u0107 nie tylko lokalnie, ale r\u00f3wnie\u017c w sieci. <\/p>\n<p><\/p>\n<p><strong>Podstawowe komendy:<\/strong><\/p>\n<p><\/p>\n<p>docker ps \u2014 pokazuje kontenery, kt\u00f3re s\u0105 aktualnie uruchomione na Docker-host.<br \/>\ndocker images \u2014 pokazuje lokalnie pobrane obrazy.<br \/>\ndocker search  \u2014 wyszukiwanie obrazu w registry.<br \/>\ndocker pull  \u2014 pobierz obraz z registry na maszyn\u0119.<br \/>\ndocker build &lt;&gt; \u2014 zbuduj obraz.<br \/>\ndocker run  \u2014 uruchom kontener.<br \/>\ndocker rm  \u2014 usu\u0144 kontener.<br \/>\ndocker logs  \u2014 logi kontenera<br \/>\ndocker start\/stop\/restart  \u2014 praca z kontenerem.\n<\/p>\n<p>Je\u015bli opanujesz te komendy i b\u0119dziesz si\u0119 nimi pewnie pos\u0142ugiwa\u0142, to mo\u017cesz uzna\u0107, \u017ce w 70% opanowa\u0142e\u015b Docker na poziomie u\u017cytkownika.<\/p>\n<p><\/p>\n<p><u>Dockerfile<\/u> \u2014 instrukcja do tworzenia obrazu. Prawie ka\u017cda komenda w instrukcji to nowa warstwa. Zobaczmy na przyk\u0142adzie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Czym jest Docker: kr\u00f3tka historia i podstawowe abstrakcje\" src=\"\/wp-content\/uploads\/2020\/08\/4d61b58d0d0d8b2e4ddbbfe573f34f7e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak wygl\u0105da Dockerfile: po lewej stronie komendy, po prawej \u2014 argumenty. Ka\u017cda komenda, kt\u00f3ra tutaj jest (i w og\u00f3le pisze si\u0119 w Dockerfile), tworzy now\u0105 warstw\u0119 w obrazie. <\/p>\n<p><\/p>\n<p>Patrz\u0105c na lew\u0105 stron\u0119, mo\u017cna w przybli\u017ceniu zrozumie\u0107, co si\u0119 dzieje. M\u00f3wimy: \u201estw\u00f3rz nam folder\u201d \u2014 to jedna warstwa. \u201eUczy\u0144 folder roboczym\u201d \u2014 to kolejna warstwa i tak dalej. Warstwowy schemat u\u0142atwia \u017cycie. Je\u015bli stworz\u0119 jeszcze jeden Dockerfile i w ostatniej linii co\u015b zmieni\u0119 \u2014 uruchomi\u0119 nie \"python\" \"main.py\", ale co\u015b innego, lub zainstaluj\u0119 zale\u017cno\u015bci z innego pliku \u2014 to poprzednie warstwy zostan\u0105 ponownie wykorzystane, jak pami\u0119\u0107 podr\u0119czna.<\/p>\n<p><\/p>\n<p><u>Obraz<\/u> \u2014 to jest pakiet kontenera, z kt\u00f3rego uruchamiane s\u0105 kontenery. Patrz\u0105c na Dockera z perspektywy mened\u017cera pakiet\u00f3w (jakby\u015bmy pracowali z pakietami deb lub rpm), obraz to zasadniczo pakiet rpm. Poprzez yum install mo\u017cemy zainstalowa\u0107 aplikacj\u0119, usun\u0105\u0107 j\u0105, znale\u017a\u0107 w repozytorium, pobra\u0107. Tutaj jest podobnie: kontenery s\u0105 uruchamiane z obrazu, przechowywane w rejestrze Dockera (analogicznie do yum w repozytorium), a ka\u017cdy obraz ma hash SHA-256, nazw\u0119 i tag.<\/p>\n<p><\/p>\n<p>Obraz jest tworzony wed\u0142ug instrukcji z Dockerfile. Ka\u017cda instrukcja z Dockerfile tworzy now\u0105 warstw\u0119. Warstwy mog\u0105 by\u0107 u\u017cywane ponownie.<\/p>\n<p><\/p>\n<p><u>Rejestr Dockera<\/u> \u2014 to repozytorium obraz\u00f3w Dockera. Analogicznie do systemu operacyjnego, Docker ma publiczny standardowy rejestr \u2014 dockerhub. Mo\u017cna jednak zbudowa\u0107 w\u0142asne repozytorium, w\u0142asny rejestr Dockera. <\/p>\n<p><\/p>\n<p><u>Kontener<\/u> \u2014 to, co jest uruchamiane z obrazu. Zgodnie z instrukcj\u0105 z Dockerfile zbudowali\u015bmy obraz, nast\u0119pnie uruchamiamy go z tego obrazu. Ten kontener jest izolowany od innych kontener\u00f3w, musi zawiera\u0107 wszystko, co potrzebne do dzia\u0142ania aplikacji. Przy tym jeden kontener \u2014 jeden proces. Zdarza si\u0119, \u017ce trzeba uruchomi\u0107 dwa procesy, ale to nieco sprzeczne z ideologi\u0105 Dockera.<\/p>\n<p><\/p>\n<p>Wymaganie \u201ejeden kontener \u2014 jeden proces\u201d wi\u0105\u017ce si\u0119 z PID Namespace. Kiedy w Namespace uruchamiany jest proces z PID 1, je\u015bli nagle umrze, to ca\u0142y kontener te\u017c umiera. Je\u015bli jednak s\u0105 uruchomione dwa procesy: jeden \u017cyje, a drugi umar\u0142, to kontener i tak b\u0119dzie \u017cy\u0142. Ale to temat Best Practices, o kt\u00f3rych porozmawiamy w innych materia\u0142ach.<\/p>\n<p><\/p>\n<p>Wi\u0119cej szczeg\u00f3\u0142\u00f3w na temat cech i pe\u0142nego programu kursu mo\u017cna znale\u017a\u0107 pod linkiem: \u201e<noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">Kurs wideo po Dockerze<\/a><\/noindex>\u00bb. <\/p>\n<p><\/p>\n<p><em>Autor: Marsel Ibraev, certyfikowany administrator Kubernetes, in\u017cynier praktykuj\u0105cy w firmie Southbridge, m\u00f3wca i tw\u00f3rca kurs\u00f3w z S\u0142\u00e9rm.<\/em><\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/515508\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f Docker \u0438 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445: Image, Cli, Dockerfile. \u041b\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u043e\u0432\u0438, \u0430\u043f\u043f\u0435\u043d\u0434\u0438\u043a\u0441\u0430 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Czym jest Docker: kr\u00f3tki wst\u0119p do historii i g\u0142\u00f3wnych abstrakcji | ProHoster","description":"10 sierpnia w S\u0142\u00e9rm rozpocz\u0105\u0142 si\u0119 kurs wideo po Dockerze, w kt\u00f3rym omawiamy go w ca\u0142o\u015bci \u2014 od podstawowych abstrakcji po parametry sieci.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster","og:description":"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-20T05:42:23+00:00","article:modified_time":"2020-08-20T05:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91905","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:18:28","updated":"2022-10-01 05:09:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=91905"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/91905\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/91906"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=91905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=91905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=91905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}