如何配置在AWS/ElasticBeanstalk/Docker上运行的GlassFish实例?

问题描述:

我正在使用GlassFish来提供Java EE Web应用程序。事情在我的本地开发机器上正常工作。我有如何配置在AWS/ElasticBeanstalk/Docker上运行的GlassFish实例?

  • 复制的Postgres JDBC库到正确的地方
  • 配置中部署一个web应用程序,它使用上述连接
  • 看到的结果在GlassFish管理控制台
  • 连接池和JDBC资源我的浏览器

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

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

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

我做了一些意见,但我会很感激确认或以其他方式:

    看来,AWS在其CLI称为“asadmin的”,这是关于自动缩放命令,并且具有相同的名称
  • 作为带有玻璃鱼的“asadmin”。除了由谷歌搜索硬盘,两人似乎如果我连接到包含泊坞窗和Glassfish实例的AWS EC2实例无关相互
  • ,下面的事情发生
    • 须藤泊坞窗PS回报有端口4848/TCP,8080/TCP,8181/TCP,并且没有被映射
    • wget的本地主机:8080 - 连接被拒绝了8181
    • 相同,4848
    • wget的本地主机:80返回Glassfish的主页
  • 的网页在同一实例中运行搬运工检查我得到一个内部IP地址(称之为1.2.3.4),然后对EC实例
    • 的wget 1.2.3.4:8080(和4848,8181)全部返回html文件
    • wget 1.2.3。4:80 - 拒绝连接
  • ,如果我在泊坞窗容器中运行的是bash shell,下面的东西看起来是真实的
    • wget的本地主机:8080(和4848,8181)都返回以及形成页
    • wget的本地主机:80 - 拒绝连接

所以也许我需要告诉EC2实例从localhost转发到1.2.3.4,但是如何在EB负载均衡器扩展时实现这一点。

任何意见将不胜感激。

+0

请发布您的docker ps响应(您可以混淆IP),如果可能的话您的aws docker json清单文件。 – 2014-12-08 15:30:40

+0

Hi Usman。恐怕我不知道aws docker son manifest文件是什么。 (我现在怀疑是我的问题......) – 2014-12-08 20:54:49

+0

我的意思是Dockerrun.aws.json文件。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html – 2014-12-08 20:56:23

以下是对我有用的东西 - 但我有一种感觉我失去了一些东西。任何编辑/评论将是最受欢迎的。

EB/Docker部署中有各种钩子允许在EB实例内的docker容器内的glassfish实例中执行部署后挂钩。我使用部署后挂钩来设置连接池。下面是最后安装的样子,仅供参考:

| | | \_WAR_/ | | | 
| | \_Glassfish_/ | | 
| \____Docker____/ | 
\____EC2 Instance____/ 

所需的总的结果是,应用程序部署后,泊坞窗实例里面,的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实例可以访问您在AWS管理控制台中声明的环境变量,所以我可以传递配置信息,而不必在构建脚本中传递配置信息。

为了实现这一结果,我们需要一个文件,在安装过程中的EC2实例创建的,在我的情况被称为/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh。该文件将在EC2实例中以root身份部署后执行。我将其称为ec2-post-deploy-hook

我们要创建使用.ebextensions/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。

在该文件中的一个诀窍是,我们总是可以通过

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

得到泊坞窗容器的ID,因为部署后只会有一个码头工人的容器中运行,它会“最新”的其名称。

ec2-post-deploy-hook的最后一行使用docker在docker实例中运行我最初想要运行的那些命令 - 即asadmin命令。我在我的.war文件中部署名为setup_pool.sh的文件,因此它在部署过程中会在已知位置结束。我setup_pool.sh看起来像这样(我称之为泊坞窗,后部署钩):

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 

这个文件是在泊坞窗实例中运行。这两个asadmin命令是肉食,但同样,在docker实例中有一些调试进入/ tmp/setup_connections

密码等是从AWS环境获得的。

我现在唯一不能做的就是在首次部署时提供AWS环境变量。我不知道为什么,但我似乎只能在实例启动并运行后设置它们。这意味着我必须部署两次虚拟部署,然后进行环境编辑,然后进行真正的部署。

因此,在部署总结,

    • 一个config文件生成一个EC2-后部署挂机文件,
    • 的AWS系统部署-deploy-泊坞窗,后钩作为被部署到Glassfish的
  • 在后部署的.war的一部分,
    • 弹性beanstalk系统运行ec2-post-deploy-hook
    • ec2-post-deploy-hook运行docker-post-deploy-hook
    • docker-post-deploy-hook运行asadmin来设置适当的连接池
  • 在运行时,在Web应用程序中的Java代码利用了连接池

而这一切的作品。看起来有点难看,但是,你知道,我也是。

与这个自己挣扎了一段时间后,我觉得我终于找到一个可接受的解决方法(ATLEAST对我来说)如下: -

创建DockerFile并直接打包的WAR中(在最高级别,而不是在任何文件夹中)。 DockerFile -

# 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部署')。这个DockerFile被执行。

在上面的简单示例中 - 首先将mysql jdbc驱动程序下载并安装到glassfish的lib目录中。接下来,我已经打包了WAR文件中的domain.xml文件(所有的资源等),并在glassfish启动时移动到glassfish的domain config文件夹中进行加载。

+0

这是一个更清洁的解决方案。一个可能的改进可能是针对asadmin可执行文件执行命令来配置域,而不是替换整个domain.xml。可以从maven下载依赖项以避免使用私有存储库。 – Vova 2017-08-25 18:08:45