前面已经讲过docker以及私有镜像仓库的部署,本篇以一个完全使用docker构建web应用(tomcat+mysql)的完整示例进行探讨。


实验环境:

本篇的实验需要在kubernetes&docker系列01与032篇的成果上继续,请自行查阅。

此外,本次部署测试与之前单独部署tomcat不一样,因为需要测试使用tomcat连接mysql数据库,所以需要有一个能够访问数据库的web,所以首先需要pull一个带有连接数据库测试页web的tomcat镜像,kubeguide/tomcat-app:v1这个仓库的tomcat镜像包含该测试程序

另外实验之前记得将前面创建的docker先删除了,避免影响测试。


1、镜像仓库主机(10.1.30.34)

pull拉取tomcat镜像

docker pull kubeguide/tomcat-app:v1

tag为tomcat镜像重新打标签

docker tag docker.io/kubeguide/tomcat-app:v1 registry:5000/kubeguide/tomcat-app:v1

push打标签后的tomcat镜像到私有仓库

docker push registry:5000/kubeguide/tomcat-app:v1

【实战演练】kubernetes&docker系列05-docker创建tomcat+mysql实例_第1张图片

pull拉取mysql镜像

docker mysql:5.7

tag为mysql镜像重新打标签

docker tag docker.io/library/mysql:5.7 registry:5000/mysql:5.7

push打标签后的mysql镜像到私有仓库

docker push registry:5000/mysql:5.7



2、docker主机拉取镜像(10.1.30.35)

先查看当前是否有docker进程,如果有,先关闭/删除,避免影响实验。

docker ps -a

从私有仓库拉取mysql:5.7镜像

docker pull registry:5000/mysql:5.7

从私有仓库拉去tomcat镜像

registry:5000/kubeguide/tomcat-app:v1


3、创建docker实例

创建mysql:5.7实例

docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 registry:5000/mysql:5.7

创建tomcat实例

docker run --name tomcat01 -d -p 8080:8080 registry:5000/kubeguide/tomcat-app:v1

再次运行查看进程

docker pa -a


4、连接tomcat与mysql

测试访问10.1.30.35:8080,能够看到正常的返回页面

访问http://10.1.30.35:8080/demo/,尝试访问网站,发现报错如下。

Error:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 
The last packet sent successfully to the server was 0 milliseconds ago. 
The driver has not received any packets from the server.

由于tomcat能够正常访问,因此肯定不是tomcat的问题,而是tomcat容器与mysql容器通信问题。

因此先进入tomcat容器,查找原有

docker exec -ti tomcat01 bash

查看demo的index.jsp页面到底是怎样构成的。

001.jpg

cat index.jsp

看到有3行很重要的信息,tomcat配置的与数据库连接的信息。

String ip=System.getenv("MYSQL_SERVICE_HOST");
       String port=System.getenv("MYSQL_SERVICE_PORT");
conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456");

是通过MYSQL_SERVICE_HOST在这个环境变量来获取mysql的IP地址的,如果没有,就无法指定mysql的地址,因此无法连接。因此解决思路是:

停止并且删除原有的tomcat01容器。

docker stop tomcat01
docker rm tomcat01

带环境变量,重新创建与启动tomcat01容器。

docker run --env MYSQL_SERVICE_HOST="10.1.30.35"  --name tomcat01 -p 8080:8080 -d registry:5000/kubeguide/tomcat-app:v1

重新访问10.1.30.35:8080/demo,发现能够正常返回数据了。

【实战演练】kubernetes&docker系列05-docker创建tomcat+mysql实例_第2张图片

生产环境,可以考虑将MYSQL_SERVICE_HOST设置为一个hostname,然后通过dns解析指向docker容器主机的IP地址即可。