在两个Docker容器上链接了WildFly / JavaEE7和MySQL(技术提示65)

技术提示#61展示了如何在WildFly Docker容器 运行Java EE 7动手实验室 。 在这种情况下,有两个假设:


  • WildFly捆绑了H2内存数据库 。 Java EE 7应用程序使用默认的数据库资源,在WildFly的情况下,该资源被解析为与该内存数据库的JDBC连接。 这是开始构建应用程序的好方法,但是很快您就想开始使用真实的数据库,例如MySQL。
  • 通常,Application Server和数据库可能不在同一主机上。 通过避免单点故障来降低风险。 因此,WildFly和MySQL将位于单独的主机上。

有大量资料可用来展示如何在单独的主机上配置WildFly和MySQL。 如果要使用Docker进行设计,则应采用哪些设计模式和反模式?

让我们来看看!

在简化的步骤中:

  1. 将MySQL容器运行为:
    docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql
  2. 运行预配置了MySQL JDBC资源的WildFly容器,如下所示:
    docker run --name mywildfly --link mysqldb:db -p 8080:8080 -d arungupta/wildfly-mysql-javaee7
  3. 查找WildFly容器的IP地址:
    sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' mywildfly

    如果您使用的是Mac,请使用boot2docker ip查找IP地址。

  4. 通过以下方式访问该应用程序:
    curl http://<IP_ADDRESS>:8080/employees/index.html

    看到的输出为:

该应用程序是一个普通的Java EE 7应用程序,它发布了REST端点。 以以下方式访问它:

curl http://localhost:8080/employees/resources/employees/

查看:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>

如果您对坚韧不拔感兴趣,请阅读更多详细信息。

链接容器

我们需要了解的第一个概念是Docker如何允许链接容器 。 在两个容器之间创建链接会在源容器和目标容器之间创建管道,并将有关源容器的信息安全地传输到目标容器。 在我们的例子中,目标容器(WildFly)可以查看有关源容器(MySQL)的信息。 这里要理解的重要部分是,源容器不需要公开这些信息,而仅对目标容器可用。

直观地,启用链接的神奇开关是--link 。 因此,例如,如果如上所述运行MySQL和WildFly容器,则--link mysqldb:db将具有别名db名为mysqldb的MySQL容器链接到WildFly目标容器。 遵循定义的协议 ,这在目标容器中定义了一些环境变量,然后可用于访问有关源容器的信息。 例如,IP地址,公开的端口,用户名,密码等。环境变量的完整列表可以看作:

[arun@localhost wildfly-mysql-javaee7]$ sudo docker run --name mywildfly --link mysqldb:db -p 8080:8080 -it arungupta/wildfly-mysql-javaee7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=4e0458981a82
TERM=xterm
DB_PORT=tcp://172.17.0.24:3306
DB_PORT_3306_TCP=tcp://172.17.0.24:3306
DB_PORT_3306_TCP_ADDR=172.17.0.24
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_NAME=/mywildfly3/db
DB_ENV_MYSQL_USER=mysql
DB_ENV_MYSQL_PASSWORD=mysql
DB_ENV_MYSQL_DATABASE=sample
DB_ENV_MYSQL_ROOT_PASSWORD=supersecret
DB_ENV_MYSQL_MAJOR=5.6
DB_ENV_MYSQL_VERSION=5.6.22
JAVA_HOME=/usr/lib/jvm/java
WILDFLY_VERSION=8.2.0.Final
JBOSS_HOME=/opt/jboss/wildfly
HOME=/opt/jboss

因此,您可以看到有DB_*环境变量提供了有关源容器的大量信息。

仅当所有容器都在同一主机上运行时,链接才有效。 一个更好的解决方案将在后续博客中显示,敬请期待。

覆盖默认的Docker命令

该映像的Dockerfile继承自jboss / wildfly:latest并启动WildFly容器。 Docker容器只能运行一个命令,但是我们需要安装JDBC驱动程序,使用正确的IP地址和端口创建JDBC资源,并部署WAR文件。 因此,我们将继承自jboss / wildfly:latest并使用自定义命令来覆盖该命令。 此命令将完成我们想做的所有事情,然后也启动WildFly。

custom命令执行以下操作:

  • 添加MySQL模块
  • 添加MySQL JDBC驱动程序
  • 使用链接的MySQL容器的IP地址和端口添加JDBC数据源
  • 部署WAR文件
  • 启动WildFly容器

注意,WildFly以-b 0.0.0.0开头,该值允许将其绑定到任何IP地址。 另外,该命令需要在前台运行,以便容器保持活动状态。

定制安全性

理想情况下,您将在防火墙上打洞以启用到特定主机/端口的连接。 但是这些说明已在Virtual Box中运行的Fedora 20上尝试过。 因此,为方便起见,完整的防火墙被禁用为:

[arun@localhost wildfly-mysql-javaee7]$ sudo docker run --name mywildfly --link mysqldb:db -p 8080:8080 -it arungupta/wildfly-mysql-javaee7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=4e0458981a82
TERM=xterm
DB_PORT=tcp://172.17.0.24:3306
DB_PORT_3306_TCP=tcp://172.17.0.24:3306
DB_PORT_3306_TCP_ADDR=172.17.0.24
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_NAME=/mywildfly3/db
DB_ENV_MYSQL_USER=mysql
DB_ENV_MYSQL_PASSWORD=mysql
DB_ENV_MYSQL_DATABASE=sample
DB_ENV_MYSQL_ROOT_PASSWORD=supersecret
DB_ENV_MYSQL_MAJOR=5.6
DB_ENV_MYSQL_VERSION=5.6.22
JAVA_HOME=/usr/lib/jvm/java
WILDFLY_VERSION=8.2.0.Final
JBOSS_HOME=/opt/jboss/wildfly
HOME=/opt/jboss

此外,使用“虚拟盒子”设置添加了仅主机适配器,其外观类似于:

techtip65仅主机适配器

就是这样,这应该使您能够在两个单独的容器上使用WildFly和MySQL。

还验证了boot2docker上的步骤,并且在那里也可以无缝运行:

docker-images> docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql
docker-images> 
docker-images> docker run --name mywildfly --link mysqldb:db -p 8080:8080 -d arungupta/wildfly-mysql-javaee7
Unable to find image 'arungupta/wildfly-mysql-javaee7' locally
Pulling repository arungupta/wildfly-mysql-javaee7
791773b0e1de: Download complete 
511136ea3c5a: Download complete 
782cf93a8f16: Download complete 
7d3f07f8de5f: Download complete 
1ef0a50fe8b1: Download complete 
20a1abe1d9bf: Download complete 
cd5bb934bb67: Download complete 
379edb00ab07: Download complete 
4d37cbbfc67d: Download complete 
2ea8562cac7c: Download complete 
7759146eab1a: Download complete 
b17a20d6f5f8: Download complete 
e02bdb6c4ed5: Download complete 
72d585299bb5: Download complete 
90832e1f0bb9: Download complete 
2c3484b42034: Download complete 
38fad13dea25: Download complete 
656878d9a6c6: Download complete 
6510de96c354: Download complete 
0cc86be8ac93: Download complete 
cc4e21e8b0e7: Download complete 
Status: Downloaded newer image for arungupta/wildfly-mysql-javaee7:latest
8522df362e57f5b7a5324dba692559b971c7cfda4a687212c44b1118008a4c63
docker-images> curl http://192.168.59.103:8080/employees/index.html
  • 获取所有员工。
  • 获得1名员工。
docker-images> curl http://192.168.59.103:8080/employees/resources/employees/
1Penny2Sheldon3Amy4Leonard5Bernadette6Raj7Howard8Priya

图像的源代码位于github.com/arun-gupta/docker-images/tree/master/wildfly-mysql-javaee7

请享用!

翻译自: https://www.javacodegeeks.com/2014/12/wildflyjavaee7-and-mysql-linked-on-two-docker-containers-tech-tip-65.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值