2014-12-08 100 views
8

我正在使用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

回答

6

以下是對我有用的東西 - 但我有一種感覺我失去了一些東西。任何編輯/評論將是最受歡迎的。

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代碼利用了連接池

而這一切的作品。看起來有點難看,但是,你知道,我也是。

3

與這個自己掙扎了一段時間後,我覺得我終於找到一個可接受的解決方法(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

相關問題