前面已经讲过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
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页面到底是怎样构成的。
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,发现能够正常返回数据了。
生产环境,可以考虑将MYSQL_SERVICE_HOST设置为一个hostname,然后通过dns解析指向docker容器主机的IP地址即可。