{"id":52071,"date":"2020-02-18T05:34:24","date_gmt":"2020-02-18T02:34:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy"},"modified":"2020-02-18T05:34:24","modified_gmt":"2020-02-18T02:34:24","slug":"horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Dobrze si\u0119 zastan\u00f3w, zanim u\u017cyjesz Docker-in-Docker do CI lub \u015brodowiska testowego.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Dobrze si\u0119 zastan\u00f3w, zanim u\u017cyjesz Docker-in-Docker do CI lub \u015brodowiska testowego.\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker to wirtualne \u015brodowisko dzia\u0142aj\u0105cego demona Docker uruchamianego w samym kontenerze do budowania obraz\u00f3w kontener\u00f3w. G\u0142\u00f3wnym celem stworzenia Docker-in-Docker by\u0142a pomoc w rozwoju samego Dockera. Wiele os\u00f3b u\u017cywa go do uruchamiania Jenkins CI. Na pocz\u0105tku wydaje si\u0119 to normalne, ale p\u00f3\u017aniej pojawiaj\u0105 si\u0119 problemy, kt\u00f3rych mo\u017cna unikn\u0105\u0107, instaluj\u0105c Dockera w kontenerze Jenkins CI. W tym artykule opisano, jak to zrobi\u0107. Je\u015bli interesuje ci\u0119 ostateczne rozwi\u0105zanie bez szczeg\u00f3\u0142\u00f3w, wystarczy przeczyta\u0107 ostatni\u0105 sekcj\u0119 artyku\u0142u \"Rozwi\u0105zanie problemu\".<\/p>\n<p><img decoding=\"async\" alt=\"Dobrze si\u0119 zastan\u00f3w, zanim u\u017cyjesz Docker-in-Docker do CI lub \u015brodowiska testowego.\" src=\"\/wp-content\/uploads\/2020\/02\/0fdafa0c0a1768170cff52333e733314.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Docker-in-Docker: \"Dobry\"<\/h3>\n<p>\nPonad dwa lata temu wstawi\u0142em w Dockera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">flaga<\/a><\/noindex> --privileged i napisa\u0142em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">pierwsz\u0105 wersj\u0119 dind<\/a><\/noindex>. Celem by\u0142o przyspieszenie prac g\u0142\u00f3wnego zespo\u0142u nad Dockerem. Przed wprowadzeniem Docker-in-Docker typowy cykl rozwoju wygl\u0105da\u0142 tak:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>budowanie (build);<\/li>\n<li>zatrzymywanie uruchomionego demona Docker;<\/li>\n<li>uruchamianie nowego demona Docker;<\/li>\n<li>testowanie;<\/li>\n<li>powt\u00f3rzenie cyklu.<\/li>\n<\/ul>\n<p>\nJe\u015bli chcia\u0142e\u015b jednak wykona\u0107 \u0142adne, powtarzalne budowanie (czyli w kontenerze), to stawa\u0142o si\u0119 ono bardziej z\u0142o\u017cone:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>upewnienie si\u0119, \u017ce uruchomiona jest dzia\u0142aj\u0105ca wersja Dockera;<\/li>\n<li>zbudowanie nowego Dockera na starym Dockerze;<\/li>\n<li>zatrzymanie demona Docker;<\/li>\n<li>uruchomienie nowego demona Docker;<\/li>\n<li>przetestowanie;<\/li>\n<li>zatrzymanie nowego demona Docker;<\/li>\n<li>powt\u00f3rzenie.<\/li>\n<\/ul>\n<p>\nPo wprowadzeniu Docker-in-Docker proces uleg\u0142 uproszczeniu:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>budowanie + uruchamianie w jednym etapie;<\/li>\n<li>powt\u00f3rzenie cyklu.<\/li>\n<\/ul>\n<p>\nNieprawda\u017c, to du\u017co lepsze?<\/p>\n<p><img decoding=\"async\" alt=\"Dobrze si\u0119 zastan\u00f3w, zanim u\u017cyjesz Docker-in-Docker do CI lub \u015brodowiska testowego.\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \"Z\u0142y\"<\/h3>\n<p>\nJednak wbrew powszechnemu przekonaniu, Docker-in-Docker nie sk\u0142ada si\u0119 w 100% ze s\u0142oneczek, jednoro\u017cc\u00f3w i gwiazdek. Chodzi mi o to, \u017ce istnieje kilka problem\u00f3w, o kt\u00f3rych programista powinien wiedzie\u0107.<\/p>\n<p>Jednym z nich s\u0105 LSM (modu\u0142y zabezpiecze\u0144 Linux), takie jak AppArmor i SELinux: podczas uruchamiania kontenera \u201ewewn\u0119trzny Docker\u201d mo\u017ce pr\u00f3bowa\u0107 zastosowa\u0107 profile bezpiecze\u0144stwa, kt\u00f3re b\u0119d\u0105 kolidowa\u0107 lub myli\u0107 \u201ezewn\u0119trzny Docker\u201d. To jest najtrudniejszy problem do rozwi\u0105zania podczas pr\u00f3by po\u0142\u0105czenia pierwotnej implementacji flagi \u2013privileged. Moje zmiany dzia\u0142a\u0142y, a wszystkie testy r\u00f3wnie\u017c przesz\u0142y na moim komputerze Debian i na testowych maszynach wirtualnych Ubuntu, ale upad\u0142y i spali\u0142y si\u0119 na maszynie Michaela Crosby'ego (o ile pami\u0119tam, mia\u0142 Fedore). Nie mog\u0119 przypomnie\u0107 sobie dok\u0142adnej przyczyny problemu, ale by\u0107 mo\u017ce wynika\u0142o to z tego, \u017ce Mike \u2013 m\u0105dry cz\u0142owiek, kt\u00f3ry pracuje z SELINUX=enforce (u\u017cywa\u0142em AppArmor), a moje zmiany nie uwzgl\u0119dnia\u0142y profil\u00f3w SELinux.<\/p>\n<h3>Docker-in-Docker: \u201eZ\u0142y\u201d<\/h3>\n<p>\nDrugi problem dotyczy sterownik\u00f3w pami\u0119ci masowej Docker. Kiedy uruchamiasz Docker-in-Docker, zewn\u0119trzny Docker dzia\u0142a na standardowym systemie plik\u00f3w (EXT4, BTRFS lub dowolnym innym, kt\u00f3rym dysponujesz), a wewn\u0119trzny Docker dzia\u0142a na systemie kopii zapisu (AUFS, BTRFS, Device Mapper itd., w zale\u017cno\u015bci od tego, co jest skonfigurowane do u\u017cycia w zewn\u0119trznym Dockerze). W zwi\u0105zku z tym powstaje wiele kombinacji, kt\u00f3re nie b\u0119d\u0105 dzia\u0142a\u0107. Na przyk\u0142ad, nie mo\u017cesz uruchomi\u0107 AUFS na AUFS. <\/p>\n<p>Je\u015bli uruchamiasz BTRFS na BTRFS, powinno to dzia\u0142a\u0107 na pocz\u0105tku, ale gdy pojawi\u0105 si\u0119 zagnie\u017cd\u017cone podobj\u0119to\u015bci, usuni\u0119cie rodzica podobj\u0119to\u015bci (parent subvolume) b\u0119dzie niemo\u017cliwe. Modu\u0142 Device Mapper nie ma przestrzeni nazw, wi\u0119c je\u015bli wiele instancji Docker korzysta z niego na jednej maszynie, wszystkie b\u0119d\u0105 mog\u0142y widzie\u0107 (i wp\u0142ywa\u0107) na obrazy nawzajem i na urz\u0105dzenia do tworzenia kopii zapasowych kontener\u00f3w. To jest z\u0142e.<\/p>\n<p>Istniej\u0105 obej\u015bcia dla wielu z tych problem\u00f3w. Na przyk\u0142ad, je\u015bli chcesz u\u017cywa\u0107 AUFS w wewn\u0119trznym Dockerze, po prostu zamie\u0144 folder \\\/var\\\/lib\\\/docker w tom, a wszystko b\u0119dzie w porz\u0105dku. Docker doda\u0142 pewne podstawowe przestrzenie nazw do docelowych nazw Device Mapper, wi\u0119c je\u015bli kilka wywo\u0142a\u0144 Docker jest wykonywanych na jednej maszynie, nie b\u0119d\u0105 one \u201enast\u0119powa\u0142y\u201d na siebie nawzajem.<\/p>\n<p>Jednak taka konfiguracja wcale nie jest prosta, jak mo\u017cna zobaczy\u0107 z tych <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">artyku\u0142\u00f3w<\/a><\/noindex> w repozytorium dind na GitHubie.<\/p>\n<h3>Docker-in-Docker: robi si\u0119 jeszcze gorzej<\/h3>\n<p>\nA co z pami\u0119ci\u0105 podr\u0119czn\u0105 budowy? To r\u00f3wnie\u017c mo\u017ce by\u0107 do\u015b\u0107 skomplikowane. Ludzie cz\u0119sto pytaj\u0105 mnie: \u201eje\u015bli uruchamiam Docker-in-Docker, jak mog\u0119 u\u017cywa\u0107 obraz\u00f3w znajduj\u0105cych si\u0119 na moim ho\u015bcie, zamiast ponownie pobiera\u0107 wszystko w moim wewn\u0119trznym Dockerze\u201d?<\/p>\n<p>Niekt\u00f3rzy pomys\u0142owi ludzie pr\u00f3bowali pod\u0142\u0105czy\u0107 \/var\/lib\/docker z hosta do kontenera Docker-in-Docker. Czasami wsp\u00f3\u0142dziel\u0105 \/var\/lib\/docker z kilkoma kontenerami.<\/p>\n<p><img decoding=\"async\" alt=\"Dobrze si\u0119 zastan\u00f3w, zanim u\u017cyjesz Docker-in-Docker do CI lub \u015brodowiska testowego.\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Chcesz uszkodzi\u0107 dane? Bo to w\u0142a\u015bnie to uszkodzi Twoje dane!<\/i><\/p>\n<p>Demon Docker wyra\u017anie zosta\u0142 zaprojektowany tak, aby mie\u0107 wy\u0142\u0105czny dost\u0119p do \/var\/lib\/docker. Nic innego nie powinno \u201edotyka\u0107, szturcha\u0107 ani bada\u0107\u201d \u017cadnych plik\u00f3w Dockera znajduj\u0105cych si\u0119 w tym folderze.<\/p>\n<p>Dlaczego tak jest? Bo to jest wynikiem jednej z najtrudniejszych lekcji, kt\u00f3re nauczyli\u015bmy si\u0119 przy tworzeniu dotCloud. Silnik kontenerowy dotCloud dzia\u0142a\u0142 z wieloma procesami, kt\u00f3re jednocze\u015bnie uzyskiwa\u0142y dost\u0119p do \/var\/lib\/dotcloud. Sprytne sztuczki, takie jak atomowa wymiana plik\u00f3w (zamiast edytowania na miejscu), \u201eprzerywanie\u201d kodu poprzez blokady rekomendacyjne oraz inne eksperymenty z systemami bezpiecze\u0144stwa, takimi jak SQLite i BDB, nie zawsze dzia\u0142a\u0142y. Kiedy przerabiali\u015bmy nasz silnik kontenerowy, kt\u00f3ry ostatecznie przekszta\u0142ci\u0142 si\u0119 w Dockera, jednym z g\u0142\u00f3wnych rozwi\u0105za\u0144 projektowych by\u0142o zgrupowanie wszystkich operacji z kontenerami pod jednym demonem, aby zako\u0144czy\u0107 ca\u0142\u0105 t\u0119 absurdalno\u015b\u0107 jednoczesnego dost\u0119pu.<\/p>\n<p>Nie zrozum mnie \u017ale: ca\u0142kiem mo\u017cliwe jest stworzenie czego\u015b dobrego, niezawodnego i szybkiego, co b\u0119dzie obejmowa\u0142o kilka proces\u00f3w i nowoczesne zarz\u0105dzanie r\u00f3wnoleg\u0142e. Ale uwa\u017camy, \u017ce \u0142atwiej i pro\u015bciej jest pisa\u0107 i utrzymywa\u0107 kod, u\u017cywaj\u0105c Dockera jako jedynego gracza.<\/p>\n<p>To oznacza, \u017ce je\u015bli dzielisz katalog \/var\/lib\/docker mi\u0119dzy kilkoma instancjami Dockera, b\u0119dziesz mie\u0107 problemy. Oczywi\u015bcie, mo\u017ce to zadzia\u0142a\u0107, szczeg\u00f3lnie na wczesnych etapach testowania. \u201eS\u0142uchaj, mamo, mog\u0119 uruchomi\u0107 ubuntu 'dockerem!'\u201d Ale spr\u00f3buj zrobi\u0107 co\u015b bardziej skomplikowanego, na przyk\u0142ad pobra\u0107 ten sam obraz z dw\u00f3ch r\u00f3\u017cnych instancji, a zobaczysz, jak \u015bwiat wybucha w p\u0142omieniach.<\/p>\n<p>Oznacza to, \u017ce je\u015bli v\u00e1\u0161 system CI wykonuje kompilacje i rekonstrukcje, za ka\u017cdym razem, gdy uruchamiasz kontener Docker-in-Docker, ryzykujesz zresetowanie w jego pami\u0119ci podr\u0119cznej ''bomby j\u0105drowej''. To wcale nie jest fajne!<\/p>\n<h3>Rozwi\u0105zanie problemu<\/h3>\n<p>\nZr\u00f3bmy krok wstecz. Czy naprawd\u0119 potrzebujesz Docker-in-Docker, czy po prostu chcesz mie\u0107 mo\u017cliwo\u015b\u0107 uruchamiania Dockera, a dok\u0142adniej kompilowania i uruchamiania kontener\u00f3w oraz obraz\u00f3w z twojego systemu CI, podczas gdy sam ten system CI znajduje si\u0119 w kontenerze?<\/p>\n<p>Za\u0142o\u017c\u0119 si\u0119, \u017ce wi\u0119kszo\u015bci ludzi potrzebna jest ta druga opcja, czyli chc\u0105, aby system CI, taki jak Jenkins, m\u00f3g\u0142 uruchamia\u0107 kontenery. A najprostszym sposobem, aby to zrobi\u0107, jest po prostu pod\u0142\u0105czenie gniazda Dockera do twojego kontenera CI, wykorzystuj\u0105c flag\u0119 -v.<\/p>\n<p>M\u00f3wi\u0105c pro\u015bciej, gdy uruchamiasz sw\u00f3j kontener CI (Jenkins lub inny), zamiast majstrowa\u0107 co\u015b z Docker-in-Docker, uruchom go z linii:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nTeraz ten kontener b\u0119dzie mia\u0142 dost\u0119p do gniazda Dockera i w zwi\u0105zku z tym b\u0119dzie m\u00f3g\u0142 uruchamia\u0107 kontenery. Z wyj\u0105tkiem tego, \u017ce zamiast uruchamia\u0107 ''podrz\u0119dne'' kontenery, b\u0119dzie uruchamia\u0142 ''powi\u0105zane'' kontenery.<\/p>\n<p>Spr\u00f3buj to zrobi\u0107, u\u017cywaj\u0105c oficjalnego obrazu dockera (kt\u00f3ry zawiera plik wykonywalny Dockera):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nTo wygl\u0105da i dzia\u0142a jak Docker-in-Docker, ale to nie jest Docker-in-Docker: gdy ten kontener b\u0119dzie tworzy\u0142 dodatkowe kontenery, b\u0119d\u0105 one tworzone w Dockerze wy\u017cszego poziomu. Nie do\u015bwiadczysz skutk\u00f3w ubocznych zagnie\u017cd\u017cenia, a pami\u0119\u0107 podr\u0119czna kompilacji b\u0119dzie wsp\u00f3\u0142dzielona dla wielu wywo\u0142a\u0144.<\/p>\n<p>Uwaga: wcze\u015bniejsze wersje tego artyku\u0142u zaleca\u0142y pod\u0142\u0105czenie pliku wykonywalnego Dockera z hosta do kontenera. Teraz sta\u0142o si\u0119 to niewiarygodne, poniewa\u017c mechanizm Dockera nie jest ju\u017c stosowany do statycznych lub prawie statycznych bibliotek.<\/p>\n<p>Tak wi\u0119c, je\u015bli chcesz u\u017cywa\u0107 Dockera z Jenkins CI, masz 2 opcje:<br \/>\nzainstalowa\u0107 CLI Dockera, korzystaj\u0105c z podstawowego systemu pakowania obrazu (tzn. je\u015bli tw\u00f3j obraz oparty jest na Debianie, u\u017cyj pakiet\u00f3w .deb), korzystaj\u0105c z API Dockera.<\/p>\n<h3>Troch\u0119 reklamy \ud83d\ude42<\/h3>\n<p>\nDzi\u0119kujemy, \u017ce jeste\u015b z nami. Podobaj\u0105 Ci si\u0119 nasze artyku\u0142y? Chcesz zobaczy\u0107 wi\u0119cej interesuj\u0105cych materia\u0142\u00f3w? Wspieraj nas sk\u0142adaj\u0105c zam\u00f3wienie lub polecaj\u0105c nas znajomym, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">chmurowe VPS dla programist\u00f3w od 4,99 $<\/a><\/noindex>, <b>unikatowy odpowiednik serwer\u00f3w entry-level, kt\u00f3ry zosta\u0142 stworzony przez nas dla Ciebie:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Ca\u0142a prawda o VPS (KVM) E5-2697 v3 (6 rdzeni) 10GB DDR4 480GB SSD 1Gbps od 19 $ lub jak prawid\u0142owo podzieli\u0107 serwer?<\/a><\/noindex> (dost\u0119pne opcje z RAID1 i RAID10, do 24 rdzeni i do 40GB DDR4).<\/p>\n<p><b>Dell R730xd dwa razy ta\u0144szy w centrum danych Equinix Tier IV w Amsterdamie?<\/b> Tylko u nas <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100TB od 199 dolar\u00f3w<\/a><\/noindex> w Holandii! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 dolar\u00f3w!<\/b><\/b> Czytaj o tym <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Jak zbudowa\u0107 infrastruktur\u0119 klasy korporacyjnej z zastosowaniem serwer\u00f3w Dell R730xd E5-2650 v4 kosztuj\u0105cych 9000 euro za grosze?<\/a><\/noindex><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/488536\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Docker-in-Docker \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 Docker-\u0434\u0435\u043c\u043e\u043d, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-in-Docker \u0431\u044b\u043b\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Docker. \u041c\u043d\u043e\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Jenkins CI. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Docker \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Jenkins CI. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52072,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-52071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\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\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\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\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\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-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T02:34:24+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\udd47Dobrze przemy\u015bl, zanim zdecydujesz si\u0119 na u\u017cycie Docker-in-Docker dla CI lub \u015brodowiska testowego | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","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\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/pl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","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-02-18T02:34:24+00:00","article:modified_time":"2020-02-18T02:34:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52071","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 20:50:23","updated":"2022-09-27 17:46:30","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\/52071","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=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}