為 Java EE 應用提供的 9 種 Docker 方法

oschina發表於2015-03-26

  你想在 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應用程式時,你還用了什麼其他方法嗎?

  歡迎嘗試這些方法!

  原文地址:https://www.voxxed.com/blog/2015/03/9-docker-recipes-for-java-ee-applications/

相關文章