【问题标题】:Encountered errors while bringing up the project+Docker compose启动项目+Docker compose时遇到错误
【发布时间】:2020-06-11 14:31:24
【问题描述】:

我使用了 SpringBoot RestApi 微服务和 MongoDB。 在 MongoDB 中,我有三个数据库,例如 player-db、game-db 和 score-db。 我的服务位于不同的文件夹中,并且我为每个文件夹定义了 Dockerfile。 播放器服务的 Dockerfile:

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

游戏服务的Dockerfile:

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

和评分服务的 Dockerfile:

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

我定义了一个 docker-compose.yml 文件:

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

实际上,在 docker-compose 文件中,我尝试为我的服务定义不同的数据库,但是当我执行 docker-compose up 时出现错误

错误:

    $ docker-compose up
Starting springmultiplemongoproject_db_1 ...
Starting springmultiplemongoproject_db2_1 ... error
Creating springmultiplemongoproject_db1_1 ...

ERROR: for springmultiplemongoproject_db2_1  Cannot start service db2: driver fa
iled programming external connectivity on endpoint springmultiplemongoproject_db
2_1 (736a5c8f4a485472d7d5c622f29fd892b533794b352cbccc97dae5c54e3ae54f): Bind for
Creating springmultiplemongoproject_db1_1 ... error

ERROR: for springmultiplemongoproject_db1_1  Cannot start service db1: driver fa
Starting springmultiplemongoproject_db_1  ... done
1_1 (e0ea7a6e31f0bec010ccfef67705732904d3fcf0eee55cee8577d464583070ff): Bind for
 0.0.0.0:27017 failed: port is already allocated
Creating springmultiplemongoproject_player-docker_1 ... done

ERROR: for db2  Cannot start service db2: driver failed programming external con
nectivity on endpoint springmultiplemongoproject_db2_1 (736a5c8f4a485472d7d5c622
f29fd892b533794b352cbccc97dae5c54e3ae54f): Bind for 0.0.0.0:27017 failed: port i
s already allocated

ERROR: for db1  Cannot start service db1: driver failed programming external con
nectivity on endpoint springmultiplemongoproject_db1_1 (e0ea7a6e31f0bec010ccfef6
7705732904d3fcf0eee55cee8577d464583070ff): Bind for 0.0.0.0:27017 failed: port i
s already allocated
ERROR: Encountered errors while bringing up the project.

我是 Docker 初学者,看了很多文档,没找到解决办法。

【问题讨论】:

  • 你能把你的错误写成文字,而不是截图!
  • 从端口号中删除 "27017:27017" 双引号,并清理您的图像。有时,如果以前的图像构建不完美,那么 docker 会从以前的图像缓存中构建一个图像,那么问题就来了。
  • 试试这个命令,docker rm images $(docker images -q)
  • 容器内部的端口可以随意相同,但是如果要绑定到宿主机mongodb://localhost:hostPort,就必须不一样,不然怎么处理宿主机的不同服务呢?
  • @thammada ya 我明白了你的意思,docker 容器的端口号可以相同,但主机的端口号应该不同。谢谢,我只是困惑

标签: mongodb docker docker-compose dockerfile


【解决方案1】:

您将相同的主机端口绑定到不同的 docker 服务。您必须为每个服务指定不同的主机端口。指定端口的语法如下:

 ports:
   - "HOST:CONTAINER"

所以对于HOST 部分,您需要不同的端口号

version: "3"
services:
    player-docker:
...
        ports:
            - 8081:8080
    game-docker:
...
        ports:
            - 8082:8080
    score-docker:
...
        ports:
            - 8083:8080
    db:
...
        ports:
            - 27018:27017
    db1:
...
        ports:
            - 27019:27017
    db2:
...
        ports:
            - 27019:27017
...

或者如果你想让 docker compose 为你分配主机端口号,你可以省略 HOST 部分,像这样

version: "3"
services:
    player-docker:
...
        ports:
            - 8080
    game-docker:
...
        ports:
            - 8080
    score-docker:
...
        ports:
            - 8080
    db:
...
        ports:
            - 27017
    db1:
...
        ports:
            - 27017
    db2:
...
        ports:
            - 27017
...

或者如果您不想为数据库服务绑定端口到主机,您可以省略ports 部分

【讨论】:

  • 谢谢。这是正确的,并且有效。只有一件事,当我在 Postman 中使用这个建议时,我得到了 Error: connect ECONNREFUSED 127.0.0.1:8080。
  • 我使用了 mashin IP,例如 192.168.99.100:8080/player,之后我得到“status”:500,“error”:“Internal Server Error”。我在执行 docker-compose up 时检查了 docker-shell
  • 我看到了这个:game-docker_1 |在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_252] 游戏-docker_1 |引起:java.net.ConnectException:连接被拒绝(连接被拒绝)。你能帮我吗
  • 您能否将当前的 docker-compose 文件连同新问题中的错误一起放入?
【解决方案2】:

这张图片可能会帮助您理解为什么我们必须为主机编写不同的端口。

容器本身就是一个操作系统。但是容器正在连接到托管多个容器的外部操作系统。因此,为了帮助主机识别您正在与哪个容器通信,我们需要使用不同的端口号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2020-10-02
    • 2017-01-03
    相关资源
    最近更新 更多