无法使用Docker通过Spring App连接到MongoDB和MySQL

时间:2016-06-26 18:08:39

标签: docker docker-compose

我使用下面的docker-compose.yml来创建容器。我是新手,我正在尝试使用spring app和两个数据库容器(mongo和mysql)创建一个nginx容器,tomcat容器。在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等工具使用localhost和默认端口连接到mongo和mysql,但是spring app无法连接。我正在使用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 stacktrace

    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 stacktrace

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

3 个答案:

答案 0 :(得分:1)

您的spring应用程序将能够使用mongo:27017和mysql:3306进行连接。 使用localhost:27017和localhost:3306无法访问它。

您拥有的另一个选项是docker-compose版本2,默认情况下所有容器将共享同一个网络。

答案 1 :(得分:0)

我知道Docker应该足够使用链接来访问创建的默认网络上的另一个容器。我建议尝试在容器名称相同的所有容器上使用hostname属性。我认为这可能有助于MySQL错误 - 不幸的是我们没有看到堆栈跟踪中的连接url确保尝试使用适当的主机名 -

对于MongoDB错误,我面临同样的问题。由于某种原因,Docker正在将定义的端口27017更改为tcp://172.17.0.3:27017,这是String转换异常的原因。在Spring中可能有一些属性读取器从application.properties或其他一些env变量获取mongo db端口,但是它出错了。我正在调查为什么会这样。

答案 2 :(得分:0)

好吧,找到了一个解决mongodb问题的地方......这与我所拥有的和那个人的解释有点不同。我们将docker-composer.yml上的mongodb定义为

mongodb的:    图像:mongo    等....

看起来链接工作或工作的方式是使用一些环境变量以及一些如何最终覆盖spring param mongodb.port或mongo.port。

MONGO_PORT = 'TCP://172.17.0.3:27017'

问题是解决方法是重命名我使用的容器mdb:etc ...并且问题已经消失。

希望这会有所帮助。将尝试更多地了解这一点,看看实际上在做什么