Подтвердить что ты не робот

Можно ли запускать докер изнутри докеров?

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

4b9b3361

Ответ 1

Запуск Docker внутри Docker (a.k.a. dind), по возможности, следует избегать, если это вообще возможно. (Источник представлен ниже.) Вместо этого вы хотите настроить способ для вашего основного контейнера производить и связываться с контейнерами-близнецами.

Жером Петаццони - автор функции, которая позволила Docker запускаться внутри контейнера Docker - на самом деле написала сообщение в блоге, в котором говорится о том, чтобы не делать этого. Пример использования, который он описывает, соответствует конкретному варианту использования OP контейнера CI Docker, который должен запускать задания внутри других контейнеров Docker.

Petazzoni перечисляет две причины, по которым неприятность:

  • Он плохо взаимодействует с модулями безопасности Linux (LSM).
  • Он создает несоответствие в файловых системах, что создает проблемы для контейнеров, созданных внутри родительских контейнеров.

Из этого сообщения в блоге он описывает следующую альтернативу:

[Самый простой способ - просто разоблачить сокет Docker в вашем контейнере CI, связав его с флагом -v.

Проще говоря, когда вы запускаете свой контейнер CI (Jenkins или другой), вместо того, чтобы взломать что-то вместе с Docker-in-Docker, запустите его с помощью

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

Теперь этот контейнер будет иметь доступ к сокету Docker и, следовательно, сможет запускать контейнеры. За исключением того, что вместо запуска "дочерних" контейнеров он запускает контейнеры "sibling".

Ответ 2

Ранее я отвечал на аналогичный вопрос о том, как запустить Docker-контейнер внутри Docker.

Запустить докер внутри докера определенно можно. Главное, чтобы вы run внешний контейнер с дополнительными привилегиями (начиная с --privileged=true), а затем установили докер в этот контейнер.

Проверьте это сообщение в блоге для получения дополнительной информации: Docker-in-Docker.

Один из возможных вариантов использования для этого описан в этой записи. В блоге описывается, как создавать док-контейнеры в док-контейнере Jenkins.

Однако Docker внутри Docker не является рекомендуемым подходом для решения проблем такого типа. Вместо этого рекомендуется создать "одноуровневые" контейнеры, как описано в этом посте.

Таким образом, запуск Docker внутри Docker многие считали хорошим решением для этого типа проблем. Теперь, тенденция состоит в том, чтобы использовать "родственные" контейнеры вместо этого. Смотрите ответ @predmijat на этой странице для получения дополнительной информации.

Ответ 3

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

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

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

Я написал блог с описанием плюсов и минусов DinD vs DooD здесь.

Сказав это, Nestybox (стартап, который я только что основал) работает над решением, которое безопасно выполняет настоящий Docker-in-Docker (без использования привилегированных контейнеров). Вы можете проверить это на www.nestybox.com.