你们都知道,两个docker container互连的时候能够用link,可是,咱们也知道,container能够将本身的端口映射到宿主机上,好比一个container A上的tomcat将端口暴露给宿主机(0.0.0.0:58080->8080),另外一个container B上的mysql将端口也暴露给宿主机(0.0.0.0:53306->3306),那么问题来了,是否能够将A上的jdbc链接改为jdbc:mysql://192.168.1.10:53306xxxxxx(假设192.168.1.10是宿主机的ip),猛然一看彷佛能够,没有防火墙,端口又作了映射,应该是能够连通的,但实际上,在tomcat上,我遇到了no route to host的error,具体实验以下:java
首先咱们启动一个mysql的容器,将3306这个端口暴露给宿主机:mysql
1 [root@localhost ~]# docker run -d -p 53306:3306 -e MYSQL_ROOT_PASSWORD=123456 test01/mariadb 2 2c564a3484a4424b18e413fb11c6a71d76098f7e2e30b3ea8ad4e1b987e249a8 3 [root@localhost ~]# docker ps 4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5 2c564a3484a4 test01/mariadb "docker-entrypoint.sh" 45 seconds ago Up 43 seconds 0.0.0.0:53306->3306/tcp berserk_cray 6 [root@localhost ~]#
这个时候咱们用客户端来访问一下,测试53306这个端口是否能链接到咱们的数据库:sql
链接成功了,说明端口映射是成功的,从外部访问宿主机的53306端口能正常的映射到容器上的3306端口。docker
好的,接下来,再启动一个tomcat的容器,将应用的jdbc链接指向宿主机的53306端口,来看看是否能够连通呢。数据库
1 [root@localhost ~]# docker run -it -p 52080:8080 test01/wbserv /bin/bash 2 [root@168081c42f91 /]# sh /opt/apache-tomcat-7.0.70/bin/startup.sh 3 Using CATALINA_BASE: /opt/apache-tomcat-7.0.70 4 Using CATALINA_HOME: /opt/apache-tomcat-7.0.70 5 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.70/temp 6 Using JRE_HOME: /usr/java/jdk1.7.0_79/jre 7 Using CLASSPATH: /opt/apache-tomcat-7.0.70/bin/bootstrap.jar:/opt/apache-tomcat-7.0.70/bin/tomcat-juli.jar 8 Tomcat started. 9 [root@168081c42f91 /]#
这个时候tomcat也起来了,接下来是配置应用和开启应用:(注意IP和端口号,都用宿主机的ip和端口)apache
好了,接下来,启动应用,能够发现应用起不来,而后查看下启动日志:bootstrap
[root@168081c42f91 /]# tail -n 100 logs/catalina.out
提示开头说的这个错误,No route to host。tomcat
这个问题,估计能够经过修改hosts文件来解决,可是我没有这有这样作,有想去的朋友能够去尝试,最后考虑到往后会有大规模部署的须要,此处改为link链接,如:bash
--link mysql_name:tomysqltcp
只须要将原来的jdbc链接改成
jdbc:mysql://tomysql:3306/drools?characterEncoding=utf-8
重启应用,问题解决。