簡體   English   中英

Docker 中的 SpringBoot 未連接到 Docker 中的 Mongo

[英]SpringBoot in Docker not connecting to Mongo in Docker

我有一個 Spring 引導應用程序,並使用在 brew 服務中運行的 mongo db 開發它。

要連接到數據庫,我只需將以下內容放入 Spring Boot 中的 application.properties

spring.data.mongodb.uri=mongodb://localhost:27017/db

將應用程序屬性更改為

spring.data.mongodb.uri=mongodb://mongo:27017/db

沒有改變任何東西,和以前一樣的錯誤。

現在我正在嘗試將 SpringBoot 應用程序和 MongoDB 放入 Docker-Containers,但無法使任何連接正常工作。

所以這是我在 SpringBoot 應用程序中的 Dockerfile :

FROM openjdk:8-jdk-alpine
VOLUME /tmp
EXPOSE 8080
ADD /build/libs/dg-0.0.1-SNAPSHOT.jar dg-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]

這是我的 Docker-Compose.yml 文件:

version: '3'

services:

mongo:
 container_name: docker-mongo
 image: mongo:latest
 ports:
   - "27017:27017"
 volumes:
  - ./data/db:/data/db

spring:
 depends_on:
   - mongo
 image:
   docker-spring-http-alpine
 ports:
   - "8080:8080"
 links:
   - mongo

執行 Docker-Compose 后

docker-compose up

我收到以下錯誤:(這是實際的錯誤消息)

2019-07-08 23:10:19.990  INFO 1 --- [localhost:27017] org.mongodb.driver.cluster: Exception in monitor thread while connecting to server localhost:27017


    com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.8.2.jar!/:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar!/:na]
... 3 common frames omitted

有人知道這里有什么問題嗎? 在開發環境中,它就像一個魅力。

提前致謝

將以下行添加到 Dockerfile

"-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg"

像這樣進入入口點解決了連接問題

ENTRYPOINT ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]

在 Dockerfile 的入口點中,我能夠在沒有上述行的情況下連接到數據庫。 我想這是如果你想通過“鏈接”連接你的數據庫

但現在我能夠通過網絡連接,這是我的代碼:

version: '3.6'

services:

 mongo:
 container_name: docker_mongo
 networks:
   - gateway
 ports:
   - "27017:27017"
 hostname: mongo
 image: mongo:latest
 volumes:
   - ./data/db:/data/db

 spring:
 container_name: docker-spring
 networks:
   - gateway
 ports:
   - "8080:8080"
 hostname: spring
 depends_on:
   - mongo
 image: dg-docker-spring-http-alpine-j
 networks:
gateway:
driver: "bridge"

以及應用程序屬性中的以下內容

spring.data.mongodb.host=docker_mongo
spring.data.mongodb.port=27017
spring.data.mongodb.database=db

所以看起來連接現在正在通過網絡工作。 相同的代碼不適用於 3.0 版

為了防止 SpringBoot 通過 localhost 自動連接到 mongo,還需要排除 MongoAutoConfiguration!

@SpringBootApplication(exclude={MongoAutoConfiguration.class})

謝謝大家的幫助

編輯:

我從來沒有做過spring-boot開發,但是你所說的錯誤可能與mongo問題無關。 但是,這里有一個解釋為什么你的mongo連接失敗:


docker-compose創建一個虛擬網絡(如果尚未在文件中指定)(如您的情況)。

您的所有應用程序都在此網絡內部運行,彼此完全隔離。 因此,spring-boot容器中的localhost實際上是指自己。 這意味着你的spring-boot應用程序期望mongo實例在其容器內運行(不是,它在不同的容器中)。

當數據庫和應用程序在筆記本電腦的網絡上運行時,這樣就可以了。 但如上所述,它們現在在docker-compose網絡中運行,完全隔離。

然而, docker-compose真的很聰明! 它為您的每個容器創建一個DNS,它使用docker-compose文件中指定的服務名稱(在您的情況下為mongospring ),以便於訪問網絡內的容器。

所以,您應該能夠將spring.data.mongodb.uri=mongodb://localhost:27017/db更改為spring.data.mongodb.uri=mongodb://mongo:27017/db並且應該允許它連接。

如果您使用container name作為連接到mongodb的主機名,則您的應用程序容器和mongodb容器應位於同一網絡中。

docker-compose.yml文件中,您為兩個容器創建一個公共網絡,並將它們連接到這個新創建的網絡,以便查找工作。

mongo:
 container_name: docker-mongo #If this still not works, try using this name as the mongodb hostname.
 image: mongo:latest
 ports:
   - "27017:27017"
 volumes:
  - ./data/db:/data/db
 networks:
  - my-net

spring:
 depends_on:
   - mongo
 image: docker-spring-http-alpine
 ports:
   - "8080:8080"
 networks:
   - my-net

networks:
  my-net:

您應該使用容器名稱作為主機名,即使您的容器位於同一網絡中也是如此。 因此,如果您已定義container_name屬性,請每次嘗試使用容器名稱。 檢查內聯評論。

更新:

application.properties文件的MongoDB連接屬性。

# MongoDB
spring.data.mongodb.host=<container_name>
spring.data.mongodb.port=27017
spring.data.mongodb.database=app1

這些是連接MongoDB所需的最小連接配置。 只要容器位於同一網絡中,您的host應該是容器名稱。

盡量不要定義Mongo的端口。

version: '3'

services:

mongo:
 container_name: docker-mongo
 image: mongo:latest
 volumes:
  - ./data/db:/data/db

spring:
 depends_on:
   - mongo
 image:
   docker-spring-http-alpine
 ports:
   - "8080:8080"
 links:
   - mongo

嘗試以下docker-compose.yml hostname應該解決您的問題

version: '3'
services:
  mongo:
    container_name: docker-mongo
    image: mongo:latest
    ports:
     - "27017:27017"
    volumes:
     - ./data/db:/data/db
    hostname: mongo

 spring:
   depends_on:
    - mongo
   image:docker-spring-http-alpine
   ports:
    - "8080:8080"
   hostname: spring
   links:
    - mongo

暫無
暫無

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

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