Можно ли управлять Docker изнутри контейнера?
Я экспериментировал с упаковкой своего сценария развертывания сайта в контейнер Docker. Идея заключается в том, что все мои сервисы будут находиться внутри контейнеров, а затем использовать специальный контейнер управления для управления другими контейнерами.
Идея заключается в том, что мой хост-компьютер должен быть настолько тупым, насколько это возможно (в настоящее время я использую CoreOS, единственное состояние - конфигурация systemd, запускающая мой контейнер управления).
Контейнер управления будет использоваться в качестве конечной цели для создания новых контейнеров на основе исходного кода, который я ему отправляю (я думаю, по крайней мере, с использованием SSH это то, что я сейчас использую). Сценарий также управляет постоянными данными (файлами базы данных, журналами и т. Д.) В отдельном контейнере и управляет резервными копиями для него, так что я могу разбирать и перестраивать все, даже не касаясь каких-либо данных. Для этого я пересылаю сокет Docker Unix, используя -v
опция при запуске контейнера управления.
Это хорошая или плохая идея? Могу ли я столкнуться с проблемами при этом? Я нигде не читал, что это обескураживает, но я также не нашел много примеров других, делающих это.
1 ответ
Это совершенно нормально, и вы не единственный, кто это делает:-)
Другим примером использования является использование контейнера управления для переключения аутентификации для Docker REST API. Он будет принимать подключения через TCP-порт EXPOSE, который сам публикуется с -p
и запросы прокси к сокету UNIX.
Поскольку этот вопрос по-прежнему актуален сегодня, я хочу ответить более подробно:
Это можно работать с этой установкой, где вы передаете гнездо Docker в запущенном контейнер. Это делается многими решениями и хорошо работает. НО вы должны думать о проблемах, связанных с этим:
- Если вы хотите использовать сокет, вы должны быть root внутри контейнера. Это позволяет выполнять любую команду внутри контейнера. Так, например, если злоумышленник контролирует этот контейнер, он контролирует все остальные контейнеры докеров.
- Если вы открываете сокет с TCP-портом, как предлагает jpetzzo, у вас будет та же проблема, даже хуже, потому что теперь вам даже не придется скомпрометировать контейнер, а только сеть. Если вы отфильтруете связи (как указано в его комментарии), первая проблема останется.
TL; DR;
Вы можете это сделать, и это сработает, но тогда вам нужно немного подумать о безопасности.