【问题标题】:SpringBoot in Docker not connecting to Mongo and throws ExceptionDocker中的SpringBoot未连接到Mongo并引发异常
【发布时间】:2020-06-14 17:27:10
【问题描述】:

我有三个微服务和三个数据库,例如 player-db、game-db 和 score-db。 对于这些服务中的每一个,我在它们的文件夹中定义了 Dockerfile。 (DockerFiles 相同,只是 JAR 文件的名称和 container_name 不同) 用于评分服务的 DockerFile:

 FROM openjdk:8
COPY ./target/demo-0.0.1-SNAPSHOT.jar score.jar
EXPOSE 8080
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://score-container-db:27017/","-jar","-Djava.rmi.server.hostname=127.0.0.1", "score.jar"]

我必须指出,我所有的服务包都是子包:

package spring.multiple.mongo.project;

这是我的应用程序,顺便说一下,在我使用的应用程序中 @SpringBootApplication(排除 = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) 用于自动配置。 我的申请:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
//@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这是我的 docker-compose.yml:

    version: "3"
services:
    player-docker:
        build:
            context: ./
            dockerfile: ./src/main/java/spring/multiple/mongo/project/player/DockerFile
        restart: always
        ports:
            - 8081:8080
        depends_on:
            - db
    game-docker:
        build:
            context: ./
            dockerfile: ./src/main/java/spring/multiple/mongo/project/game/DockerFile
        restart: always
        ports:
            - 8082:8080
        depends_on:
            - db1
    score-docker:
        build:
            context: ./
            dockerfile: ./src/main/java/spring/multiple/mongo/project/score/Dockerfile
        restart: always
        ports:
            - 8083:8080
        depends_on:
            - db2 
    db:
        image: mongo
        container_name: player-container-db
        volumes:
            - mongodata:/data/db
        ports:
            - 27017:27017
        restart: always
        environment:
            MONGO_INITDB_ROOT_DATABASE: player-mongo-db
    db1:
        image: mongo
        container_name: game-container-db
        volumes:
            - mongodata:/data/db1
        ports:
            - 27018:27017
        restart: always
        environment:
            MONGO_INITDB_ROOT_DATABASE: game-mongo-db
    db2:
        image: mongo
        container_name: score-container-db
        volumes:
            - mongodata:/data/db2
        ports:
            - 27019:27017
        restart: always
        environment: 
            MONGO_INITDB_ROOT_DATABASE: score-mongo-db
volumes:
    mongodata:

我的 application.properties:

    spring.data.mongodb.host=localhost
spring.data.mongodb.database=player-db
spring.data.mongodb.port=27017
spring.data1.mongodb.host=localhost
spring.data1.mongodb.database=game-db
spring.data1.mongodb.port=27017
spring.data2.mongodb.host=localhost
spring.data2.mongodb.database=score-db
spring.data2.mongodb.port=27017

问题是,当我运行 docker-compose up 时,当启动 SpringBoot 部分时,对于我的所有服务,它都会显示一个错误:

 score-docker_1   | 2020-06-14 17:08:17.698  INFO 1 --- [localhost:27017] org.mon
godb.driver.cluster               : Exception in monitor thread while connecting
 to server localhost:27017
score-docker_1   |
score-docker_1   | com.mongodb.MongoSocketOpenException: Exception opening socke
t
score-docker_1   |      at com.mongodb.internal.connection.SocketStream.open(Soc
ketStream.java:70) ~[mongo-java-driver-3.11.2.jar!/:na]
score-docker_1   |      at com.mongodb.internal.connection.InternalStreamConnect
ion.open(InternalStreamConnection.java:128) ~[mongo-java-driver-3.11.2.jar!/:na]

score-docker_1   |      at com.mongodb.internal.connection.DefaultServerMonitor$
ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongo-java-driver-3.1
1.2.jar!/:na]
score-docker_1   |      at java.lang.Thread.run(Thread.java:748) [na:1.8.0_252]
score-docker_1   | Caused by: java.net.ConnectException: Connection refused (Con
nection refused)
score-docker_1   |      at java.net.PlainSocketImpl.socketConnect(Native Method)
 ~[na:1.8.0_252]
score-docker_1   |      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPl
ainSocketImpl.java:350) ~[na:1.8.0_252]
score-docker_1   |      at java.net.AbstractPlainSocketImpl.connectToAddress(Abs
tractPlainSocketImpl.java:206) ~[na:1.8.0_252]
score-docker_1   |      at java.net.AbstractPlainSocketImpl.connect(AbstractPlai
nSocketImpl.java:188) ~[na:1.8.0_252]
score-docker_1   |      at java.net.SocksSocketImpl.connect(SocksSocketImpl.java
:392) ~[na:1.8.0_252]
score-docker_1   |      at java.net.Socket.connect(Socket.java:607) ~[na:1.8.0_2
52]
score-docker_1   |      at com.mongodb.internal.connection.SocketStreamHelper.in
itialize(SocketStreamHelper.java:64) ~[mongo-java-driver-3.11.2.jar!/:na]
score-docker_1   |      at com.mongodb.internal.connection.SocketStream.initiali
zeSocket(SocketStream.java:79) ~[mongo-java-driver-3.11.2.jar!/:na]
score-docker_1   |      at com.mongodb.internal.connection.SocketStream.open(Soc
ketStream.java:65) ~[mongo-java-driver-3.11.2.jar!/:na]
score-docker_1   |      ... 3 common frames omitted
score-docker_1   |
game-docker_1    | 2020-06-14 17:08:19.260  INFO 1 --- [           main] o.s.s.c
oncurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTas
kExecutor'
game-docker_1    | 2020-06-14 17:08:20.490  INFO 1 --- [           main] o.s.b.w
.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with
context path ''
score-docker_1   | 2020-06-14 17:08:19.751  INFO 1 --- [           main] o.s.s.c
oncurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTas
kExecutor'
score-docker_1   | 2020-06-14 17:08:20.776  INFO 1 --- [           main] o.s.b.w
.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with
context path ''
game-container-db | 2020-06-14T17:07:55.286+0000 I  COMMAND  [LogicalSessionCach
eRefresh] command config.system.sessions command: createIndexes { createIndexes:
 "system.sessions", indexes: [ { key: { lastUse: 1 }, name: "lsidTTLIndex", expi
reAfterSeconds: 1800 } ], $db: "config" } numYields:0 reslen:114 locks:{ Paralle
lBatchWriterMode: { acquireCount: { r: 2 } }, ReplicationStateTransition: { acqu
ireCount: { w: 3 } }, Global: { acquireCount: { r: 1, w: 2 } }, Database: { acqu
ireCount: { r: 1, w: 2, W: 1 } }, Collection: { acquireCount: { r: 4, w: 1, R: 1
, W: 2 } }, Mutex: { acquireCount: { r: 3 } } } flowControl:{ acquireCount: 1, t
imeAcquiringMicros: 1 } storage:{} protocol:op_msg 1880ms
score-container-db | 2020-06-14T17:07:55.232+0000 I  COMMAND  [LogicalSessionCac
heRefresh] command config.system.sessions command: createIndexes { createIndexes
: "system.sessions", indexes: [ { key: { lastUse: 1 }, name: "lsidTTLIndex", exp
ireAfterSeconds: 1800 } ], $db: "config" } numYields:0 reslen:114 locks:{ Parall
elBatchWriterMode: { acquireCount: { r: 2 } }, ReplicationStateTransition: { acq
uireCount: { w: 3 } }, Global: { acquireCount: { r: 1, w: 2 } }, Database: { acq
uireCount: { r: 1, w: 2, W: 1 } }, Collection: { acquireCount: { r: 4, w: 1, R:
1, W: 2 } }, Mutex: { acquireCount: { r: 3 } } } flowControl:{ acquireCount: 1,
timeAcquiringMicros: 1 } storage:{} protocol:op_msg 1826ms

在邮递员中:

Error: connect ECONNREFUSED 192.168.99.100:8080

我尝试了太多东西,我阅读了太多文档,但我找不到任何解决方案。 另外,我是 Docker 的初学者。 另外,我尝试 set spring.data.mongo.host = "To the service name in docker compose" 并将 spring.data.mongo.port = " 设置为服务端口",如:

 spring.data.mongodb.host=player-container-db
spring.data.mongodb.database=player-db
spring.data.mongodb.port=27017
spring.data1.mongodb.host=game-container-db
spring.data1.mongodb.database=game-db
spring.data1.mongodb.port=27018
spring.data2.mongodb.host=score-container-db
spring.data2.mongodb.database=score-db
spring.data2.mongodb.port=27019

但没有任何改变,我和以前一样有错误。!

【问题讨论】:

  • 你可以检查 docker 网络
  • @MeiramChuzhenbayev 你能告诉我怎么做吗?!因为我不熟悉它

标签: mongodb docker docker-compose dockerfile


【解决方案1】:

您是否尝试将 mongo 连接 uri 设置为 mongodb://<docker-container-name>:<port>?例如,在播放器 docker 中,您的 uri 将是 mongodb://player-docker:27017

【讨论】:

  • 是的,我做了,但我使用了 27017。例如对于 game-container-db:27017,之后我尝试了这个:player-container-db:27017 和 game-container-db: 27018 和 score-container-db:27019。但错误和以前一样
  • 你能打印出用于从每个服务连接的连接 uri 吗?
【解决方案2】:

问题出在一些事情上: 1-我忘记了每次对我的应用程序进行一些更改时,我必须重建 JAR 文件。 2-我所有数据库的卷都是相同的,它导致了过度写入,因为这个 mongo 找不到其他(数据库),所以对于每个我使用不同的卷

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2019-11-18
    • 2019-08-04
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多