当前位置: 首页 > 知识库问答 >
问题:

DockerizeSpring靴mongo

逄烨
2023-03-14

我正在尝试将spring boot web应用程序与mongodb后端对接。我运行mongo并使用以下命令将其映射到主机:

docker run -p27017:27017 --name my-mongodb-container -d mongo:latest

我已经用spring启动代码构建了一个jar,并且能够成功地运行它。它插入并打印一些数据。现在,我用下面的Dockerfile将这个jar dockerize

FROM adoptopenjdk/openjdk11
EXPOSE 8080
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]

我以以下方式运行docker容器:

docker run -p 4444:8080 --name mydoctest --link my-mongodb-container doc40

实例出现,尝试连接到mongo失败。但是应用程序被加载了,因为我有另一个正常运行的url。但是,它只返回硬编码数据。

我在控制台上看到的错误

2021-09-23 17:13:02.725  INFO 1 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {
hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
2021-09-23 17:13:02.824  INFO 1 --- [localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread whi
le connecting to server localhost:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.2.3.jar!/:na]
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-cor
e-4.2.3.jar!/:na]

任何输入都是非常精确的

共有3个答案

柴瀚
2023-03-14

你的Docker主机的IP地址是多少?

您的应用程序尝试使用localhost连接到Mongo。根据您使用的Docker安装(考虑到这个问题,我假设Docker Toolbox),localhost将无法工作。您可以尝试Docker主机的IP地址,而不是localhost。大多数情况下,IP是192.168.99.100,但也可能是其他的。

您可以通过使用Docker命令行执行docker机器ip来查找地址。

蒋斯伯
2023-03-14

终于成功了。

我所做的唯一更改是在启动时将实例连接到首选n/w。

docker run -p27017:27017 --name my-mongodb-container --network=app-network -d mongo:latest

docker run -p 4444:8080 --name mydoctest --network=app-network -e SPRING_DATA_MONGODB_URI=mongodb://my-mongodb-container:27017/test doc40

我试图运行容器,然后将其添加到n/w。

傅阳炎
2023-03-14

问题始于您的连接到mongoDb的String和容器的体系结构

您正在尝试从java容器连接到localhost:27017。在java容器中,Mongo没有运行。而是在另一个容器中运行。您必须更改连接字符串以指向我的mongodb容器:27017

我建议使用docker网络而不是--link,因为它已经过时了https://docs.docker.com/network/links/

我给你举个简单的例子

docker network create -d brigde app-network
docker run -p27017:27017 --name my-mongodb-container -d mongo:latest
docker network connect app-network my-mongodb-container
docker run -p 4444:8080 --name mydoctest doc40
docker network connect app-network mydoctest

(我没有测试过,如果有错误请告诉我)

根据您使用的Mongo驱动程序,您必须设置2个不同的变量来更改您的连接字符串,如Spring Boot中所述,以及如何配置MongoDB的连接详细信息?

Spring数据mongodb。uri=mongodb://user:secret@mongo1。实例com:12345
Spring。数据mongodb。主机=127.0.0.1

因此,您可以分别使用

docker run -p 4444:8080 --name mydoctest -e SPRING_DATA_MONGODB_URI=mongodb://my-mongodb-container:27017 doc40
or
docker run -p 4444:8080 --name mydoctest -e SPRING_DATA_MONGODB_HOST=my-mongodb-container doc40
 类似资料:
  • 我想在我的Junit5单元测试中将值注入到带有@Value注释的私有字段。 我引用了这个,并使用了ReflectionTestUtils。setField通过注入值解决了我的问题,但在验证方法被调用的次数时失败。 MyClass(我的类别): 测试类: 运行上述测试时出错 我想kafkaTemplate.sendMessage();被调用一次,但被调用两次后添加反射TestUtils。 需要关于如

  • 我正在用Thymeleaf构建一个Spring Boot应用程序。我的模板(视图)和静态文件夹都在src/main/Resources/静态和src/main/Resources/tem板下。当我通过main方法(使用eclipse)运行应用程序时,一切都很好。但是,我已经按照说明创建了一个war文件,当我将其部署到Tomcat 7时——静态内容丢失了,只显示了Thymeleaf html模板。

  • 我使用spring boot和redis进行缓存。我可以使用缓存从数据库(oracle)获取的数据。当我尝试用redisTemplate从获取数据时,结果是0为什么?? Redis配置:

  • 我需要用mocking道测试服务方法。我还需要测试道方法来知道一个方法是否正确工作。但是我不能将mockito与Spring引导集成。如果我使用第一次测试工作,如果我使用第二次测试工作。我也尝试使用代替,但是它也不工作。

  • 我正在使用Spring boot 2.0.2应用程序通过HTTPS对外部api进行REST api调用。 我是TLS和SSL的新手。我的理解是,TLS是一种更安全的方式,用于传输安全的敏感数据。 我的问题是: 如何确定我的应用程序使用的TLS版本

  • 我有两个项目。我用Angular2 cli构建的Angular2应用程序和只为Angular2应用程序服务的Spring Boot应用程序。我用构建Angular2应用程序,它会生成一个文件夹。然后,我将文件夹的内容放在Spring Boot应用程序的中。 我的Spring启动应用程序有两个文件。 Spring Boot应用程序类: 及其应用。属性文件: 它工作得很好,但是如果我转到一个url并点