Dockerize spring 启动 mongo

Dockerize spring boot mongo

我正在尝试 docker使用 mongodb 后端 spring 启动网络应用程序。 我 运行 mongo 并使用以下命令将其映射到主机:

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

我已经用 spring 引导代码构建了一个 jar,并且能够 运行 它成功。它插入并打印一些数据。 现在,我 docker 使用以下 Dockerfile

对这个 jar 进行处理
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。但是,它只是 returns 硬编码数据。

我在控制台中看到的错误

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]

任何输入都非常适用

您的 Docker 主机的 IP 地址是什么?

您的应用尝试使用 localhost 连接到 Mongo。根据您使用的 Docker 安装(考虑到我假设 Docker 工具箱的问题),localhost 将无法工作。您可以尝试 Docker 主机的 IP 地址而不是 localhost。大多数时候,IP 是 192.168.99.100,但也可以是其他 IP。

您可以使用Docker命令行执行docker-machine ip找到地址。

问题始于您的 connectionString 到 mongoDb 以及容器的架构

您正在尝试从 java 容器连接到 localhost:27017。在 java 容器中,Mongo 不是 运行。取而代之的是 运行 在另一个容器中。您必须更改连接字符串以指向 my-mongodb-container: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 and how to configure connection details to MongoDB?

中所述

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345
spring.data.mongodb.host=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

终于成功了。

我所做的唯一更改是在启动时将实例连接到首选 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。