docker镜像未连接到mongodb
Posted
技术标签:
【中文标题】docker镜像未连接到mongodb【英文标题】:docker image not connecting to mongodb 【发布时间】:2021-12-25 16:32:53 【问题描述】:当我构建我的 docker 映像并运行它时,它会给出这个和错误但是如果我运行 jar 文件,一切运行正常,如果我猜它与我的 docer-compose.yml 文件有关,但 idk
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-core-4.2.3.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.2.3.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.2.3.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
at java.base/sun.nio.ch.NiosocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.2.3.jar!/:na]
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.2.3.jar!/:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.2.3.jar!/:na]
... 4 common frames omitted
Dockerfile
FROM openjdk:17
ADD target/docker-document-rest-api.jar docker-document-rest-api.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "docker-document-rest-api.jar"]
application.properties
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=example
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost
docer-compose.yml
version: "3.8"
services:
mongodb:
image: mongo
container_name: mongodb
ports:
- 27017:27017
volumes:
- data:/data
environment:
- MONGO_INITDB_ROOT_USERNAME=rootuser
- MONGO_INITDB_ROOT_PASSWORD=rootpass
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
- ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
- ME_CONFIG_MONGODB_SERVER=mongodb
volumes:
data:
networks:
default:
name: mongodb_network
【问题讨论】:
【参考方案1】:默认情况下,docker 容器使用bridge
网络,因此您无法从容器连接到localhost
。有几种方法可以解决这个问题,一种是将运行 Java 应用程序的容器连接到放置 MongoDB 的网络。
由于您在 docker-compose
中明确指定了网络名称 (mongodb_network
),因此我们可以执行以下操作:
-
在属性文件中,我们必须将
localhost
更改为mongodb
,所以:
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=example
spring.data.mongodb.port=27017
spring.data.mongodb.host=mongodb
这样做的原因是,如果我们连接到放置容器的网络,容器的名称可以用作hostname
。
-
为 Java 应用程序重建 docker 镜像,运行它:
docker run --network=mongodb_network -p 8080:8080 <docker-image-name>
(在此处填写您的 docker 镜像名称)
虽然这些步骤可能有效,但我建议将您的应用程序添加到 docker-compose
:
version: "3.8"
services:
mongodb:
image: mongo
container_name: mongodb
expose:
- 27017
ports:
- 27017:27017
volumes:
- data:/data
environment:
- MONGO_INITDB_ROOT_USERNAME=rootuser
- MONGO_INITDB_ROOT_PASSWORD=rootpass
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
- ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
- ME_CONFIG_MONGODB_SERVER=mongodb
spring_application:
build: .
container_name: spring_application
ports:
- 8080:8080
depends_on:
mongodb:
condition: service_started
volumes:
data:
networks:
default:
name: mongodb_network
这必须首先使用docker-compose build
构建,然后才能使用docker-compose up
执行。
【讨论】:
【参考方案2】:您必须使用 docker 内部主机网络来连接 mongodb。因此,从您的 dockerized 应用程序中,您必须连接服务名称(因为那是主机名)而不是连接 localhost。在您的情况下:http://mongodb:27017
是您的 mongo db 容器的服务(以及主机名)。
【讨论】:
以上是关于docker镜像未连接到mongodb的主要内容,如果未能解决你的问题,请参考以下文章
运行 docker compose up 时 Postgres db 未连接到 docker
Keycloak Docker 容器未连接到 MySQL 数据库