為 Java EE 應用提供的 9 種 Docker 方法
你想在 Java EE 應用中使用 Docker 嗎?
一個典型的Java EE應用程序由應用服務器(例如:WildFly)和數據庫(例如:Mysql)組成的。除此以外,你也許還需要一個前端負載:例如Apache,用于多臺應用服務器的負載均衡,緩存:例如Infinispan,可以用于提高應用的整體性能。消息中間件:例如ActiveMQ,可以用于處理隊列。緩存和消息組件可以用于集群的進一步擴展。
本文將先講解一個簡單 Docker 容器配置方法:包括應用服務器和數據庫。接下來將講解幾個高級應用方法:包括前端負載、緩存、消息中間件和集群。
讓我們開始吧!
如果你的機器之前沒有安裝過Docker,那么首先你需要安裝Docker。你可以使用是最新版本的linux,它已經集成了Docker,或者使用安裝命令:
sudo apt-get install docker-io
在Mac和windows系統上,則需安裝 boot2docker ,它是一個微內核的linux虛擬機包含Docker主機。同時你需要配置ssh秘鑰和證書。
幸運的是,Docker Machine. 使用非常簡單。你從頭開始到創建完成一個Docker主機只需要一條指令。這個主機可以創建在你的便攜設備上、云端或數據中心。在多個服務器上安裝Docker,Docker客戶端可以傳輸配置。
關于這方面的詳細講解請關注:Docker Machine to Setup Docker Host.
第 2 種 Docker 方法:應用服務器+內存數據庫
Java EE 7 的一個很酷的功能是帶默認的數據庫資源。這可以讓你不用擔心在你的應用程序可以訪問之前為應用服務器創建特定的JDBC資源。任何Java EE 7兼容的應用服務器將默認的JDBC資源名稱(java:comp/defaultdatasource)映射到自帶的數據庫服務器內的應用服務器專用的資源上。
例如,WildFly 捆綁了 H2 內存數據庫。一旦 Wildfly 準備接受請求的時候該數據庫就可用了。這簡化了開發工作,讓你做一個快速原型。默認的 JDBC 資源映射到 java:jboss/datasources/ExampleDS,然后又會被映射到 JDBC URL ofjdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE.
這這種情況下,數據庫服務器是運行在應用服務器內的另一個應用。
下面是在WildFly上運行Jave EE7應用
docker run -it -p 8080:8080 arungupta/javaee7-hol
如果你想運行一個典型的WildFly加H2內存數據庫的Java EE 7應用,那么這種Docker方法的詳細解釋見Java EE 7 Hands-on Lab on WildFly and Docker。
第3種 Docker方法 : 兩個容器在相同的主機使用鏈接
前一種方法能夠讓你快速上手,但是很快出現了瓶頸-數據庫只能在內存中。這就意味著你更改任何數據和 schema 在應用服務關閉后都將要失效。在這種情況下,你需要使用應用服務器意外的數據庫服務器。例如,MySQL 數據庫服務器和 WildFly 應用服務器。
簡單起見,數據庫服務器和應用程序服務器可以在同一個主機上運行。
Docker Container Links 被用來鏈接兩個容器。在資源容器和目標容器間創建管道鏈接并且能夠保證數據在兩個容器間安全傳輸。 在我們的案例中,目標容器(WildFly)可以看到資源信息(MySQL)。重點需要理解是在資源容器中不需要公開任何信息,僅僅是在目標容其中可見。
啟動 MySQL 和 WildFly 容器并且添加鏈接:
docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql docker run --name mywildfly --link mysqldb:db -p 8080:8080 -d arungupta/wildfly-mysql-javaee7
第 4 種 Docker 方法:在同一宿主上的兩個容器使用 Fig 進行通信
上一種方法要求你以特定的次序運行容器。如果應用程序的每一層都位于一個容器里,那么運行多容器應用程序就很快變得富有挑戰性。Fig(已被 Docker Compose 取代)是一款具有以下特征的 Docker 編排工具:
-
只用一個配置文件就能定義多個容器
-
通過在兩個容器間創建 link 來建立它們之間的依賴關系
-
以合理的順序啟動各個容器
下面的配置文件就是 Fig 的入口:
mysqldb: image: mysql:latest environment: MYSQL_DATABASE: sample MYSQL_USER: mysql MYSQL_PASSWORD: mysql MYSQL_ROOT_PASSWORD: supersecret mywildfly: image: arungupta/wildfly-mysql-javaee7 links: - mysqldb:db ports: - 8080:8080
所有的容器可以這樣來啟動:
fig up -d
使用 Fig 編排 Docker 詳細闡述了這種方法。
現在 Fig 只接受更新,它的代碼是 Docker Compose 的基礎。相關講解參見下一種方法。
第5種Docker方法:在同一宿主上的兩個容器使用Compose進行通信
Docker Compose是一種在Docker上定義和運行復雜應用程序的工具。通過Compose,你在單獨的文件中定義一個多容器應用程序,只需執行一個命令就能讓你的應用程序運行起來。
應用程序的配置文件格式和Fig所用的一致。這些容器可以這樣啟動:
docker-compose up -d
對這個方法的詳細講解參見使用Docker Compose組織容器。
第6種Docker方法:在不同宿主上的兩個容器使用IP地址進行通信
在前一個方法中,兩個容器運行在同一個宿主上。它們倆可以使用Docker linking方便地互相通信。但是簡單的容器級linking不允許跨宿主通信。
在同一個宿主上運行容器意味著你無法擴展每一層,數據庫屬于獨立的一層,應用服務器也屬于獨立的一層。在這種情況下,你需要在不同的宿主上運行每個容器。
MySQL容器可以這樣啟動:
docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -p 5306:3306 -d mysql
JDBC資源可以這樣創建:
data-source add --name=mysqlDS --driver-name=mysql --jndi-name=java:jboss/datasources/ExampleMySQLDS --connection-url=jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT/sample?useUnicode=true&characterEncoding=UTF-8 --user-name=mysql --password=mysql --use-ccm=false --max-pool-size=25 --blocking-timeout-wait-millis=5000 --enabled=true
WildFly容器可以這樣啟動:
docker run --name mywildfly -e MYSQL_HOST=<IP_ADDRESS> -e MYSQL_PORT=5306 -p 8080:8080 -d arungupta/wildfly-mysql-javaee7
對這個方法的完整闡述參見在多個宿主之間使用Docker容器的linking技術。
第7種Docker方法:使用Docker Swarm管理不同宿主上的兩個容器
Docker Swarm是Docker的原生集群管理工具。它將一群Docker宿主變為單一的虛擬宿主。通過優化宿主資源利用率,提供故障轉移服務,它彌補了Docker Machine的不足。具體地說,Docker Swarm允許用戶將運行著Docker守護進程的宿主組建為資源池,并在此之上調度Docker容器的運轉,自動管理工作負載的分配,維護集群的狀態。
關于這個方法的更多詳情將在后續博客中介紹。
第8種Docker方法:從Eclipse部署Java EE應用程序
這個壓軸方法將教你如何把已有的應用程序部署到一個Docker鏡像中。
假定你將JBoss Tools作為你的開發環境,WildFly用作你的應用服務器。
這里提供兩條途徑來部署這些應用程序:
1) 基于 Docker volumes + 本地 的部署方式:在你本地計算機上有一個目錄,正以Docker Volume的形式掛載著。通過將這個目錄映射到用于部署的目錄,WildFly Docker容器被這樣啟動起來:
docker run -it -p 8080:8080 -v /Users/arungupta/tmp/deployments:/opt/jboss/wildfly/standalone/deployments/:rw jboss/wildfly
通過設置JBoss Tools將WAR文件部署到這個目錄中。
2) 基于 WildFly管理API + 遠程 的部署方式:啟動WildFly Docker容器,此外還要開放管理端口9990:
docker run -it -p 8080:8080 -p 9990:9990 arungupta/wildfly-management
通過設置JBoss Tools來使用遠程的WildFly服務器,并利用管理API來進行部署。
對這個方法的詳細講解在從Eclipse部署到WildFly和Docker上中可以找到。
第9種Docker方法:使用Arquillian Cube測試Java EE應用程序
Arquillian Cube允許你以手動或自動的方式,在測試的生命周期中,控制Docker鏡像的生命周期。Cube利用Docker REST API與容器通信。它使用遠程適配器API同應用服務器通信,比如這里用到的WildFly。Docker參數是作為maven-surefire-plugin的一部分來配置的:
<configuration> <systemPropertyVariables> <arquillian.launch>wildfly-docker</arquillian.launch> <arq.container.wildfly-docker.configuration.username>admin</arq.container.wildfly-docker.configuration.username> <arq.container.wildfly-docker.configuration.password>Admin#70365</arq.container.wildfly-docker.configuration.password> <arq.extension.docker.serverVersion>1.15</arq.extension.docker.serverVersion> <arq.extension.docker.serverUri>http://127.0.0.1:2375</arq.extension.docker.serverUri> <arq.extension.docker.dockerContainers> wildfly-docker: image: arungupta/javaee7-samples-wildfly exposedPorts: [8080/tcp, 9990/tcp] await: strategy: polling sleepPollingTime: 50000 iterations: 5 portBindings: [8080/tcp, 9990/tcp] </arq.extension.docker.dockerContainers> </systemPropertyVariables> </configuration>
關于這個方法的完整詳情可以在使用Arquillian Cube在Docker上運行Java EE測試中找到。
在Docker上部署你的Java EE應用程序時,你還用了什么其他方法嗎?
歡迎嘗試這些方法!
本文地址:http://www.oschina.net/translate/9-docker-recipes-for-java-ee-applications
原文地址:https://www.voxxed.com/blog/2015/03/9-docker-recipes-for-java-ee-applications/