簡體   English   中英

mongodb與docker-compose [SocketTimeoutException]

[英]mongodb with docker-compose [SocketTimeoutException]

我有一個運行spring-boot的應用程序,可以訪問mongodb

當我使用單個docker run命令時,該應用程序運行正常。 但是,當我嘗試將它們全部作為服務運行時,由於某種原因,該應用程序永遠無法連接到mongo。

我嘗試過的

  • 從撰寫文件開始[在下面列出]
  • 單獨運行mongo並提供指向mongo的external_links [仍然失敗]
  • 在撰寫文件中,還提到了depends_on [仍然失敗]
  • 覆蓋撰寫文件中的主機名變量[失敗]

docker-compose.yaml

version: '2'
services:
 mongo:
  image: mongo:latest
  container_name: mongo
  ports:
   - "27017:27017"

 hygieia-api:
  image: hygieia-api:latest
  container_name: hygieia-api
  ports:
   - "8080:8080"
  volumes:
   - ./logs:/hygieia/logs
  links:
   - mongo:mongo
  environment:
    - JASYPT_ENCRYPTOR_PASSWORD=hygieiasecret
  depends_on:
   - mongo

 hygieia-ui:
  image: hygieia-ui:LATEST
  container_name: hygieia-ui
  ports:
   - "8088:80"
  links:
   - hygieia-api

編寫具有外部依賴性的文件:

mongo以docker run --name mongo -p 27017:27017 -d mongo

version: '2'
services:

 hygieia-api:
  image: hygieia-api:latest
  container_name: hygieia-api
  ports:
   - "8080:8080"
  volumes:
   - ./logs:/hygieia/logs
  external_links:
   - mongo:mongo
  environment:
    - JASYPT_ENCRYPTOR_PASSWORD=hygieiasecret
    - SPRING_DATA_MONGODB_HOST=mongo
  depends_on:
   - mongo

 hygieia-ui:
  image: hygieia-ui:LATEST
  container_name: hygieia-ui
  ports:
   - "8088:80"
  links:
   - hygieia-api

在上面列出的任何情況下,我得到的錯誤是:

hygieia-api    | 2017-05-22 19:20:43,918 INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server 172.17.0.2:27017 hygieia-api    | com.mongodb.MongoSocketOpenException: Exception opening socket hygieia-api    |    at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongo-java-driver-3.0.2.jar!/:na] hygieia-api    |  at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:114) ~[mongo-java-driver-3.0.2.jar!/:na] hygieia-api    |     at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127) ~[mongo-java-driver-3.0.2.jar!/:na] hygieia-api    |    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] hygieia-api    | Caused by: java.net.SocketTimeoutException: connect timed out hygieia-api    |     at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111] hygieia-api    |   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111] hygieia-api    |    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111] hygieia-api    |     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_111] hygieia-api    |  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_111] hygieia-api    |  at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_111] hygieia-api   |     at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) ~[mongo-java-driver-3.0.2.jar!/:na] hygieia-api    |    at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongo-java-driver-3.0.2.jar!/:na] hygieia-api    |  ... 3 common frames omitted hygieia-api    | 2017-05-22 19:20:55,118 INFO  o.a.catalina.core.StandardService - Stopping service Tomcat hygieia-api    | 2017-05-22 19:20:55,127 WARN  o.a.c.loader.WebappClassLoaderBase - The web application [api] appears to have started a thread named [cluster-ClusterId{value='592339f7e03dd80008647086', description='null'}-`172.17.0.2:27017`] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

docker inspect提供了應用程序引用的正確IP地址:

    "Ports": {
        "27017/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "27017"
            }
        ]
    },
    "SandboxKey": "/var/run/docker/netns/27e81b7954c9",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "ac2ded64c0bb0c9c1d82f4081b84ba2ae7f72e90527f310c7b107d0d3b7df1e0",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "MacAddress": "02:42:ac:11:00:02",
    "Networks": {
        "bridge": {
            "IPAMConfig": null,
            "Links": null,
            "Aliases": null,
            "NetworkID": "dc798dbca17eaced0a9bdb9f87da3672cdaa4424bafb0f49ba526c374cbfcc5b",
            "EndpointID": "ac2ded64c0bb0c9c1d82f4081b84ba2ae7f72e90527f310c7b107d0d3b7df1e0",
            "Gateway": "172.17.0.1",
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:11:00:02"

當應用程序和mongo獨立運行時,它就像一個魅力

docker run --name mongo -p 27017:27017 -d mongo

docker run --name hygieia-api --link mongo:mongo -e "JASYPT_ENCRYPTOR_PASSWORD=hygieiasecret"    -p 8080:8080 -d hygieia-api:latest

我想念什么?

使用docker compose時, 您可能會使用服務名稱訪問容器。 因此,只需按照以下步驟更改spring應用程序的mongodb IP配置:

mongo:27017

與您的第一個撰寫文件。

version: '2'
services:
 mongo:
  image: mongo:latest
  container_name: mongo
  ports:
   - "27017:27017"

 hygieia-api:
  image: hygieia-api:latest
  container_name: hygieia-api
  ports:
   - "8080:8080"
  volumes:
   - ./logs:/hygieia/logs
  links:
   - mongo:mongo
  environment:
    - JASYPT_ENCRYPTOR_PASSWORD=hygieiasecret
  depends_on:
   - mongo

 hygieia-ui:
  image: hygieia-ui:LATEST
  container_name: hygieia-ui
  ports:
   - "8088:80"
  links:
   - hygieia-api

這是帶有** version的示例:“ 3”

version: "3"
services:
    mongodb:
      image: mongo:3.2
      volumes:
       - ${HOME}/gocart_db:/data/db
      ports:
       - "27017:27017"

    blabla-service:
      image: blabla-service
      depends_on:
       - mongodb

在此示例中,我的blabla服務成功連接了mongodb:27017

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM