{"id":31641,"date":"2019-10-31T21:42:19","date_gmt":"2019-10-31T18:42:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\/"},"modified":"2019-10-31T21:42:19","modified_gmt":"2019-10-31T18:42:19","slug":"docker-eto-igrushka-ili-net-ili-vsyo-taki-da","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","title":{"rendered":"Czy Docker to zabawka, czy nie? A mo\u017ce jednak tak?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107 wszystkim!<\/p>\n<p><\/p>\n<p>Bardzo chc\u0119 od razu przej\u015b\u0107 do tematu, ale lepiej b\u0119dzie najpierw opowiedzie\u0107 o mojej historii:<\/p>\n<p><\/p>\n<h2>Wprowadzenie<\/h2>\n<p><\/p>\n<p>Jestem programist\u0105 z do\u015bwiadczeniem w tworzeniu aplikacji frontendowych typu single-page, scala\/java oraz nodejs na serwerze. <\/p>\n<p><\/p>\n<p>Przez do\u015b\u0107 d\u0142ugi czas (ju\u017c na pewno kilka \u2014 kilkana\u015bcie lat) by\u0142em zdania, \u017ce docker to manna z nieba i w og\u00f3le bardzo fajne narz\u0119dzie, kt\u00f3re absolutnie ka\u017cdy programista powinien umie\u0107 obs\u0142ugiwa\u0107. Z tego wynika, \u017ce ka\u017cdy programista powinien mie\u0107 docker na lokalnej maszynie. Co ja m\u00f3wi\u0119 o swoim zdaniu, wystarczy spojrze\u0107 na og\u0142oszenia, kt\u00f3re s\u0105 zamieszczane na tym samym hh. W co drugim jest wzmianka o dockerze i je\u015bli go posiadasz \u2014 to b\u0119dzie twoja przewaga konkurencyjna ;)<\/p>\n<p><\/p>\n<p>Na swojej drodze spotka\u0142em wielu ludzi, z ich r\u00f3\u017cnym podej\u015bciem do dockera i jego ekosystemu. Niekt\u00f3rzy m\u00f3wili, \u017ce to wygodna rzecz, gwarantuj\u0105ca multiplatformowo\u015b\u0107. Inni nie rozumieli, po co maj\u0105 uruchamia\u0107 si\u0119 w kontenerach i jaki maj\u0105 z tego zysk, a trzeci w og\u00f3le si\u0119 tym nie przejmowali (po prostu pisali kod i szli do domu \u2014 zazdroszcz\u0119 im, nawiasem m\u00f3wi\u0105c \ud83d\ude42)<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Powody korzystania<\/h2>\n<p><\/p>\n<p>Dlaczego u\u017cywa\u0142em dockera? Pewnie z nast\u0119puj\u0105cych powod\u00f3w:<\/p>\n<p><\/p>\n<ul>\n<li>uruchomienie bazy danych, 99% aplikacji z nich korzysta<\/li>\n<li>uruchomienie nginx do serwowania frontendu i proxy do backendu<\/li>\n<li>mo\u017cna zapakowa\u0107 aplikacj\u0119 w obraz dockera, dzi\u0119ki czemu moja aplikacja b\u0119dzie dzia\u0142a\u0107 wsz\u0119dzie tam, gdzie jest docker, problem dystrybucji zostaje rozwi\u0105zany od razu<\/li>\n<li>service discovery z pude\u0142ka, mo\u017cna tworzy\u0107 mikroserwisy, ka\u017cdy kontener (pod\u0142\u0105czony do wsp\u00f3lnej sieci) \u0142atwo skontaktuje si\u0119 z innym po aliasie, bardzo wygodne<\/li>\n<li>Zabawnie jest stworzy\u0107 kontener i &#171;bawi\u0107 si\u0119&#187; w nim.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Co zawsze MI si\u0119 nie podoba\u0142o w dockerze:<\/h2>\n<p><\/p>\n<ul>\n<li>Aby moja aplikacja dzia\u0142a\u0142a, potrzebny jest sam docker na serwerze. A po co mi to, skoro moje aplikacje dzia\u0142aj\u0105 na jre lub na nodejs, a \u015brodowisko dla nich ju\u017c jest na serwerze?<\/li>\n<li>je\u015bli chc\u0119 uruchomi\u0107 sw\u00f3j (prywatny) lokalnie zbudowany obraz na zdalnym serwerze, potrzebuj\u0119 swojego repozytorium dockera, musi gdzie\u015b dzia\u0142a\u0107 registry i trzeba jeszcze skonfigurowa\u0107 https, poniewa\u017c docker cli dzia\u0142a tylko przez https. O kurcz\u0119\u2026 s\u0105 opcje, oczywi\u015bcie, aby zapisa\u0107 obraz lokalnie przez <code>docker save<\/code> i przez scp po prostu przes\u0142a\u0107 obraz... Ale to tyle ruchu. A poza tym, wygl\u0105da to na &#171;kikut&#187; rozwi\u0105zanie, dop\u00f3ki nie pojawi si\u0119 w\u0142asne repozytorium.<\/li>\n<li><code>docker-compose<\/code>. Jest potrzebny tylko do uruchamiania kontener\u00f3w. I to wszystko. Nic wi\u0119cej nie mo\u017ce. <code>Docker-compose<\/code> ma mn\u00f3stwo wersji swoich plik\u00f3w, sw\u00f3j w\u0142asny sk\u0142adnik. Bez wzgl\u0119du na to, jak deklaratywny by nie by\u0142, nie chc\u0119 czyta\u0107 ich dokumentacji. Nie przyda mi si\u0119 ona nigdzie indziej.<\/li>\n<li>gdy pracuje si\u0119 w zespole, wi\u0119kszo\u015b\u0107 ludzi pisze Dockerfile bardzo \u017ale, nie rozumie, jak to jest buforowane, dodaj\u0105 do obrazu wszystko, co trzeba i nie trzeba, dziedzicz\u0105 z obraz\u00f3w, kt\u00f3rych nie ma w dockerhub lub prywatnym repozytorium, tworz\u0105 jakie\u015b <code>docker-compose<\/code> Pliki z bazami danych i nic nie jest persistowane. Przy tym deweloperzy dumnie twierdz\u0105, \u017ce docker jest \u015bwietny, wszystko dzia\u0142a lokalnie, a HR wa\u017cnie pisze w ofertach: &#171;U\u017cywamy dockera i potrzebujemy kandydata z takim do\u015bwiadczeniem&#187;.<\/li>\n<li>ci\u0105gle chodzi po g\u0142owie my\u015bl o uruchomieniu w dockerze wszystkiego: postgresql, kafka, redis. Szkoda, \u017ce nie wszystko dzia\u0142a w kontenerach, nie wszystko \u0142atwo skonfigurowa\u0107 i uruchomi\u0107. Wspieraj\u0105 to deweloperzy zewn\u0119trzni, a nie sami dostawcy. I od razu pojawia si\u0119 pytanie, dlaczego dostawcy nie dbaj\u0105 o wsparcie swoich produkt\u00f3w w dockerze, mo\u017ce oni co\u015b wiedz\u0105?<\/li>\n<li>zawsze pojawia si\u0119 pytanie o trwa\u0142o\u015b\u0107 danych kontenera. I tu my\u015blisz, czy po prostu zamontowa\u0107 katalog hosta, czy stworzy\u0107 volume dockerowy, czy zrobi\u0107 kontener danych, kt\u00f3ry teraz <code>deprecated<\/code>? \u0415\u0441\u043b\u0438 \u044f \u043c\u043e\u043d\u0442\u0438\u0440\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e uid \u0438 gid \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0438\u043d\u0430\u0447\u0435 \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 root. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <code>volume<\/code> wi\u0119c dane po prostu zostan\u0105 stworzone w jakim\u015b <code>\/usr\/*<\/code> I b\u0119dzie ta sama historia z uid i gid jak w pierwszym przypadku. Je\u015bli uruchamiasz zewn\u0119trzny komponent, musisz przeczyta\u0107 dokumentacj\u0119 i szuka\u0107 odpowiedzi na pytanie: &#171;w kt\u00f3re katalogi kontenera komponent zapisuje pliki?&#187;<\/li>\n<\/ul>\n<p>Zawsze nie podoba\u0142o mi si\u0119, \u017ce musia\u0142em za d\u0142ugo bawi\u0107 si\u0119 z dockerem. <strong>na pocz\u0105tku<\/strong>: wymy\u015bla\u0142em, jak uruchamia\u0107 kontenery, z jakich obraz\u00f3w uruchamia\u0107, tworzy\u0142em Makefile, kt\u00f3re zawiera\u0142y aliasy do d\u0142ugich komend dockera. Nie znosi\u0142em docker-compose, poniewa\u017c nie chcia\u0142em uczy\u0107 si\u0119 jeszcze jednego narz\u0119dzia z ekosystemu dockera. A <code>docker-compose up<\/code> denerwowa\u0142 mnie, zw\u0142aszcza, je\u015bli pojawia\u0142y si\u0119 tam tak\u017ce <code>build<\/code> konstrukcje, a nie ju\u017c zbudowane obrazy. Wszystko, co naprawd\u0119 chcia\u0142em, to po prostu tworzy\u0107 produkt efektywnie i szybko. Ale nie mog\u0142em w \u017caden spos\u00f3b uporz\u0105dkowa\u0107 u\u017cycia dockera.<\/p>\n<p><\/p>\n<h2>Poznanie Ansible<\/h2>\n<p><\/p>\n<p>Niedawno (oko\u0142o trzech miesi\u0119cy temu) pracowa\u0142em z zespo\u0142em DevOps, niemal ka\u017cdy cz\u0142onek kt\u00f3rego mia\u0142 negatywne nastawienie do dockera. Z powod\u00f3w:<\/p>\n<p><\/p>\n<ul>\n<li>Docker zarz\u0105dza iptables (chocia\u017c mo\u017cna to wy\u0142\u0105czy\u0107 w daemon.json)<\/li>\n<li>Docker jest niezb\u0119dny i nie b\u0119dziemy go uruchamia\u0107 w produkcji<\/li>\n<li>Je\u015bli daemon Dockera pada, to odpowiednio wszystkie kontenery z infrastruktur\u0105 r\u00f3wnie\u017c padaj\u0105<\/li>\n<li>W Dockerze nie ma potrzeby<\/li>\n<li>Po co Docker, skoro s\u0105 Ansible i maszyny wirtualne<\/li>\n<\/ul>\n<p><\/p>\n<p>W tej samej pracy pozna\u0142em jeszcze jedno narz\u0119dzie \u2013 Ansible. Kiedy\u015b s\u0142ysza\u0142em o nim, ale nie pr\u00f3bowa\u0142em pisa\u0107 swoich playbook\u00f3w. A teraz zacz\u0105\u0142em pisa\u0107 swoje zadania i moje spojrzenie zmieni\u0142o si\u0119 ca\u0142kowicie! Zrozumia\u0142em, \u017ce Ansible ma modu\u0142y do uruchamiania tych samych kontener\u00f3w Docker, budowy obraz\u00f3w, sieci itp., przy czym kontenery mo\u017cna uruchomi\u0107 nie tylko lokalnie, ale tak\u017ce na zdalnych serwerach! Moja rado\u015b\u0107 nie mia\u0142a granic \u2013 znalaz\u0142em NORMANLNE narz\u0119dzie i wyrzuci\u0142em swoje pliki Makefile i docker-compose, kt\u00f3re zosta\u0142y zast\u0105pione zadaniami w yaml. Kod zosta\u0142 zmniejszony dzi\u0119ki zastosowaniu konstrukcji typu <code>loop<\/code>, <code>when<\/code>, itp.<\/p>\n<p><\/p>\n<h2>Docker do uruchamiania zewn\u0119trznych komponent\u00f3w typu bazy danych<\/h2>\n<p><\/p>\n<p>Niedawno pozna\u0142em tunelowanie ssh. Okaza\u0142o si\u0119, \u017ce bardzo prosto jest &#171;przekierowa\u0107&#187; port zdalnego serwera na lokalny port. Zdalny serwer mo\u017ce by\u0107 tak samo maszyn\u0105 w chmurze, jak wirtualn\u0105 maszyn\u0105 uruchomion\u0105 w VirtualBox. Je\u015bli ja lub m\u00f3j kolega potrzebujemy bazy danych (lub jakiego\u015b innego zewn\u0119trznego komponentu), mo\u017cna po prostu uruchomi\u0107 serwer z tym komponentem i wy\u0142\u0105czy\u0107 go, gdy serwer nie jest potrzebny. Przekierowanie port\u00f3w daje ten sam efekt, co baza danych uruchomiona w kontenerze docker.<\/p>\n<p><\/p>\n<p>Ten polecenie przepuszcza m\u00f3j lokalny port na zdalny serwer z postgresql:<\/p>\n<p><\/p>\n<blockquote><p>ssh -L 9000:localhost:5432 user@example.com<\/p><\/blockquote>\n<p>U\u017cywanie zdalnego serwera rozwi\u0105zuje problem z prac\u0105 w zespole. Z takiego serwera mog\u0105 korzysta\u0107 jednocze\u015bnie wielu programist\u00f3w, nie musz\u0105 zna\u0107 si\u0119 na konfiguracji postgresql, dockerze i innych z\u0142o\u017cono\u015bciach. Na zdalnym serwerze mo\u017cna zainstalowa\u0107 t\u0119 sam\u0105 baz\u0119 danych w Dockerze, je\u015bli zainstalowanie specyficznej wersji jest trudne. Wszystko, co programi\u015bci b\u0119d\u0105 potrzebowa\u0107, to dost\u0119p SSH!<\/p>\n<p><\/p>\n<p>Ostatnio przeczyta\u0142em, \u017ce tunelowanie SSH to ograniczona funkcjonalno\u015b\u0107 zwyk\u0142ego VPN! Mo\u017cna po prostu skonfigurowa\u0107 OpenVPN lub inne realizacje VPN, skonfigurowa\u0107 infrastruktur\u0119 i udost\u0119pni\u0107 j\u0105 programistom. To przecie\u017c takie \u015bwietne!<\/p>\n<p><\/p>\n<p>Na szcz\u0119\u015bcie AWS, GoogleCloud i inne oferuj\u0105 rok darmowego korzystania, wi\u0119c warto to wykorzysta\u0107! S\u0105 niedrogie, je\u015bli je wy\u0142\u0105czasz, gdy nie s\u0105 u\u017cywane. Zawsze zastanawia\u0142em si\u0119, w jakich celach m\u00f3g\u0142bym potrzebowa\u0107 zdalnego serwera typu gcloud, wydaje si\u0119, \u017ce teraz odnalaz\u0142em ich zastosowanie.<\/p>\n<p><\/p>\n<p>Jako maszyna wirtualna mo\u017cna u\u017cy\u0107 tego samego Alpine, kt\u00f3ry jest aktywnie wykorzystywany w kontenerach dockerowych. Lub inne lekkie dystrybucje, aby maszyna \u0142adowa\u0142a si\u0119 szybciej.<\/p>\n<p><\/p>\n<p>Podsumowuj\u0105c: uruchamianie baz danych i innych infrastrukturalnych rzeczy mo\u017cna i nale\u017cy na zdalnych serwerach lub w virtualboxie. Nie potrzebuj\u0119 dockera do tych cel\u00f3w.<\/p>\n<p><\/p>\n<h2>Troch\u0119 o obrazach dockera i dystrybucji<\/h2>\n<p><\/p>\n<p>Ju\u017c o tym pisa\u0142em <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/443136\/\">artyku\u0142<\/a><\/noindex> chcia\u0142em przekaza\u0107, \u017ce korzystanie z obraz\u00f3w dockera nie daje \u017cadnych gwarancji. Obrazy dockera s\u0105 potrzebne tylko do stworzenia kontenera dockera. Je\u015bli u\u017cywasz obrazu dockera, to znaczy, \u017ce wykorzystujesz kontenery dockera i b\u0119dziesz mia\u0142 do czynienia tylko z nimi.<\/p>\n<p><\/p>\n<p>Czy widzia\u0142e\u015b gdziekolwiek, aby deweloperzy oprogramowania portowali swoje produkty tylko w obrazie dockera?<br \/>\nWynikiem wi\u0119kszo\u015bci produkt\u00f3w s\u0105 pliki binarne dla konkretnej platformy, kt\u00f3re po prostu dodaje si\u0119 do obrazu dockera, dziedzicz\u0105c z odpowiedniej platformy. Nie zastanawia\u0142e\u015b si\u0119, dlaczego w dockerhubie jest tak wiele podobnych obraz\u00f3w? Wpisz na przyk\u0142ad nginx, a zobaczysz 100500 obraz\u00f3w od r\u00f3\u017cnych os\u00f3b. Ci ludzie nie rozwijali samego nginx, tylko dodali oficjalny nginx do swojego obrazu dockera i wzbogacili go swoimi konfiguracjami dla wygody uruchamiania kontener\u00f3w. <\/p>\n<p><\/p>\n<p>Generalnie mo\u017cna przechowywa\u0107 w tgz, je\u015bli kto\u015b b\u0119dzie chcia\u0142 to uruchomi\u0107 w dockerze, niech doda tgz w Dockerfile, dziedziczy z odpowiedniego \u015brodowiska i tworzy dodatkowe rzeczy, kt\u00f3re nie zmieniaj\u0105 samej aplikacji w tgz. Ten, kto stworzy obraz dockera, b\u0119dzie wiedzia\u0142, czym jest to tgz i co potrzebuje do pracy. Tak w\u0142a\u015bnie u\u017cywam dockera. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kondaurovDev\/dockerfile\">tutaj<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Podsumowuj\u0105c: nie potrzebuj\u0119 rejestru dockera, skorzystam z S3 lub po prostu z przechowalni plik\u00f3w typu google drive\/dropbox.<\/p>\n<p><\/p>\n<h2>Docker w CI<\/h2>\n<p><\/p>\n<p>Wszystkie firmy, w kt\u00f3rych pracowa\u0142em, s\u0105 do siebie podobne. Zazwyczaj s\u0105 to firmy produktowe. To znaczy maj\u0105 jedno konkretne aplikacj\u0119, jeden stos technologii (mo\u017ce dwa lub trzy j\u0119zyki programowania).<\/p>\n<p><\/p>\n<p>Te firmy u\u017cywaj\u0105 Dockera na swoich serwerach, na kt\u00f3rych uruchamiany jest proces CI. Pytanie brzmi: po co budowa\u0107 projekty w kontenerze Docker na swoich serwerach? Dlaczego po prostu nie przygotowa\u0107 \u015brodowiska do kompilacji, na przyk\u0142ad nie napisa\u0107 playbooka Ansible, kt\u00f3ry zainstaluje odpowiednie wersje Node.js, PHP, JDK i skopiuje klucze SSH itp. na serwerze, na kt\u00f3rym odbywa si\u0119 kompilacja? <\/p>\n<p><\/p>\n<p>Teraz rozumiem, \u017ce to strza\u0142 w kolano, poniewa\u017c Docker nie przynosi \u017cadnych korzy\u015bci ze swojej izolacji. Problemy z CI w Dockerze, z kt\u00f3rymi si\u0119 spotka\u0142em:<\/p>\n<p><\/p>\n<ul>\n<li>znowu potrzebny jest obraz Dockera do kompilacji. Trzeba szuka\u0107 obrazu lub pisa\u0107 w\u0142asny Dockerfile.<\/li>\n<li>90% szans, \u017ce trzeba przeprowadzi\u0107 jakie\u015b klucze SSH, dane poufne, kt\u00f3rych nie chc\u0119 wpisywa\u0107 w obraz Dockera.<\/li>\n<li>kontener jest tworzony i umiera, wszystkie cache s\u0105 tracone razem z nim. Kolejna kompilacja b\u0119dzie musia\u0142a ponownie pobra\u0107 wszystkie zale\u017cno\u015bci projektu, co jest d\u0142ugie i nieefektywne, a czas to pieni\u0105dz.<\/li>\n<\/ul>\n<p><\/p>\n<p>Programi\u015bci nie kompiluj\u0105 projekt\u00f3w w kontenerach Docker (kiedy\u015b by\u0142em takim fanatykiem, szkoda mnie w przesz\u0142o\u015bci xD). W Javie mo\u017cna mie\u0107 kilka wersji i zmienia\u0107 je za pomoc\u0105 jednego polecenia na t\u0119, kt\u00f3ra jest teraz potrzebna. W Node.js jest to samo, jest nvm.<\/p>\n<p><\/p>\n<h2>Wnioski<\/h2>\n<p><\/p>\n<p>Uwa\u017cam, \u017ce docker to bardzo pot\u0119\u017cne i elastyczne narz\u0119dzie, ale to jego wada (brzmi dziwnie, prawda?). Dzi\u0119ki niemu firmy \u0142atwo &#171;uzale\u017cniaj\u0105 si\u0119&#187; od niego, korzystaj\u0105c tam, gdzie trzeba i nie trzeba. Deweloperzy uruchamiaj\u0105 swoje kontenery, jakie\u015b w\u0142asne \u015brodowisko, a to wszystko p\u0142ynnie przechodzi do CI, produkcji. Zesp\u00f3\u0142 DevOps pisze jakie\u015b rowery, aby uruchomi\u0107 te kontenery.<\/p>\n<p><\/p>\n<p>U\u017cywaj Dockera tylko na <strong>najbardziej zaawansowanym<\/strong> etapie w swoim procesie pracy, nie wprowadzaj go do projektu na pocz\u0105tku. On nie rozwi\u0105\u017ce twoich problem\u00f3w biznesowych. Tylko przeniesie problemy na INNY poziom i zaproponuje swoje rozwi\u0105zania, b\u0119dziesz wykonywa\u0107 podw\u00f3jn\u0105 prac\u0119.<\/p>\n<p><\/p>\n<p><strong><em>Kiedy Docker jest potrzebny<\/em><\/strong>: doszed\u0142em do wniosku, \u017ce Docker jest bardzo dobry w optymalizacji ustalonego procesu, ale nie w budowaniu podstawowej funkcjonalno\u015bci.<\/p>\n<p><\/p>\n<p>Je\u015bli jednak zdecydujesz si\u0119 u\u017cywa\u0107 Dockera, to:<\/p>\n<p><\/p>\n<ul>\n<li>b\u0105d\u017a niezwykle ostro\u017cny<\/li>\n<li>nie narzucaj u\u017cywania Dockera programistom<\/li>\n<li>lokalizuj jego u\u017cycie w jednym miejscu, nie rozprzestrzeniaj po wszystkich repozytoriach Dockefile i docker-compose<\/li>\n<\/ul>\n<p><\/p>\n<p>PS:<\/p>\n<p><\/p>\n<ul>\n<li>Niedawno natkn\u0105\u0142em si\u0119 na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.packer.io\/\">packer<\/a><\/noindex> M\u00f3wi\u0105, \u017ce bardzo dobrze dzia\u0142a z Ansible i umo\u017cliwia ujednolicenie procesu budowy obraz\u00f3w (w tym obrazu docker).<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.smashcompany.com\/technology\/docker-is-a-dangerous-gamble-which-we-will-regret\">R\u00f3wnie\u017c o dockerze, interesuj\u0105cy artyku\u0142.<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Dzi\u0119kuj\u0119 za przeczytanie, \u017cycz\u0119 Pa\u0144stwu przejrzystych rozwi\u0105za\u0144 w Pa\u0144stwa sprawach i owocnych dni roboczych!<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/445914\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, scala\/java \u0438 nodejs \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e (\u0443\u0436\u0435 \u0442\u043e\u0447\u043d\u043e \u043f\u0430\u0440\u0443 \u2014 \u0442\u0440\u043e\u0439\u043a\u0443 \u043b\u0435\u0442), \u044f \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u043c\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e docker \u044d\u0442\u043e \u043c\u0430\u043d\u043d\u0430 \u043d\u0435\u0431\u0435\u0441\u043d\u0430\u044f \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31641","post","type-post","status-publish","format-standard","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.\" \/>\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\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\" \/>\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\udd47Docker \u2014 \u044d\u0442\u043e \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0418\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u0430? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da\" \/>\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=\"2019-10-31T18:42:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:42:19+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\udd47Docker \u2014 to zabawka czy nie? A mo\u017ce jednak tak? | ProHoster","description":"Cze\u015b\u0107 wszystkim! Bardzo chc\u0119 od razu przej\u015b\u0107 do tematu, ale lepiej b\u0119dzie, je\u015bli troch\u0119 opowiem o mojej historii: Wst\u0119p Jestem programist\u0105 z do\u015bwiadczeniem w tworzeniu frontend.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","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\udd47Docker \u2014 \u044d\u0442\u043e \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442? \u0418\u043b\u0438 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u0430? | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041e\u043e\u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0442\u0435\u043c\u0435, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043c\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e: \u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 frontend.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/docker-eto-igrushka-ili-net-ili-vsyo-taki-da","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":"2019-10-31T18:42:19+00:00","article:modified_time":"2019-10-31T18:42:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31641","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":"2026-01-21 07:08:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:13:28","updated":"2026-01-21 07:08:22","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\/31641","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=31641"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/31641\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=31641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=31641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=31641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}