2017-01-18 5 views
3

Учитывая я следующий сценарий:Докер-компоновать, развернуть войну Tomcat, запустить оракул служба

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

Что мне нужно следующее:

  • Docker составляют YML

  • Tomcat Docker изображение - война развертывается здесь

  • Oracle докер изображение

  • fatdb развертывание банка - я LiquiBase скриптов, обновление БД схема упакована в fatdb баночки

Решения может быть:

version: '2' 
services: 
    web-tomcat: 
    image: tomcat:jre8 
    depends_on: 
     - db-oracle 
    db-oracle: 
    image: wnameless/oracle-xe-11g 

НО , необходимо решить несколько проблем:

  1. ждет оракула службу, чтобы быть готовым - решаются с ожидающей оберткой, как сообщил в докерах документации: wait-for-it
  2. ждет пользователей, которые будут создано - решаются путем ожидания цикла, который пытается подключиться к БД Oracle с пользователем создается
  3. ждут для схемы db, подготовленной с помощью развертывания жидкими жимами, и после этого развертывание войны с tomcat
  4. не заканчивается в ситуации. Я разворачиваю отдельный контейнер, чтобы сделать развертывание жировых отложений, и после этого он просто останется в состоянии Exited (0) как размещение жировых отложений одноразовая вещь, а не услуга

я в конечном итоге создание entrypoint.sh скрипт для того, чтобы иметь дб готовы перед развертыванием войны:

java -jar fatdb.jar update 
catalina.sh run 

и наиважнейшая EntryPoint в TOMCAT изображения

Есть ли лучшее решение, как подготовить схему базы данных перед развертыванием войны в докер-сочинении?

ответ

1

Я не знаю, является ли это «лучше», чем у вас в настоящее время, но я всегда подхожу к этому, думая, что у меня есть два развертывания, чтобы завершить мое приложение. У меня есть:

  1. Развертывание базы данных (которая включает в себя обновление схемы до последней версии, используя что-то вроде LiquiBase)
  2. развертывания приложения (который включает в себя развертывание последней версии моей WAR архива или однако он упакован)

Естественно, второе развертывание зависит от завершения и успешного завершения 1-го развертывания.

Итак, как мне смоделировать это с помощью докеров?Я все для ясности, поэтому я создаю два файла:

  1. докер-compose.database
  2. докер-compose.application

Я тогда процесс развертывания два шага:

Шаг 1:

docker-compose -p application-name -f docker-compose.database up -d database 
docker-compose -p application-name -f docker-compose.database run --rm database-migration 

Во-первых, мы начинаем - используя базу данных, используя docker-compose up. Во-вторых, мы запускаем миграцию базы данных.

Как вы отметите в своем вопросе, будет зависеть, что база данных будет «готова» после того, как docker-compose up вернется, поэтому логика миграции базы данных завернута в функцию проверки базы данных, которая запускает миграцию только после того, счастлив, что база данных доступна. Вы заметите, что я вызываю контейнер миграции базы данных с опцией --rm, что означает, что контейнер автоматически удаляется после завершения выполнения. Не нужно держать этот контейнер висеть, как только он выполнил свою работу.

Здесь также важно использовать опцию -p, предлагающую предложения для докеров. Это определяет project name для развертывания и гарантирует, что все контейнеры создаются на одном и том же docker network, что означает, что межконтейнерная связь по имени службы не является проблемой.

Шаг 2:

docker-compose -p application-name -f docker-compose.database -f docker-compose.application up -d application 

Docker Compose позволяет указать несколько файлов в составлении в командной строке, и это то, что я здесь делаю. В моем docker-compose.application файле у меня будет что-то вроде этого:

version: 2 
services: 
application: 
    image: my-tomcat-image 
    depends_on: database 

Служба базы данных определяется в файле docker-compose.database, и я знаю, что он сейчас уже работает (потому что шаг развертывания 1 полностью успешно). Поэтому я могу немедленно запустить сервис Tomcat, не ожидая чего-либо. Это помогает, поскольку у меня есть только «ожидание готовности базы данных к логике» в одном месте, то есть миграции базы данных. Сама служба Tomcat ожидает, что база данных будет там, а если нет, быстро сработает.

обертка вокруг шагов

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

Снова вы можете сохранить все просто, возможно, написав простой сценарий оболочки, чтобы обернуть команды команды docker-compose. Мне нравится уметь тестировать любые скрипты-оболочки, поэтому я обычно использую ruby ​​для чего-то подобного. Вы могли бы представить себе что-то вроде:

ruby deploy.rb 

deploy.rb сценария конечно подведения вашей многочисленной docker-compose команды.

Другие подходящие подходы - это такие вещи, как использование Jenkins или любых других инструментов конвейера CI/CD, чтобы сделать это за вас (учитывая, что вы можете сделать это на своей локальной машине).

Вы также можете начать поиск таких инструментов, как Terraform, которые обеспечивают «стандартизированный» подход для выполнения подобных действий, но это может быть чрезмерно убито для того, что вам нужно, когда простой сценарий-обертка может заставить вас работать и работать.

+0

Hi Rob. Спасибо за понимание! Я реорганизовал решение на основе вашего ответа, и мне он нравится (хотя решение более тяжелое для использования сокета-докера). Я также завернул его в сценарий оболочки и обычно выполнял его от Teamcity против Azure infra. Я посмотрю на Terraform, спасибо. Не могли бы вы также дать небольшое обновление относительно тестов на рубиновый блок? Как выглядит тест? –