{"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\/de\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden.\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker ist eine virtualisierte Docker-Daemon-Umgebung, die innerhalb des Containers selbst l\u00e4uft, um Container-Images zu erstellen. Das Hauptziel der Entwicklung von Docker-in-Docker war es, dem Docker-Team bei der schnelleren Entwicklung von Docker zu helfen. Viele verwenden es, um Jenkins CI auszuf\u00fchren. Zun\u00e4chst scheint es in Ordnung zu sein, aber anschlie\u00dfend treten Probleme auf, die vermieden werden k\u00f6nnen, wenn Docker im Jenkins CI-Container installiert wird. In diesem Artikel erfahren Sie, wie Sie das erreichen k\u00f6nnen. Wenn Sie an der endg\u00fcltigen L\u00f6sung ohne Details interessiert sind, lesen Sie einfach den letzten Abschnitt des Artikels \u201eL\u00f6sung des Problems\u201c.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden.\" 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: \u201eGut\u201c<\/h3>\n<p>\nVor \u00fcber zwei Jahren habe ich in Docker eingef\u00fcgt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">Das Flag<\/a><\/noindex> \u2013privileged und die <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">erste Version von dind geschrieben.<\/a><\/noindex>Ziel war es, dem Hauptteam zu helfen, Docker schneller zu entwickeln. Vor der Einf\u00fchrung von Docker-in-Docker sah der typische Entwicklungszyklus folgenderma\u00dfen aus:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build;<\/li>\n<li>den laufenden Docker-Daemon stoppen;<\/li>\n<li>einen neuen Docker-Daemon starten;<\/li>\n<li>testen;<\/li>\n<li>Wiederholung des Zyklus.<\/li>\n<\/ul>\n<p>\nWenn Sie jedoch einen sauberen, reproduzierbaren Build erstellen wollten (also im Container), wurde es komplizierter:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>Stellen Sie sicher, dass eine funktionierende Version von Docker l\u00e4uft;<\/li>\n<li>einen neuen Docker mit dem alten Docker bauen;<\/li>\n<li>den Docker-Daemon stoppen;<\/li>\n<li>einen neuen Docker-Daemon starten;<\/li>\n<li>testen;<\/li>\n<li>den neuen Docker-Daemon stoppen;<\/li>\n<li>wiederholen.<\/li>\n<\/ul>\n<p>\nMit Docker-in-Docker wurde der Prozess vereinfacht:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>Bauen + Starten in einem Schritt;<\/li>\n<li>Wiederholung des Zyklus.<\/li>\n<\/ul>\n<p>\nIst das nicht viel besser?<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden.\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \u201eSchlecht\u201c<\/h3>\n<p>\nAllerdings ist Docker-in-Docker, entgegen weit verbreiteter Meinung, nicht zu 100 % voller Sterne, Ponys und Einh\u00f6rner. Es gibt einige Probleme, \u00fcber die der Entwickler informiert sein sollte.<\/p>\n<p>Eine der Herausforderungen betrifft LSM (Linux-Sicherheitsmodule) wie AppArmor und SELinux: Beim Starten eines Containers kann der \"interne Docker\" versuchen, Sicherheitsprofile anzuwenden, die mit dem \"\u00e4u\u00dferen Docker\" in Konflikt stehen oder ihn verwirren. Dies war das komplizierteste Problem, das gel\u00f6st werden musste, als wir versuchten, die urspr\u00fcngliche Implementierung des Flags \u2013privileged zu kombinieren. Meine \u00c4nderungen funktionierten, und alle Tests h\u00e4tten auf meiner Debian-Maschine sowie auf den Test-VMs von Ubuntu ebenfalls bestanden, aber sie w\u00e4ren auf Michael Crosbys Maschine (soweit ich mich erinnere, hatte er Fedora) abgest\u00fcrzt und gescheitert. Ich kann mich nicht an den genauen Grund des Problems erinnern, aber es ist m\u00f6glich, dass es daran lag, dass Mike ein weiser Mann ist, der SELINUX=enforce verwendet (ich habe AppArmor benutzt), und meine \u00c4nderungen nicht auf die SELinux-Profile R\u00fccksicht nahmen.<\/p>\n<h3>Docker-in-Docker: \"B\u00f6se\"<\/h3>\n<p>\nDas zweite Problem betrifft die Docker-Speicher-Treiber. Wenn Sie Docker-in-Docker ausf\u00fchren, arbeitet der externe Docker \u00fcber ein herk\u00f6mmliches Dateisystem (EXT4, BTRFS oder jedes andere, das Sie haben), w\u00e4hrend der interne Docker \u00fcber ein Copy-on-Write-Dateisystem (AUFS, BTRFS, Device Mapper usw., je nachdem, was f\u00fcr den externen Docker konfiguriert ist) arbeitet. Dadurch ergeben sich viele Kombinationen, die nicht funktionieren werden. Zum Beispiel k\u00f6nnen Sie AUFS nicht \u00fcber AUFS ausf\u00fchren. <\/p>\n<p>Wenn Sie BTRFS \u00fcber BTRFS ausf\u00fchren, sollte es zun\u00e4chst funktionieren, aber sobald Untervolumes entstehen, k\u00f6nnen Sie das \u00fcbergeordnete Subvolume nicht mehr l\u00f6schen. Das Device Mapper-Modul hat keinen Namensraum, weswegen, wenn mehrere Docker-Instanzen es auf derselben Maschine verwenden, alle diese Instanzen die Images der anderen sehen (und darauf Einfluss nehmen) sowie auf die Backup-Ger\u00e4te der Container. Das ist problematisch.<\/p>\n<p>Es gibt Umgehungsm\u00f6glichkeiten f\u00fcr viele dieser Probleme. Wenn Sie beispielsweise AUFS in einem internen Docker verwenden m\u00f6chten, wandeln Sie einfach den Ordner \/var\/lib\/docker um, und alles funktioniert einwandfrei. Docker hat einige grundlegende Namensr\u00e4ume zu den Zielnamen des Device Mappers hinzugef\u00fcgt, sodass, wenn mehrere Docker-Aufrufe auf einer Maschine ausgef\u00fchrt werden, sie sich nicht \u201e\u00fcberlappen\u201c werden.<\/p>\n<p>Allerdings ist eine solche Konfiguration alles andere als einfach, wie man an diesen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">Artikel<\/a><\/noindex> im dind-Repository auf GitHub sehen kann.<\/p>\n<h3>Docker-in-Docker: Es wird noch komplizierter.<\/h3>\n<p>\nUnd was ist mit dem Build-Cache? Das kann ebenfalls ziemlich herausfordernd sein. Oft fragen mich Leute: \u201eWenn ich Docker-in-Docker ausf\u00fchre, wie kann ich die Bilder auf meinem Host verwenden, anstatt alles erneut in meinem internen Docker herunterzuladen?\u201c<\/p>\n<p>Einige einfallsreiche Personen haben versucht, \/var\/lib\/docker vom Host im Docker-in-Docker-Container zu binden. Manchmal teilen sie \/var\/lib\/docker zwischen mehreren Containern.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcberlegen Sie gut, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden.\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>M\u00f6chten Sie Daten besch\u00e4digen? Denn genau das wird Ihre Daten besch\u00e4digen!<\/i><\/p>\n<p>Der Docker-Daemon wurde offensichtlich entwickelt, um exklusiven Zugriff auf \/var\/lib\/docker zu haben. Nichts anderes sollte \u201eber\u00fchren, anstupsen oder anfassen\u201c irgendwelche Docker-Dateien in diesem Verzeichnis.<\/p>\n<p>Warum ist das so? Weil es das Ergebnis einer der schwierigsten Lektionen ist, die bei der Entwicklung von dotCloud gelernt wurden. Die Container-Engine von dotCloud arbeitete mit mehreren Prozessen, die gleichzeitig auf \/var\/lib\/dotcloud zugriffen. Klug eingef\u00fchrte Tricks wie die atomare Ersetzung von Dateien (statt Bearbeitung vor Ort), das \u201aPfeffern\u2018 von Code mit empfehlenden und verbindlichen Sperren sowie andere Experimente mit sicheren Systemen wie SQLite und BDB funktionierten nicht immer zuverl\u00e4ssig. Als wir unsere Container-Engine \u00fcberarbeiteten, die schlie\u00dflich zu Docker wurde, war eine der entscheidenden Designentscheidungen, alle Containeroperationen unter einem einzigen Daemon zu b\u00fcndeln, um all diesen Unsinn des gleichzeitigen Zugriffs zu beseitigen.<\/p>\n<p>Verstehen Sie mich nicht falsch: Es ist durchaus m\u00f6glich, etwas Gutes, Zuverl\u00e4ssiges und Schnelles zu erstellen, das mehrere Prozesse und modernes paralleles Management umfasst. Doch wir glauben, es ist einfacher und leichter, Code zu schreiben und zu warten, wenn man Docker als einzigen Akteur verwendet.<\/p>\n<p>Das bedeutet, dass Sie, wenn Sie das Verzeichnis \/var\/lib\/docker zwischen mehreren Docker-Instanzen teilen, auf Probleme sto\u00dfen werden. Nat\u00fcrlich kann das funktionieren, besonders in den fr\u00fchen Testphasen. \u201eHey, Mama, ich kann mit Docker Ubuntu starten!\u201c Aber versuchen Sie, etwas Komplexeres zu tun, wie das gleiche Image aus zwei verschiedenen Instanzen abzurufen, und Sie werden sehen, wie die Welt brennt.<\/p>\n<p>Das bedeutet, dass, wenn Ihr CI-System Builds und Rebuilds durchf\u00fchrt, Sie jedes Mal, wenn Sie den Docker-in-Docker-Container neu starten, das Risiko eingehen, eine atomare Bombe in seinem Cache zur\u00fcckzusetzen. Das ist \u00fcberhaupt nicht cool!<\/p>\n<h3>Problem l\u00f6sen<\/h3>\n<p>\nLassen Sie uns einen Schritt zur\u00fcckgehen. Brauchen Sie wirklich Docker-in-Docker oder m\u00f6chten Sie einfach nur die M\u00f6glichkeit haben, Docker aus Ihrem CI-System heraus auszuf\u00fchren, insbesondere Container und Images zu erstellen und zu starten, w\u00e4hrend sich dieses CI-System selbst in einem Container befindet?<\/p>\n<p>Ich wette, dass die meisten Leute die letzte Variante ben\u00f6tigen, also m\u00f6chten sie, dass ein CI-System wie Jenkins Container starten kann. Der einfachste Weg, dies zu erreichen, besteht darin, den Docker-Socket in Ihren CI-Container einzuf\u00fcgen und ihn mit dem Flag -v zu verkn\u00fcpfen.<\/p>\n<p>Einfacher gesagt, wenn Sie Ihren CI-Container (Jenkins oder einen anderen) starten, versuchen Sie nicht, etwas mit Docker-in-Docker zu hacken, sondern starten Sie ihn mit der Zeile:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nJetzt hat dieser Container Zugriff auf den Docker-Socket und kann daher Container starten. Statt \u201eKind\u201c-Containern wird er jedoch \u201everwandte\u201c Container starten.<\/p>\n<p>Versuchen Sie dies mit dem offiziellen Docker-Image (das die Docker-Bin\u00e4rdatei enth\u00e4lt):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nEs sieht aus und funktioniert wie Docker-in-Docker, aber es ist kein Docker-in-Docker: Wenn dieser Container zus\u00e4tzliche Container erstellt, werden diese im \u00fcbergeordneten Docker erstellt. Sie werden keine Nebenwirkungen der Verschachtelung erleben, und der Build-Cache wird f\u00fcr mehrere Aufrufe gemeinsam genutzt.<\/p>\n<p>Hinweis: Fr\u00fchere Versionen dieses Artikels empfehlen, die Docker-Bin\u00e4rdatei vom Host an den Container zu koppeln. Dies ist mittlerweile nicht mehr zuverl\u00e4ssig, da der Docker-Mechanismus nicht mehr auf statische oder nahezu statische Bibliotheken anwendbar ist.<\/p>\n<p>Wenn Sie Docker aus Jenkins CI verwenden m\u00f6chten, haben Sie 2 Optionen:<br \/>\nEntweder das Docker CLI mit dem Basis-Paketverwaltungssystem zu installieren (d. h. verwenden Sie .deb-Pakete, wenn Ihr Image auf Debian basiert) oder das Docker API zu nutzen.<\/p>\n<h3>Ein wenig Werbung \ud83d\ude42<\/h3>\n<p>\nDanke, dass Sie bei uns bleiben. Gefallen Ihnen unsere Artikel? M\u00f6chten Sie mehr interessante Inhalte sehen? Unterst\u00fctzen Sie uns, indem Sie eine Bestellung aufgeben oder uns Ihren Freunden empfehlen. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">Cloud-VPS f\u00fcr Entwickler ab 4,99 $<\/a><\/noindex>, <b>eine einzigartige Alternative zu Einsteiger-Servern, die wir f\u00fcr Sie entwickelt haben:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Alles \u00fcber VPS (KVM) E5-2697 v3 (6 Kerne) 10GB DDR4 480GB SSD 1Gbps ab 19 $ oder wie man einen Server richtig teilt?<\/a><\/noindex> (Verf\u00fcgbar sind Optionen mit RAID1 und RAID10, bis zu 24 Kerne und bis zu 40GB DDR4).<\/p>\n<p><b>Dell R730xd im Equinix Tier IV Rechenzentrum in Amsterdam zum halben Preis?<\/b> Nur bei uns <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 100 TB ab 199 $<\/a><\/noindex> in den Niederlanden! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 ab 99 $!<\/b><\/b> Lesen Sie dar\u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Wie man eine Unternehmenskosten-Infrastruktur mit Dell R730xd E5-2650 v4-Servern f\u00fcr ein paar Euro aufbaut?<\/a><\/noindex><br \/>\n<br \/>Quelle: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"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\" \/>\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\/de\/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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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=\"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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47 Denken Sie gut nach, bevor Sie Docker-in-Docker f\u00fcr CI oder Testumgebungen verwenden | ProHoster","description":"Docker-in-Docker ist eine virtualisierte Umgebung, in der der Docker-Daemon im Container selbst l\u00e4uft, um Container-Images zu bauen. Das Hauptziel beim Erstellen von Docker-in-Docker war, die Entwicklung von Docker selbst zu unterst\u00fctzen. Viele verwenden es, um Jenkins CI auszuf\u00fchren. Zun\u00e4chst scheint dies sinnvoll zu sein, aber es treten Probleme auf, die vermieden werden k\u00f6nnen, indem Docker im Jenkins CI-Container installiert wird. Dieser Artikel beschreibt, wie das geht.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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":"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","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}