dimitrius86
@dimitrius86
Сисадмин. Немного программирую.

Зачем нужен Docker in Docker (Dind)?

Здравствуйте знатоки!

Объясните, пожалуйста. Я смотрю видеокурс по Gitlab Ci/Cd и там часто затрагивается тема docker in docker. Но я не могу понять для чего это нужно.
Я вот понимаю, для чего отдельный докер контейнер запускать, но вот зачем контейнер внутри контейнера - не пойму...И в рамках Ci/Cd процессов.
  • Вопрос задан
  • 364 просмотра
Решения вопроса 1
Могу объяснить: когда вы запускаете Job-ы в docker контейнере и вам потребовалось обрати ться к демону докера (чтобы собрать образы напрмер) у вас есть два варианта: подключиться к тому же демону, в котором вы сами сидите (путем проброса сокета демона докера в контейнер, так назывемый socket binding), однако в таком случае возникают серьезные проблемы с безопасностью, так как из job-ы становится возможным управлять основным демоном и соответственно глушить чужие job-ы или вытаскивать чужие образы, которые собирались на этом же демоне. Поэтому пременяется другой подход: праллельно с контейнером в котором работает ваша job-а стартует еще один контейнер с демоном docker-in-docker, который доступен только для этой job-ы и не оставляет следов после ее завершения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
fzfx
@fzfx
18,5 дм
возможность запускать контейнер внутри контейнера нужна тогда, когда нет возможности запустить контейнер вне контейнера. например, когда для Gitlab CI/CD используется pipeline в контейнере (контейнер с gitlab-runner'ом), и в скриптах .gitlab-ci.yml имеются запуски других контейнеров (т. е. внутри контейнера с gitlab-runner'ом).
Ответ написан
Viji
@Viji
DevOps Engineer
Для того чтобы билдился или деплоился какой-то проект используются (временные) CI/CD агенты, которые часто представляют собой докер контейнеры с минимальным набором библиотек. Например нам нужно сбилдить приложение дотнет, но в агенте CI/CD нет dotnet команды и других библиотек. Таким образом мы запускаем внутри агента докер контейнер например из имейджа mcr.microsoft.com/dotnet/sdk, билдим в нем данное приложение и возвращаем dll-ки в агент, в качестве артифакта. Поскольку агент - сам докер контейнер, то у нас и получается докер в докере.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы