[英]SpringBoot in Docker not connecting to Mongo and throws Exception
[英]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
文件中指定的服務名稱(在您的情況下為mongo
和spring
),以便於訪問網絡內的容器。
所以,您應該能夠將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.