你想在 Java EE 应用中使用 Docker 吗? 一个典型的Java EE应用程序由应用服务器(例如:WildFly)和数据库(例如:Mysql)组成的。除此以外,你也许还需要一个前端负载:例如Apache,用于多台应用服务器的负载均衡,缓存:例如Infinispan,可以用于提高应用的整体性能。消息中间件:例如ActiveMQ,可以用于处理队列。缓存和消息组件可以用于集群的进一步扩展。 本文将先讲解一个简单 Docker 容器配置方法:包括应用服务器和数据库。接下来将讲解几个高级应用方法:包括前端负载、缓存、消息中间件和集群。 让我们开始吧! 如果你的机器之前没有安装过Docker,那么首先你需要安装Docker。你可以使用是最新版本的linux,它已经集成了Docker,或者使用安装命令:
在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应用
如果你想运行一个典型的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 容器并且添加链接:
第 4 种 Docker 方法:在同一宿主上的两个容器使用 Fig 进行通信上一种方法要求你以特定的次序运行容器。如果应用程序的每一层都位于一个容器里,那么运行多容器应用程序就很快变得富有挑战性。Fig(已被 Docker Compose 取代)是一款具有以下特征的 Docker 编排工具:
下面的配置文件就是 Fig 的入口:
所有的容器可以这样来启动:
使用 Fig 编排 Docker 详细阐述了这种方法。 现在 Fig 只接受更新,它的代码是 Docker Compose 的基础。相关讲解参见下一种方法。 第5种Docker方法:在同一宿主上的两个容器使用Compose进行通信Docker Compose是一种在Docker上定义和运行复杂应用程序的工具。通过Compose,你在单独的文件中定义一个多容器应用程序,只需执行一个命令就能让你的应用程序运行起来。 应用程序的配置文件格式和Fig所用的一致。这些容器可以这样启动:
对这个方法的详细讲解参见使用Docker Compose组织容器。 第6种Docker方法:在不同宿主上的两个容器使用IP地址进行通信在前一个方法中,两个容器运行在同一个宿主上。它们俩可以使用Docker linking方便地互相通信。但是简单的容器级linking不允许跨宿主通信。 在同一个宿主上运行容器意味着你无法扩展每一层,数据库属于独立的一层,应用服务器也属于独立的一层。在这种情况下,你需要在不同的宿主上运行每个容器。 |