Чому Докер-ін-Докер вважається поганим?


22

У серпні 2013 року Джером Петаццоні створив Docker у Докер, dindкоротше кажучи, це дозволило створити Docker-контейнери всередині контейнерів Docker, ця функціональність виявилася дуже популярною, в результаті чого у сховищі GitHub Jérôme було отримано понад тисячу зірок і триста вил.

Станом на Docker 1.8, випущений через два роки в серпні 2015 року, Docker безпосередньо підтримується Docker поза коробкою. Однак використання Docker у Docker має попередження, здавалося б, пов’язане з повідомленням Jérôme's Post: Використання Docker-in-Docker для вашої CI або тестового середовища? Подумай двічі. яка зосереджена на причинах, чому Docker у Docker не є чудовим вибором для постійної інтеграції.

Чому вважається поганим використовувати Docker в Docker? Це просто випадок уникнути Черепах аж донизу? чи міркування щодо ефективності?

Черепахи аж донизу!


Я не знайомий з докером, окрім того, як читав про нього. Але, думаючи про це, відчувається, що у вас хоста ОС на апаратному забезпеченні, що хост завантажує контейнер, то цей контейнер завантажує ще один. Здається, багато накладних, враховуючи, що ідея полягає у розгортанні зображення. Зображення малюнка картини ... Також цікавляться актуальними відповідями на це питання.
Не повернено грошей, не повертається

Ви пов'язуєте відповідь на своє запитання ... чи я щось пропускаю?
AnoE

Відповіді:


17

Побоювання щодо постійної інтеграції

Коротше кажучи: Docker in Docker (dind) не справляється з одночасністю.

Причина, чому ви не повинні використовувати dind для CI, полягає в тому, що Docker був розроблений, щоб мати виключний доступ до каталогу, який він використовує для зберігання (як правило /var/lib/docker). Dind не поважає цього, оскільки всі дочірні процеси використовують цей каталог одночасно. Кожен раз, коли ви перебудовуєте (наприклад, з CI), все, що стосується вашої програми в цьому каталозі, може бути викреслене і змушене почати з нуля. Як вашим користувачам сподобається, якби вони ввели свої платіжні реквізити, натиснули "Придбати" і раптом опинилися на екрані входу так, ніби ніколи нічого не робили? Це просто не добре UX. Дві відбудови відбуваються одразу? Це дійсно погано закінчиться для всіх учасників (включаючи цілісність даних).

Інші проблеми

З посилання, розміщеного в ОП, виникають занепокоєння щодо безпеки, оскільки система намагатиметься застосовувати політику безпеки дуже "CSS-подібним" способом, коли нижній контейнер може мати доступ до ресурсів зовнішнього контейнера, якщо прямо не заборонено. Пам'ятаєте, коли ви могли отримати доступ до ресурсів веб-сервера, зробивши щось на кшталт "mywebsite.com/../another_folder/private_resource.txt"? Крім того, іноді файлові системи просто не грають один з одним, коли вони вкладені таким чином.

Виправлення

На щастя, публікація блогу в ОП має гарне вирішення питання. Якщо ваші потреби не будуть задоволені "побудувати / запустити / натиснути контейнери Docker з самої вашої системи CI, що працює на Docker", ви можете використовувати -vрежим (додавання обсягу даних у ваш контейнер) на Docker-сокет (як правило /var/run/docker.sock:/var/run/docker.sock), щоб дозволити тип доступ вам потрібен до "спільного" обсягу даних. Ці контейнери будуть запускатися поряд із материнськими, а не під ними, примушуючи синхронний IO. Тепер у вас (майже) те саме, що і dind, але без недоліків, які Docker не будують для одночасності.

Довідка (від OP): Використання Docker-in-Docker для вашої CI або тестового середовища? Подумай двічі.


Ось один приклад описаного підходу (dood) для Дженкінса, але про деякі проблеми повідомлялося під час його використання hub.docker.com/r/psharkey/jenkins-dood
rombob

З цього пояснення я все ще не можу сказати, чи слід уникати dind у моєму випадку ... Мій збірник працює в контейнері docker і робить наступне: 1. Checkout repo.2. Start container & mount repo.3. Run some build-/test script inside container.На кожного агента завжди є лише один dind'-контейнер працює. Чи є ще проблеми з dind у цьому випадку використання?
helmesjo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.