我使用了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的初学者,并且阅读了许多文档,但找不到任何解决方案。
您要将相同的主机端口绑定到不同的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为您分配主机端口号,则可以省略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
部分
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句