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。
我正在尝试 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。