amazon-web-services – 如何配置在AWS/ElasticBeanstalk/Docker上运行的GlassFish实例?

前端之家收集整理的这篇文章主要介绍了amazon-web-services – 如何配置在AWS/ElasticBeanstalk/Docker上运行的GlassFish实例?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用GlassFish来提供Java EE Web应用程序.在我的本地开发机器上工作正常.我有

>将postgres JDBC库复制到正确的位置
>在Glassfish管理控制台中配置连接池和JDBC资源
>部署了一个使用所述连接的网络应用程序
>在我的浏览器中看到了结果

我正在尝试将相同的应用程序部署到AWS Elastic Beanstalk托管的Glassfish实例. AWS-EB使用Docker部署Glassfish实例.我只能做上面的第三步(部署一个网络应用程序),完全不知道如何做前两个.

我喜欢做的是通过Web访问Glassfish管理控制台,但这似乎不适用于任何级别.另一种方法是在我的本地机器上使用玻璃鱼“asadmin”配置远程玻璃鱼,但我也不能做到这一点.

如何配置AWS EB上托管的Glassfish实例?它甚至可能吗?

我已经做了一些观察,但我很欣赏确认或其他方面:

>看起来AWS在他们的CLI中有一个名为’asadmin’的命令,它与autoscaling有关,并且与glassfish附带的’asadmin’同名.除了谷歌搜索努力之外,这两者似乎彼此无关
>如果我连接到包含Docker和Glassfish实例的AWS EC2实例,则会发生以下情况

> sudo docker ps返回有端口4848 / tcp,8080 / tcp,8181 / tcp,并且没有映射
> wget localhost:8080 – 连接被拒绝
> 8181和4848相同
> wget localhost:80返回Glassfish主页的网页

>在同一个运行docker的实例中,我得到一个内部IP地址(称之为1.2.3.4),然后在该EC实例上

> wget 1.2.3.4:8080(和4848,8181)都返回html文件
> wget 1.2.3.4:80 – 连接被拒绝

>如果我在docker容器中运行bash shell,则以下情况似乎是正确的

> wget localhost:8080(和4848,8181)都返回格式良好的页面
> wget localhost:80 – 连接被拒绝

所以我可能需要告诉EC2实例从localhost转发到1.2.3.4,但是当EB负载均衡器将其扩展时,我该如何实现呢?

任何建议将不胜感激.

最佳答案
以下内容对我有用 – 但我有一种感觉,我错过了一些东西.任何编辑/评论都是最受欢迎的.

EB / Docker部署中有各种钩子,允许执行post-deployement钩子在EB实例内的dockfish容器中的glassfish实例中运行.我使用部署后挂钩来设置连接池.这是最终安装的样子,仅供参考:

|  | |  \_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 / .config文件创建该文件,如此处所述

> http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html
> http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

我的.config文件包含以下内容

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开始学习这个想法.

只需要最后一行和第四行,但其他行对调试很有用.输出最终在EC2实例的/ tmp / post中.

文件中的一个技巧是我们总能得到docker容器的ID

sudo docker ps | grep latest | cut -d" " -f1

因为在部署之后只会运行一个Docker容器,并且它的名称中将包含“latest”.

ec2-post-deploy-hook的最后一行使用docker在docker实例中运行我最初想要运行的那些命令 – 即asadmin命令.我在.war文件中部署了一个名为setup_pool.sh的文件,因此它在部署期间最终位于已知位置.我的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命令是最重要的,但是再次,在docker实例中对/ tmp / setup_connections进行了一些调试

密码等从AWS环境获得.

此时我唯一不能做的就是首次部署时可以使用AWS环境变量.我不明白为什么,但我似乎只能在实例启动并运行后设置它们.这意味着我必须部署两次,一次虚拟部署,然后编辑环境,然后进行实际部署.

所以,总结一下,

>部署时

> .config文件生成ec2-post-deploy-hook文件,
> AWS系统将docker-post-deploy-hook部署为部署到glassfish的.war的一部分

>在部署后,

>弹性beanstalk系统运行ec2-post-deploy-hook
> ec2-post-deploy-hook运行docker-post-deploy-hook
> docker-post-deploy-hook运行asadmin以设置适当的连接池

>在运行时,Web应用程序中的Java代码使用连接池

这一切都有效.看起来很难看,但是,你知道,我也是.

原文链接:https://www.f2er.com/docker/436865.html

猜你在找的Docker相关文章