无法通过 Spring 应用使用 Docker 连接到 MongoDB 和 MySQL
Unable to connect to MongoDB and MySQL by Spring App using Docker
我正在使用如下所示的 docker-compose.yml
来创建容器。我是新手,我正在尝试创建一个 nginx 容器,tomcat 容器和 spring 应用程序以及两个数据库容器(mongo 和 mysql)。在 Debian 服务器上 Spring 应用程序可以运行,所以我认为问题出在 docker 容器的配置上。
nginx:
image: nginx
links:
- web
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
web:
image: tomcat:8.0-jre8
links:
- mongo
- mysql
volumes:
- ./bint.war:/usr/local/tomcat/webapps/bint.war
- ./tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml
mongo:
image: mongo:2.7
ports:
- "27017:27017"
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: pass
我可以通过 workbench 和 robomongo 等工具连接到 mongo 和 mysql,只需使用 localhost
和默认端口,但是 spring 应用程序不能。我正在 OSX 10.11.5.
Docker version 1.12.0-rc2, build 906eacd, experimental
docker-compose version 1.8.0-rc1, build 9bf6bc6
docker-machine version 0.8.0-rc1, build fffa6c9
MySql 堆栈跟踪
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
web_1 | Caused by: java.net.ConnectException: Connection refused
web_1 | at java.net.PlainSocketImpl.socketConnect(Native Method)
web_1 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
web_1 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
web_1 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
web_1 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
web_1 | at java.net.Socket.connect(Socket.java:589)
web_1 | at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:214)
web_1 | at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298)
web_1 | ... 58 more
Mongo 堆栈跟踪
web_1 | Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "tcp://172.17.0.3:27017"
web_1 | at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:77)
web_1 | at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:54)
web_1 | at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1033)
web_1 | at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
web_1 | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
web_1 | ... 28 more
您的 spring 应用程序将能够使用 mongo:27017 和 mysql:3306 进行连接。
使用 localhost:27017 和 localhost:3306.
将无法访问
您的另一个选择是 docker-compose 版本 2,然后默认情况下所有容器将共享同一个网络。
我知道 Docker 应该足以使用链接访问创建的默认网络上的另一个容器。我建议尝试在所有具有相同容器名称的容器上使用主机名属性,以确保万无一失。我认为这可能有助于解决 MySQL 错误 - 不幸的是我们在堆栈跟踪中看不到连接 url 以确保正在尝试使用适当的主机名 -
对于 MongoDB 错误,我遇到了同样的问题。由于某种原因 Docker 正在将定义的端口 27017 更改为 tcp://172.17.0.3:27017
这就是字符串转换异常的原因。 spring 中可能有一些属性 reader 是从 application.properties 或其他一些环境变量 mongo 数据库端口获取的,但它是错误的。我正在调查为什么会这样。
好的,在某个地方找到了解决 mongodb 问题的方法...它与我和 explainig 的人所遇到的有点不同。我们在 docker-composer.yml 上将 mongodb 定义为
mongo分贝:
图片:mongo
等....
似乎链接的工作方式或过去的工作方式是使用一些环境变量,以及一些如何最终覆盖 spring 参数 mongodb.port 或 mongo.port.
MONGO_PORT='tcp://172.17.0.3:27017'
解决方法是重命名我使用 mdb 的容器:等...问题消失了。
希望这对您有所帮助。将尝试对此进行更多挖掘以查看实际在做什么
我正在使用如下所示的 docker-compose.yml
来创建容器。我是新手,我正在尝试创建一个 nginx 容器,tomcat 容器和 spring 应用程序以及两个数据库容器(mongo 和 mysql)。在 Debian 服务器上 Spring 应用程序可以运行,所以我认为问题出在 docker 容器的配置上。
nginx:
image: nginx
links:
- web
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
web:
image: tomcat:8.0-jre8
links:
- mongo
- mysql
volumes:
- ./bint.war:/usr/local/tomcat/webapps/bint.war
- ./tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml
mongo:
image: mongo:2.7
ports:
- "27017:27017"
mysql:
image: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: pass
我可以通过 workbench 和 robomongo 等工具连接到 mongo 和 mysql,只需使用 localhost
和默认端口,但是 spring 应用程序不能。我正在 OSX 10.11.5.
Docker version 1.12.0-rc2, build 906eacd, experimental
docker-compose version 1.8.0-rc1, build 9bf6bc6
docker-machine version 0.8.0-rc1, build fffa6c9
MySql 堆栈跟踪
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
web_1 | Caused by: java.net.ConnectException: Connection refused
web_1 | at java.net.PlainSocketImpl.socketConnect(Native Method)
web_1 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
web_1 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
web_1 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
web_1 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
web_1 | at java.net.Socket.connect(Socket.java:589)
web_1 | at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:214)
web_1 | at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298)
web_1 | ... 58 more
Mongo 堆栈跟踪
web_1 | Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "tcp://172.17.0.3:27017"
web_1 | at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:77)
web_1 | at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:54)
web_1 | at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1033)
web_1 | at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
web_1 | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
web_1 | ... 28 more
您的 spring 应用程序将能够使用 mongo:27017 和 mysql:3306 进行连接。 使用 localhost:27017 和 localhost:3306.
将无法访问您的另一个选择是 docker-compose 版本 2,然后默认情况下所有容器将共享同一个网络。
我知道 Docker 应该足以使用链接访问创建的默认网络上的另一个容器。我建议尝试在所有具有相同容器名称的容器上使用主机名属性,以确保万无一失。我认为这可能有助于解决 MySQL 错误 - 不幸的是我们在堆栈跟踪中看不到连接 url 以确保正在尝试使用适当的主机名 -
对于 MongoDB 错误,我遇到了同样的问题。由于某种原因 Docker 正在将定义的端口 27017 更改为 tcp://172.17.0.3:27017
这就是字符串转换异常的原因。 spring 中可能有一些属性 reader 是从 application.properties 或其他一些环境变量 mongo 数据库端口获取的,但它是错误的。我正在调查为什么会这样。
好的,在某个地方找到了解决 mongodb 问题的方法...它与我和 explainig 的人所遇到的有点不同。我们在 docker-composer.yml 上将 mongodb 定义为
mongo分贝: 图片:mongo 等....
似乎链接的工作方式或过去的工作方式是使用一些环境变量,以及一些如何最终覆盖 spring 参数 mongodb.port 或 mongo.port.
MONGO_PORT='tcp://172.17.0.3:27017'
解决方法是重命名我使用 mdb 的容器:等...问题消失了。
希望这对您有所帮助。将尝试对此进行更多挖掘以查看实际在做什么