Можно ли запускать несколько программ в контейнере Docker?
Я пытаюсь разобраться в Docker с точки зрения развертывания приложения, которое предназначено для запуска на компьютерах пользователей. Мое приложение-это просто веб-приложение flask и база данных mongo. Обычно я устанавливаю и в виртуальной машине, и перенаправляю порт хоста в гостевое веб-приложение. Я хотел бы дать докеру попробовать, но я не уверен, как я должен использовать более одной программы. В документации говорится, что может быть только одна точка входа, так как у меня может быть приложение Mongo и моя колба. Или должны ли они быть в отдельных содержаниях, в каком случае они разговаривают друг с другом и как это облегчает распространение приложения?
6 ответов:
Может быть только одна точка входа, но эта цель обычно является сценарием, который запускает столько программ, сколько необходимо. Вы можете дополнительно использовать, например, Supervisord или аналогичный, чтобы позаботиться о запуске нескольких служб внутри одного контейнера. Это пример контейнера docker, работающего с mysql, apache и wordpress в одном контейнере.
Допустим, у вас есть одна база данных, используемая одним веб-приложением. Тогда, вероятно, легче запустить оба в одном контейнере.
Если у вас есть общая база данных, которая используется несколькими приложениями, то было бы лучше запустить базу данных в своем собственном контейнере, а приложения-в своих собственных контейнерах.
Существует по крайней мере две возможности того, как приложения могут взаимодействовать друг с другом, когда они выполняются в разных контейнерах:
- используйте открытые IP-порты и подключайтесь через них.
- последние версии docker Поддержка связывание .
У меня было аналогичное требование запуска стека ламп, Mongo DB и моих собственных сервисов
Docker-это виртуализация на базе ОС, поэтому он изолирует свой контейнер вокруг запущенного процесса, поэтому он требует, чтобы по крайней мере один процесс выполнялся на переднем плане.
Таким образом, вы предоставляете свой собственный сценарий запуска в качестве точки входа, таким образом, ваш сценарий запуска становится расширенным сценарием Docker image, в котором вы можете стек любое количество служб, поскольку по крайней мере одна служба переднего плана является НАЧАЛОСЬ, КОТОРОЕ ТОЖЕ БЛИЖЕ К КОНЦУ
Итак, мой файл изображения Docker имеет две строки ниже в самом конце:
COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"]В моем скрипте я запускаю все MySQL, MongoDB, Tomcat и т. д. В конце концов я запускаю свой Apache в качестве основного потока.
source /etc/apache2/envvars /usr/sbin/apache2 -DFOREGROUNDЭто позволяет мне запускать все мои службы и поддерживать контейнер живым с последней запущенной службой на переднем плане
Надеюсь, это поможет
UPDATE : С тех пор, как я в последний раз ответил на этот вопрос, появились новые вещи, такие как Docker compose , который может помочь вам запустить каждый сервис на своем собственном контейнере, но связать их все вместе как зависимости между этими сервисами, попробуйте узнать больше о docker-compose и использовать его, это более элегантный способ, если ваша потребность не совпадает с ним.
Они могут находиться в отдельных контейнерах, и действительно, если бы приложение также было предназначено для работы в более широкой среде, они, вероятно, были бы.
Многоконтейнерная система потребует некоторой дополнительной оркестровки, чтобы иметь возможность вывести все необходимые зависимости, хотя в Docker v0.6.5+ есть новый инструмент, чтобы помочь с этим встроенным в сам Docker - связывание. С решением мульти-машины, его все еще что-то, что должно быть организовано снаружи Докера окружающая среда однако.
С двумя различными контейнерами две части все еще взаимодействуют по TCP/IP, но если порты не были заблокированы специально (не рекомендуется, так как вы не сможете запустить более одной копии), вам придется передать новый порт, который база данных была открыта для приложения, чтобы оно могло взаимодействовать с Mongo. Это опять-таки то, с чем может помочь связывание.
Для более простой, небольшой установки, где все зависимости являются также возможен переход в один и тот же контейнер, когда и база данных, и среда выполнения Python запускаются программой, которая изначально называется точкой входа. Это может быть так же просто, как сценарий оболочки или какой - то другой контроллер процесса - супервайзер довольно популярен, и ряд примеров существует в общедоступных Dockerfiles.
Я согласен с другими ответами, что использование двух контейнеров предпочтительнее, но если вы твердо решили объединить несколько служб в одном контейнере, вы можете использовать что-то вроде supervisord.
В Hipache, например, включенный Dockerfile запускает супервайзер, а супервайзер файла.conf указывает для запуска hipache и redis-сервера.
Docker предоставляетпару примеров о том, как это сделать. Легкий вариант - это:
Поместите все ваши команды в скрипт-оболочку, завершите тестирование и отладочная информация. Запустите скрипт-оболочку как ваш
CMD. Это очень наивный пример. Во-первых, скрипт-оболочка:#!/bin/bash # Start the first process ./my_first_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_first_process: $status" exit $status fi # Start the second process ./my_second_process -D status=$? if [ $status -ne 0 ]; then echo "Failed to start my_second_process: $status" exit $status fi # Naive check runs checks once a minute to see if either of the processes exited. # This illustrates part of the heavy lifting you need to do if you want to run # more than one service in a container. The container will exit with an error # if it detects that either of the processes has exited. # Otherwise it will loop forever, waking up every 60 seconds while /bin/true; do ps aux |grep my_first_process |grep -q -v grep PROCESS_1_STATUS=$? ps aux |grep my_second_process |grep -q -v grep PROCESS_2_STATUS=$? # If the greps above find anything, they will exit with 0 status # If they are not both 0, then something is wrong if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then echo "One of the processes has already exited." exit -1 fi sleep 60 doneДалее, файл Dockerfile:
FROM ubuntu:latest COPY my_first_process my_first_process COPY my_second_process my_second_process COPY my_wrapper_script.sh my_wrapper_script.sh CMD ./my_wrapper_script.sh
Я категорически не согласен с некоторыми предыдущими решениями, которые рекомендовали запускать обе службы в одном контейнере. Есть хорошие варианты использования для супервайзера или подобных программ, но запуск веб-приложения + базы данных не является их частью.
Для этого вам определенно следует использовать docker-compose.
Comments