【问题标题】:Connection refused trying to connect to mongoDB docker instance连接拒绝尝试连接到 mongoDB docker 实例
【发布时间】:2021-01-20 15:59:33
【问题描述】:

我正在尝试使用带有 JPA 的 MongoDB 部署一个简单的应用程序,但我无法使其正常工作。

当我在 docker 容器中部署应用程序时,我不断收到以下错误:

2020-10-05 18:47:39.770 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:70) ~[mongodb-driver-core-4.0.5.jar!/:na]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:127) ~[mongodb-driver-core-4.0.5.jar!/:na]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-4.0.5.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:63) ~[mongodb-driver-core-4.0.5.jar!/:na]
    at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.0.5.jar!/:na]
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.0.5.jar!/:na]
    ... 3 common frames omitted

这是我用来构建镜像的 dockerfile:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

还有我用来运行mongoDB的docker-compose.yml:

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

我的实体都遵循以下模式(作为实体的名称):

@Document
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class <Name>Entity {
    @Id
    private Integer <Name>Id;
    // More data
}

还有我的 JPA 存储库(如上,是 jpa 类和实体的名称):

public interface <Name>JPA extends MongoRepository<<Name>Entity, Integer>{
}

最后,我在 application.properties 下定义了以下属性:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=api-database
spring.data.mongodb.username=root
spring.data.mongodb.password=example
spring.data.mongodb.repositories.enabled=true

我可以连接到 localhost:8081 以查看 mongo-express 界面,但除此之外,我什么也没看到。

【问题讨论】:

  • 有同样的异常,但我将 mongodb 端口映射到 26000 并且我能够从外部连接到该端口上的 db,但在 docker-compose 中,我的 spring 应用程序仍然必须使用默认值27017.

标签: java mongodb spring-boot docker spring-data-jpa


【解决方案1】:

他们无法通过环回地址连接,因为 mongodb 和应用程序位于不同的容器中。它们就像不同的机器,localhost 不是主机,而是容器本身。改用服务名称(来自docker-compose.yml):

spring.data.mongodb.host=mongo:27017

【讨论】:

  • 另外,我必须将端口放在主机属性中,而不是为其定义另一个属性。非常感谢!
  • 遇到了同样的问题。使用“mongo:27017”作为主机属性解决了这个问题。
  • 您是否编辑了 application.priperties 文件?像这样:- spring.data.mongodb.host=mongo:27017 ?我有同样的问题当我尝试从 docker 启动 mongo 时,它给了我以下连接 url:-连接到:mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
猜你喜欢
  • 2021-11-16
  • 2019-10-20
  • 2021-09-18
  • 2021-06-24
  • 1970-01-01
  • 2020-01-29
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多