你們都知道,兩個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
重啓應用,問題解決。