【发布时间】: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