Как настроить экземпляр GlassFish, работающий на AWS/ElasticBeanstalk / Docker?
Я использую GlassFish для обслуживания веб-приложения Java EE. Все отлично работает на моей локальной машине dev. У меня
- скопировал библиотеки postgres JDBC в нужное место
- настроил пул соединений и ресурс JDBC в консоли администратора Glassfish
- развернуто веб-приложение, которое использует указанное соединение
- видел результаты в моем браузере
Я пытаюсь развернуть это же приложение на AWS Elastic Beanstalk Экземпляр в GlassFish. AWS-EB использует Docker для развертывания экземпляра Glassfish. Я могу сделать только третий шаг выше (развернуть веб-приложение), и я полностью в недоумении, как сделать первые два.
Что я хотел бы сделать, это иметь веб-доступ к консоли администратора Glassfish через, Но это, похоже, не работает на любом уровне. Альтернативой было бы использовать стеклянную рыбу "asadmin" на моей локальной машине для настройки удаленной стеклянной рыбы, но я не могу этого сделать.
Как настройка экземпляра Glassfish, размещенного на AWS EB? Это вообще возможно?
Я сделал несколько замечаний, но я был бы признателен подтверждение или иначе:
- похоже, что у AWS есть команда в их CLI под названием "asadmin", которая касается автомасштабирования и имеет то же имя, что и "asadmin", который поставляется с glassfish. Помимо того, что поиски google трудно, два, кажется, не имеют ничего общего друг с другом
- Если я подключусь к экземпляру AWS EC2, содержащему пример Docker и Glassfish, следующие вещи происходят
- sudo docker ps возвращает, что есть порты 4848 / tcp, 8080 / tcp, 8181 / tcp, и что ни один не сопоставлены
- wget localhost: 8080 - соединение отклонено
- то же самое для 8181 и 4848
- wget localhost: 80 возвращает веб-страницу домашней страницы Glassfish
- в том же экземпляре работает докер проверить я получаю внутренний IP-адрес (назовите его 1.2.3.4), затем на этом экземпляре EC
- wget 1.2.3.4: 8080 (и 4848, 8181) все возвращаемые html-файлы
- wget 1.2.3.4: 80 - соединение отклонено
- Если я запускаю оболочку bash в контейнере docker, следующие вещи кажутся истинными
- wget localhost: 8080 (и 4848, 8181) все возвращение хорошо сформировано страницы
- wget localhost: 80 - соединение отклонено
поэтому, возможно, мне нужно сказать экземпляру EC2, чтобы он перешел с localhost на 1.2.3.4, но как я могу это сделать, когда балансировщик нагрузки EB масштабирует его.
любой совет был бы весьма признателен.
2 ответов
то, что следует, - это то, что работает для меня, но у меня такое чувство, что я что-то упускаю. Любые изменения/комментарии будут приветствоваться.
в развертывании EB/Docker есть различные крючки, которые позволяют выполнять крючки после развертывания в экземпляре glassfish, в контейнере docker, в экземпляре EB. Я использовал крючки после развертывания для настройки пула соединений. Вот как выглядит окончательная установка, просто для справки:
| | | \_WAR_/ | | |
| | \_Glassfish_/ | |
| \____Docker____/ |
\____EC2 Instance____/
в общий желаемый результат заключается в том, что после развертывания приложения в экземпляре Docker asadmin выполняются команды для создания пула соединений JDBC и превращения этого пула соединений в ресурс jdbc. На моей локальной машине, команды будут
asadmin create-jdbc-connection-pool
--datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource
--restype javax.sql.ConnectionPoolDataSource
--property user=USERNAME:password=PASSWORD:serverName=DBHOST:portNumber=5432:databaseName=DBNAME
poolName
asadmin create-jdbc-resource --connectionpoolid poolName jdbc/dev
где "jdbc / dev" - это имя, которое код java должен знать, чтобы получить соединение обычным способом, т. е.
InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/dev");
мы хотим, чтобы команды выполнялись внутри экземпляра docker, потому что экземпляр docker имеет доступ к переменным среды, которые вы объявляете в консоли администратора AWS, поэтому я могу передавать информацию о конфигурации, не имея ее в сценариях сборки.
для достижения этого результата мы требуем, чтобы файл был создан в экземпляре EC2 во время установки, в моем случае называется /opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh. Этот файл будет выполняться после развертывания, как root, в экземпляре EC2. Я буду называть его ec2-post-deploy-hook.
мы собираемся создать этот файл с помощью .ebextensions/.конфигурационный файл, как описано здесь
- http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html
- http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
мой .файл конфигурации имеет следующий содержание:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
date > /tmp/post 2>&1
dockerid=`docker ps | grep latest | cut -d" " -f1`
echo $dockerid >> /tmp/post 2>&1
docker ps >> /tmp/post 2>&1
docker exec $dockerid /var/app/WEB-INF/classes/setup_pool.sh >> tmp/post 2>&1
все, что после содержание: | заканчивается в ec2-post-deploy-hook.
я узнал эту идею от http://junkheap.net/blog/2013/05/20/elastic-beanstalk-post-deployment-scripts.
только последняя строка и 4-я последняя строка необходимы, но другие строки полезны для отладки. Вывод заканчивается в /tmp / post на экземпляре EC2.
один трюк в этом файле что мы всегда можем получить идентификатор контейнера Docker по
sudo docker ps | grep latest | cut -d" " -f1
потому что после развертывания будет запущен только один контейнер Docker, и в его имени будет "последний".
последняя строка ec2-post-deploy-hook использует docker для запуска внутри экземпляра docker тех команд, которые я изначально хотел запустить, то есть команды asadmin. Я развернуть файл setup_pool.sh внутри моей .файл war, поэтому он попадает в известное место во время развертывание. Мой setup_pool.sh выглядит так (и я называю это docker-post-deploy-hook):
dbuser=$PARAM1
dbpass=$PARAM2
dbhost=$PARAM3
dbname=$PARAM4
date > /tmp/setup_connections
echo '*********' >> /tmp/setup_connections
asadmin create-jdbc-connection-pool --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=${dbuser}:password=${dbpass}:serverName=${dbhost}:portNumber=5432:databaseName=${dbname} ei-connection-pool >> /tmp/setup_connections 2>&1
echo '*********' >> /tmp/setup_connections
asadmin create-jdbc-resource --connectionpoolid ei-connection-pool jdbc/dev >> /tmp/setup_connections 2>&1
echo '*********' >> /tmp/setup_connections
этот файл запускается в экземпляре docker. Два asadmin команды-это мясо, но опять же, есть некоторая отладка в /tmp/setup_connections в экземпляре docker
пароли и т. д. получены из среды AWS.
единственное, что я не могу сделать на данный момент, это иметь переменные среды AWS в первом развертывания. Я понятия не имею, почему, но, похоже, я могу установить их только после запуска экземпляра. Это означает, что я должен развернуть дважды, фиктивное развертывание, затем редактирование среды, а затем реальное развертывание.
Итак, подводя итоги,
- при развертывании
- a .файл конфигурации генерирует файл ec2-post-deploy-hook,
- система AWS развертывает docker-post-deploy-hook как часть .война, что развернут в glassfish
- на развертывание поста ,
- система эластичного бобового стебля запускает ec2-post-deploy-hook
- контроллер EC2-пост-развернуть-крючок запускает докер-пост-развернуть-крюк
- docker-post-deploy-hook запускает asadmin для настройки соответствующих пулов соединений
- во время выполнения код Java в веб-приложении использует пулы соединений
и все работает. Это, конечно, некрасиво, но, знаешь, я тоже.--7-->
после борьбы с этим сам на некоторое время, я думаю, что я, наконец, нашел приемлемое обходное решение (по крайней мере для меня) следующим образом :-
создайте DockerFile и упакуйте его непосредственно в WAR (на самом высоком уровне, а не в какой-либо папке). Файла Docker -
# Use the AWS Elastic Beanstalk Glassfish image
FROM amazon/aws-eb-glassfish:4.1-jdk8-onbuild-3.5.1
# Exposes port 8080
EXPOSE 8080 4848 8181
# Install Datasource dependencies
RUN curl -L -o /tmp/connectorj.zip https://server/path/connectorj.zip && \
unzip /tmp/connectorj.zip -d /tmp && \
cp /tmp/connectorj/mysql-connector-java-5.1.36-bin.jar /usr/local/glassfish4/glassfish/domains/domain1/lib/ && \
mv /var/app/WEB-INF/classes/domain.xml /usr/local/glassfish4/glassfish/domains/domain1/config/
теперь, когда эта война развернута (я использую 'EB deploy'). Этот файл DockerFile выполняется.
в простом примере выше-первый драйвер mysql JDBC загружается и настраивается в справочник lib glassfish. Затем я упаковал домен.xml (все ресурсы и т. д. уже настроены) внутри самой войны перемещается в папку конфигурации домена glassfish для загрузки при запуске glassfish.