Чи добре запускати докер зсередини докера?


185

Я запускаю Дженкінса в контейнер Docker. Цікаво, чи нормально контейнер Дженкінса також бути хокером Docker? Я думаю про те, щоб запустити новий контейнер докер для кожної збірки тесту інтеграції зсередини Дженкінса (для запуску баз даних, брокерів повідомлень тощо). Таким чином контейнери повинні бути закриті після завершення тестів на інтеграцію. Чи є причина таким чином уникати запуску контейнерів докера з іншого контейнера докера таким чином?


11
Іншою можливістю є встановлення гніздо докера від хоста як об'єм в контейнері. Це дозволяє створювати контейнери "братів" та має перевагу в тому, що можна повторно використовувати кеш.
Адріан Муат

4
Я виявив, що при використанні докерного сокета від хоста, що у випадках, коли я хочу встановити зовнішні томи, необхідно встановити шлях гучності відносно хоста, оскільки саме там працює демон демона. Встановлення його відносно контейнера, який запускає контейнери, не обов'язково працює, якщо шляхи не збігаються.
Якоб Рунге

Відповіді:


224

Запуск докера всередині Docker (aka dind ), хоча це можливо, слід уникати, якщо це можливо. (Джерело надано нижче.) Натомість ви хочете створити спосіб, щоб ваш основний контейнер виробляв та спілкувався з контейнерами для братів .

Джером Петаццоні - автор функції, яка дозволила Докеру запуститись у контейнер Докера - насправді написав допис у блозі, в якому заявив, що цього не робити . Випадок використання, який він описує, відповідає точному випадку використання OP контейнера CI Docker, який повинен запускати завдання всередині інших контейнерів Docker.

Petazzoni перераховує дві причини, чому dind клопітно:

  1. Він не дуже добре співпрацює з модулями безпеки Linux (LSM).
  2. Це створює невідповідність файлових систем, що створює проблеми для контейнерів, створених всередині батьківських контейнерів.

З цієї публікації в блозі він описує таку альтернативу,

[Найпростіший спосіб - просто виставити гніздо Docker на ваш контейнер CI, прив’язавши його до -vпрапора.

Простіше кажучи, коли ви запускаєте контейнер CI (Jenkins або інший), замість того, щоб щось зламати разом із Docker-in-Docker, почніть його з:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Тепер цей контейнер матиме доступ до гніздо Docker, тому він зможе запускати контейнери. За винятком того, що замість запуску "дитячих" контейнерів, він запустить контейнери "побратими".


1
Як запускати команди докер, не sudoроблячи так? Дякую
c4k

3
Вам потрібно додати користувача в dockerгрупу: sudo usermod -aG docker $USER. Після цього вам потрібно буде відкласти.
predmijat

2
Як переписатись зсередини монети?
thiagowfx

1
@AlexanderMills Це те саме, що ваш гніздо для докера також розташоване, /var/run/docker.sockколи ви запускаєте докер для Mac на вашій машині macos.
Брюс Нд

1
що з вікнами? у мене немає/var/run/docker.sock
Абдельгафід

54

Я відповів на подібне запитання раніше про те, як запустити контейнер Docker всередині Docker .

Запустити докер всередині докера, безумовно, можливо. Головне, щоб ви runвідкрили контейнер із додатковими привілеями (починаючи з --privileged=true), а потім встановите докер у цей контейнер.

Перегляньте це повідомлення в блозі для отримання додаткової інформації: Docker-in-Docker .

Один потенційний випадок використання для цього описаний у цій статті . У блозі описано, як будувати докер-контейнери в контейнері докерів Дженкінса.

Однак Docker всередині Docker - це не рекомендований підхід до вирішення подібних проблем. Натомість, рекомендований підхід полягає у створенні контейнерів "братів", як описано у цій публікації

Отже, запуск Docker всередині Docker багато хто вважав гарним типом рішення для подібного типу проблем. Зараз тенденція полягає в тому, щоб замість цього використовувати контейнери "братів". Дивіться відповідь від @predmijat на цій сторінці для отримання додаткової інформації.


Дивіться коментар нижче про те, щоб уникнути докера в докер.
Дан Полтавський

6

Добре запускати Docker-in-Docker (DinD), і фактично Docker (компанія) має офіційне зображення DinD для цього.

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

Альтернативне рішення запуску Docker за допомогою контейнерів для братів (наприклад, Docker-out-of-Docker або DooD) не потребує привілейованого контейнера, але має кілька недоліків, які випливають з того, що ви запускаєте контейнер з контексту, який є відрізняється від того, у якому він працює (тобто ви запускаєте контейнер усередині контейнера, але він працює на рівні хоста, а не всередині контейнера).

Я написав блог , який описує плюси / мінуси DinD проти Dood тут .

Сказавши це, Nestybox (запуск, який я щойно створив) працює над рішенням, яке безпечно запускає справжню Docker-in-Docker (не використовуючи привілейовані контейнери). Ви можете перевірити це на веб- сайті www.nestybox.com .


0

Так, ми можемо запустити докер в docker, нам потрібно приєднати unix sockeet "/var/run/docker.sock", на якому демон докера за замовчуванням прослуховує як об'єм до батьківського докера за допомогою "-v / var / run /docker.sock:/var/run/docker.sock ". Іноді проблеми з дозволом можуть виникнути для socket daemon socket, для якого можна написати "sudo chmod 757 /var/run/docker.sock".

А також знадобиться запустити докер у привілейованому режимі, так що команди будуть:

sudo chmod 757 /var/run/docker.sock

запуск докера --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.