2015-01-10 2 views
62

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

+6

Другая возможность заключается в том, чтобы установить гнездо докера со стороны хоста в качестве объема в контейнере. Это позволяет создавать контейнеры «sibling» и имеет то преимущество, что вы можете повторно использовать кеш. –

+1

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

ответ

76

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

Jérôme Petazzoni - автор функции, которая позволила Docker работать внутри контейнера Docker - фактически написана a blog post saying not to do it. Пример использования, который он описывает, соответствует конкретному варианту использования OP контейнера CI Docker, который должен выполнять задания внутри других контейнеров Docker.

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

  1. Это не очень хорошо взаимодействуют с модулями Linux безопасности (МНК).
  2. Это создает несоответствие файловых систем, создающих проблемы для контейнеров, созданных внутри родительских контейнеров.

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

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

Проще говоря, когда вы начинаете свой CI контейнер (Jenkins или другой), вместо того, чтобы хакерство что-то вместе с Докер-в-Докер, начните его с:

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

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

+0

Как выполнять команды докеров без 'sudo', когда делаете это так? Спасибо – c4k

+0

Вам нужно добавить пользователя в группу 'docker':' sudo usermod -aG docker $ USER'. После этого вам придется переустановить. – predmijat

+0

Как отрегулировать изнутри cointainer? – thiagowfx

24

Я ответил на аналогичный вопрос, прежде чем на how to run a Docker container inside Docker.

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

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

Один потенциальный прецедент для этого описан в this entry. В блоге описывается, как создавать контейнеры докеров в контейнере докеров Jenkins.

Однако Docker внутри Docker это не рекомендуемый подход для решения таких проблем. Вместо этого, рекомендуемый подход заключается в создании «родственный» контейнеры в described in this post

Таким образом, работает докер в Докер был многими считается хорошим типом решения такого типа задач. Теперь тенденция состоит в том, чтобы вместо этого использовать контейнеры «родного брата». См. the answer by @predmijat on this page для получения дополнительной информации.

+0

См. Комментарий ниже об избегании докеров в докере. –