我有一个Spring Boot应用程序,并使用在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容器中,但是无法使任何连接正常工作。
这是我在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解决了连接问题
ENTRYPOINT ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]
我能够在Dockerfile的Entrypoint中获得没有上面提到的行的数据库连接。我想这是如果您想通过“链接”连接数据库
但是现在我可以通过网络连接了,这是我的代码:
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通过本地主机自动连接到mongo,还必须排除MongoAutoConfiguration!
@SpringBootApplication(exclude={MongoAutoConfiguration.class})
谢谢大家的帮助
答案 0 :(得分:3)
编辑:
我从未做过spring-boot开发,但是您要显示的错误很可能与mongo问题无关。但是,以下是有关mongo连接失败的原因的说明:
docker-compose
将创建一个虚拟网络(例如您的情况)。
所有应用程序都在此网络内运行,彼此完全隔离。因此,您的spring-boot容器中的localhost
实际上是指自身。意味着您的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
,并且应该可以连接它。
答案 1 :(得分:0)
如果您使用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
就应该是容器名称。
答案 2 :(得分:0)
尝试不定义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
答案 3 :(得分:0)
尝试以下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