技术提示#61展示了如何在WildFly Docker容器 上运行Java EE 7动手实验室 。 在这种情况下,有两个假设:
- WildFly捆绑了H2内存数据库 。 Java EE 7应用程序使用默认的数据库资源,在WildFly的情况下,该资源被解析为与该内存数据库的JDBC连接。 这是开始构建应用程序的好方法,但是很快您就想开始使用真实的数据库,例如MySQL。
- 通常,Application Server和数据库可能不在同一主机上。 通过避免单点故障来降低风险。 因此,WildFly和MySQL将位于单独的主机上。
有大量资料可用来展示如何在单独的主机上配置WildFly和MySQL。 如果要使用Docker进行设计,则应采用哪些设计模式和反模式?
让我们来看看!
在简化的步骤中:
- 将MySQL容器运行为:
docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql
- 运行预配置了MySQL JDBC资源的WildFly容器,如下所示:
docker run --name mywildfly --link mysqldb:db -p 8080:8080 -d arungupta/wildfly-mysql-javaee7
- 查找WildFly容器的IP地址:
sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' mywildfly
如果您使用的是Mac,请使用
boot2docker ip
查找IP地址。 - 通过以下方式访问该应用程序:
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
此外,使用“虚拟盒子”设置添加了仅主机适配器,其外观类似于:
就是这样,这应该使您能够在两个单独的容器上使用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
docker-images> curl http://192.168.59.103:8080/employees/resources/employees/
1Penny2Sheldon3Amy4Leonard5Bernadette6Raj7Howard8Priya
图像的源代码位于github.com/arun-gupta/docker-images/tree/master/wildfly-mysql-javaee7 。
请享用!