Я пытаюсь обернуть голову вокруг Docker с точки зрения развертывания приложения, которое предназначено для запуска на компьютерах пользователей. Мое приложение - это просто веб-приложение для колб и база данных Mongo. Обычно я бы устанавливал как на виртуальную машину, так и перенаправлял порт хоста в гостевое веб-приложение. Я хотел бы попробовать Docker, но я не уверен, как мне использовать более одной программы. Документация говорит, что может быть только ENTRYPOINT, так как я могу иметь Mongo и мое приложение для колб. Или они должны быть в отдельных контейнерах, и в таком случае, как они общаются друг с другом и как это облегчает распространение приложения?
150
Ответы:
Может быть только одна ENTRYPOINT, но этой целью обычно является скрипт, который запускает столько программ, сколько необходимо. Вы можете дополнительно использовать, например, Supervisord или аналогичный, чтобы позаботиться о запуске нескольких служб внутри одного контейнера. Это пример docker-контейнера, выполняющего mysql, apache и wordpress в одном контейнере .
Скажем, у вас есть одна база данных, которая используется одним веб-приложением. Тогда, вероятно, легче запустить оба в одном контейнере.
Если у вас есть общая база данных, которая используется более чем одним приложением, было бы лучше запустить базу данных в своем собственном контейнере, а приложения - в своих собственных контейнерах.
Существует как минимум две возможности взаимодействия приложений друг с другом при работе в разных контейнерах:
источник
У меня было похожее требование запуска стека LAMP, Mongo DB и моих собственных сервисов
Docker - это виртуализация на основе ОС, поэтому он изолирует свой контейнер от работающего процесса, поэтому для него требуется как минимум один процесс, выполняющийся в FOREGROUND.
Таким образом, вы предоставляете свой собственный сценарий запуска в качестве точки входа, таким образом, ваш сценарий запуска становится расширенным сценарием образа Docker, в котором вы можете укладывать любое количество сервисов до тех пор, пока не будет запущен, по крайней мере, один забывчивый сервис, который слишком быстро приближается к концу
Итак, мой файл образа Docker имеет две строки ниже в самом конце:
В моем скрипте я запускаю все MySQL, MongoDB, Tomcat и т. Д. В конце я запускаю свой Apache как основной поток.
Это позволяет мне запускать все мои службы и поддерживать контейнер в рабочем состоянии, когда последний сервис начал находиться на переднем плане.
Надеюсь, поможет
ОБНОВЛЕНИЕ : С тех пор, как я последний раз отвечал на этот вопрос, появились новые вещи, такие как Docker compose , которые могут помочь вам запустить каждый сервис в отдельном контейнере, но связать их все вместе как зависимости между этими сервисами, попробуйте узнать больше о docker-compose и используйте его, это более элегантный способ, если ваши потребности не совпадают с ним.
источник
Я категорически не согласен с некоторыми предыдущими решениями, которые рекомендовали запускать обе службы в одном и том же контейнере. В документации четко указано, что это не рекомендуется :
Есть хорошие варианты использования для супервизора или подобных программ, но запуск веб-приложения + база данных не является их частью.
Вам определенно следует использовать docker-compose для этого и организовать несколько контейнеров с разными обязанностями.
источник
Они могут находиться в отдельных контейнерах, и, действительно, если приложение также предназначено для работы в более крупной среде, они, вероятно, будут.
Мультиконтейнерная система потребовала бы некоторой дополнительной оркестровки, чтобы иметь возможность вывести все необходимые зависимости, хотя в Docker v0.6.5 + есть новое средство для помощи, встроенное в сам Docker - Linking . В случае решения с несколькими машинами, это все же то, что должно быть организовано вне среды Docker.
С двумя разными контейнерами эти две части все еще обмениваются данными по TCP / IP, но если порты не были специально заблокированы (не рекомендуется, так как вы не сможете запустить более одной копии), вам придется пропустить новый порт что база данных была представлена приложению, чтобы она могла общаться с Mongo. Это опять то, с чем может помочь Linking.
Для более простой, небольшой установки, где все зависимости располагаются в одном и том же контейнере, также возможна запуск базы данных и среды выполнения Python программой, которая изначально называется ENTRYPOINT. Это может быть так же просто, как сценарий оболочки или другой контроллер процесса - Supervisord довольно популярен, и в общедоступных файлах Docker существует ряд примеров.
источник
Я согласен с другими ответами о том, что использование двух контейнеров предпочтительнее, но если вы настроены на создание нескольких сервисов в одном контейнере, вы можете использовать что-то вроде супервизора.
в Hipache, например, включенный Dockerfile запускает supervisord, а файл supervisord.conf указывает как на hipache, так и на redis-сервер для запуска.
источник
Докер предоставляет несколько примеров того, как это сделать. Облегченный вариант:
источник
Вы можете запустить 2 процесса на переднем плане, используя
wait
. Просто создайте скрипт bash со следующим содержимым. Напримерstart.sh
:В вашем Dockerfile начните с
источник
Если выделенный скрипт выглядит слишком дорого, вы можете явным образом запускать отдельные процессы
sh -c
. Например:источник