【问题标题】:Cannot connect to mongo container无法连接到 mongo 容器
【发布时间】:2019-06-21 15:50:39
【问题描述】:

我有一个先前的问题(我认为至少)当我设法修复我遇到的错误时或多或少变得无用。但是我的新错误是我似乎无法从内部连接到 mongodb我的码头工人形象

docker-compose.yml:

version: '3.1'
services:
  company-repo-docker-app:
    image: company-repo-image
    build:
        context: ./
    dockerfile: Dockerfile
    depends_on:
        - mongo
ports:
    - 8080:8080
mongo:
image: mongo
ports:
  - '27017:27017'
networks:
  mongo_net:
    ipv4_address: 172.28.0.2

networks:
  mongo_net:
    driver: bridge
    ipam:
      driver: default
      config:
      -
       subnet: 172.28.0.2/24

application.properties:

spring.data.mongodb.database=myDb
spring.data.mongodb.host=172.28.0.2 
spring.data.mongodb.port=27017

以及实际的错误:

 com.mongodb.MongoSocketOpenException: Exception opening socket
   at com.mongodb.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.6.4.jar!/:na]
   at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.6.4.jar!/:na]
   at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) ~[mongodb-driver-core-3.6.4.jar!/:na]
   at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
Caused by: java.net.SocketTimeoutException: connect timed out 

【问题讨论】:

  • 首先,您创建了一个自定义网络并指定 mongo 容器在该网络中运行,但没有将应用程序指定在同一网络中运行?
  • 老实说,我认为我不需要这样做,每次运行应用程序时,应用程序都在该网络上运行
  • 设置spring.data.mongodb.host=mongo 时会发生什么。行得通吗?同时分享docker inspect network mongo_net的输出。让我们找到两个容器都连接到该网络及其 ip`s。

标签: java spring mongodb docker docker-compose


【解决方案1】:

我同意大卫的回答是正确的。但这是一个要点,您的配置也有效,我尝试了我的示例,结果如下。

问题是您的应用未连接到网络。

services:
  company-repo-docker-app:
    image: company-repo-image
    build:
        context: ./
    dockerfile: Dockerfile
    depends_on:
        - mongo
    ports:
     - 8080:8080
    networks:
     - mongo_net

示例 docker-compose.yml

version: '3.1'
services:
  mongo-app:
    image: barath-mongo
    ports:
      - "9000:9000"
    depends_on:
      - mongo
    environment:     
      SPRING_DATA_MONGODB_PORT: 27017
      SPRING_DATA_MONGODB_HOST: 172.28.0.2 
      SPRING_DATA_MONGODB_DATABASE: myDb
    networks:
      - mongo_net
  mongo:
    image: mongo
    ports:
    - '27017:27017'
    networks:
     mongo_net:
        ipv4_address: 172.28.0.2
networks:
  mongo_net:
    driver: bridge
    ipam:
      driver: default
      config:
      -
       subnet: 172.28.0.2/24

mongo容器ip地址

$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ec2-user_mongo_1
172.28.0.2

泊坞窗网络设置

 "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.28.0.2/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "02b8b4148dd830eaddeb7e9ebd6305a6ae3c106bae5a495103c632aec7999274": {
                "Name": "ec2-user_mongo-app_1",
                "EndpointID": "885088d551888e1dec95b1c0e337c6a4b84f1bb2aebc4407963d3c0b4f6ec09d",
                "MacAddress": "02:42:ac:1c:00:03",
                "IPv4Address": "172.28.0.3/24",
                "IPv6Address": ""
            },
            "3e4266fca3c8163412cc1c4733cad004aa0f366dc9fe30d03c7ecafe87b4e826": {
                "Name": "ec2-user_mongo_1",
                "EndpointID": "a6a72c7fc314a294c53d5c394ac1757702a0a95c588af2f730e971953dbbaa5f",
                "MacAddress": "02:42:ac:1c:00:02",
                "IPv4Address": "172.28.0.2/24",
                "IPv6Address": ""
            }
        },

输出

ongo-app_1  | 2019-01-28 17:07:29.710  INFO 1 --- [72.28.0.2:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:1, serverValue:1}] to 172.28.0.2:27017
mongo-app_1  | 2019-01-28 17:07:29.735  INFO 1 --- [72.28.0.2:27017] org.mongodb.driver.cluster               : Monitor thread successfully connected to server with description ServerDescription{address=172.28.0.2:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[4, 0, 5]}, minWireVersion=0, maxWireVersion=7, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=20314562}
mongo-app_1  | 2019-01-28 17:07:29.742  INFO 1 --- [72.28.0.2:27017] org.mongodb.driver.cluster               : Discovered cluster type of STANDALONE
mongo-app_1  | 2019-01-28 17:07:30.387  INFO 1 --- [           main] com.barath.app.service.CustomerService   : Saving the customer with customer details com.barath.app.document.Customer@37654521
mongo_1      | 2019-01-28T17:07:30.488+0000 I NETWORK  [listener] connection accepted from 172.28.0.3:56250 #2 (2 connections now open)
mongo_1      | 2019-01-28T17:07:30.491+0000 I NETWORK  [conn2] received client metadata from 172.28.0.3:56250 conn2: { driver: { name: "mongo-java-driver", version: "3.8.2" }, os: { type: "Linux", name: "Linux", architecture: "amd64", version: "4.14.77-81.59.amzn2.x86_64" }, platform: "Java/Oracle Corporation/1.8.0_191-b12" }
mongo-app_1  | 2019-01-28 17:07:30.497  INFO 1 --- [           main] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:2, serverValue:2}] to 172.28.0.2:27017
mongo_1      | 2019-01-28T17:07:30.576+0000 I STORAGE  [conn2] createCollection: myDb.customer with generated UUID: 6bd5b022-16b6-4a04-96b0-d94988155a53
mongo-app_1  | 2019-01-28 17:07:31.514  INFO 1 --- [           main] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]
mongo-app_1  | 2019-01-28 17:07:31.879  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
mongo-app_1  | 2019-01-28 17:07:32.372  INFO 1 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
mongo-app_1  | 2019-01-28 17:07:32.432  INFO 1 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
mongo-app_1  | 2019-01-28 17:07:32.522  INFO 1 --- [           main] s.d.s.w.s.ApiListingReferenceScanner     : Scanning for api listing references
mongo-app_1  | 2019-01-28 17:07:32.977  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9000 (http) with context path ''
mongo-app_1  | 2019-01-28 17:07:32.984  INFO 1 --- [           main] com.barath.app.Application               : Started Application in 11.151 seconds (JVM running for 13.149)

【讨论】:

  • 感谢您的回答:DI 现在最终选择了 David 的解决方案(KISS :'D),但您的解决方案对我来说非常有用,我相信它会在以后的开发中出现!
【解决方案2】:

您已在 docker-compose.yml 文件中明确创建了一个网络,并将您的数据库设置为使用该网络。 Docker Compose 还为您创建了一个默认网络,并且由于您的应用程序没有明确声明任何网络,因此它仅附加到默认网络。那么这两个容器在不同的网络上,一个不能到达另一个。

这里最简单的解决方案是删除所有手动网络配置:

version: '3.1'
services:
  company-repo-docker-app:
    image: company-repo-image
    build:
      context: ./
    depends_on:
      - mongo
    ports:
      - '8080:8080'
  mongo:
    image: mongo
    ports:
      - '27017:27017'

服务块的名称将是一个有效的 DNS 主机名,您可以在配置中设置spring.data.mongodb.host=mongo

【讨论】:

  • 如何在spring的application.properties文件中设置“spring.data.mongodb.host=mongo”并运行maven install?如果我这样做,我的构建会失败。我试过“spring.data.mongodb.uri=mongodb://mongo/test”和它是一样的。有没有办法让我不必构建 .jar 文件而仍然让我的 Spring 应用程序在容器上运行?
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2018-09-24
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多