mid*_*007 7 mongodb docker spring-boot docker-compose
我有一个 Spring Boot 应用程序,并使用在 brew 服务中运行的 mongo db 开发它。
要连接到数据库,我只需将以下内容放入 Spring Boot 中的 application.properties 中
spring.data.mongodb.uri=mongodb://localhost:27017/db
Run Code Online (Sandbox Code Playgroud)
将应用程序属性更改为
spring.data.mongodb.uri=mongodb://mongo:27017/db
Run Code Online (Sandbox Code Playgroud)
没有改变任何东西,和以前一样的错误。
现在我正在尝试将 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"]
Run Code Online (Sandbox Code Playgroud)
这是我的 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
Run Code Online (Sandbox Code Playgroud)
执行 Docker-Compose 后
docker-compose up
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:(这是实际的错误消息)
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
Run Code Online (Sandbox Code Playgroud)
有人知道这里有什么问题吗?在开发环境中,它就像一个魅力。
提前致谢
将以下行添加到 Dockerfile
"-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg"
Run Code Online (Sandbox Code Playgroud)
像这样进入入口点解决了连接问题
ENTRYPOINT ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]
Run Code Online (Sandbox Code Playgroud)
我能够在 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"
Run Code Online (Sandbox Code Playgroud)
以及应用程序属性中的以下内容
spring.data.mongodb.host=docker_mongo
spring.data.mongodb.port=27017
spring.data.mongodb.database=db
Run Code Online (Sandbox Code Playgroud)
所以看起来连接现在正在通过网络工作。相同的代码不适用于 3.0 版
为了防止 SpringBoot 通过 localhost 自动连接到 mongo,还需要排除 MongoAutoConfiguration!
@SpringBootApplication(exclude={MongoAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)
谢谢大家的帮助
编辑:
我从来没有做过 spring-boot 开发,但是你说的显示错误很可能与 mongo 问题无关。但是,这里解释了为什么您的 mongo-connection 失败:
docker-compose 如果文件中没有指定一个虚拟网络(比如你的情况),则创建一个虚拟网络。
您的所有应用程序都在该网络内运行,彼此完全隔离。因此,localhost在您的 spring-boot 容器中实际上是指它自己。这意味着您的 spring-boot 应用程序期望mongo实例在其容器内运行(它不是,它在不同的容器中)。
当数据库和应用程序都在您的笔记本电脑网络上运行时,这会很好。但如前所述,它们现在docker-compose完全隔离地在网络中运行。
不过,docker-compose真是巧啊!它为您的每个容器创建一个 DNS,该 DNS 使用文件中指定的服务名称(在您的情况下mongo和spring),docker-compose以允许轻松访问网络内部的容器。
因此,您应该能够更改spring.data.mongodb.uri=mongodb://localhost:27017/db为spring.data.mongodb.uri=mongodb://mongo:27017/db并且应该允许它连接。
| 归档时间: |
|
| 查看次数: |
4222 次 |
| 最近记录: |