mongodb - 启动项目+Docker compose时遇到错误

标签 mongodb docker docker-compose dockerfile

我使用了 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

错误:
    $ 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 的初学者,我阅读了很多文档,但找不到任何解决方案。

最佳答案

您将相同的主机端口绑定(bind)到不同的 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
...

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

关于mongodb - 启动项目+Docker compose时遇到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62326770/

相关文章:

json - MongoDB - 带有 group_by 的嵌套数组的总和

php - MongoDB PHP : How do I get ObjectId with a JSON feed?(它是空白的)

docker - Docker访问本地主机

docker - 如何使用 docker-compose 在 laradock 中使用 zsh 而不是 bash

javascript - 如何让循环等待node.js中的回调?

mongodb - 由于数据库连接,Lamda 上的初始请求缓慢

docker - 禁用作为守护进程运行的 docker 镜像(始终重启策略)

docker - Heroku与docker一键部署golang应用程序

docker - docker 有 Windows 容器来构建 Windows 应用程序吗?

mysql - Docker 容器、内存消耗和日志