我有一个包含三个部分的示例应用程序:
目标是将这三个部分容器化并运行应用程序。
为此,我已经创建了docker-compose.yml
文件,如下所示:
# docker-compose -f docker-compose.prod.yml build
# docker-compose -f docker-compose.prod.yml up -d
# docker-compose -f docker-compose.prod.yml down
version: '3'
services:
mongodb:
image: mongo
container_name: mongodb-instance-microservices
ports:
- "27020:27017"
networks:
- microservices-network
client:
container_name: client-instance-microservices
image: client-microservices
build:
context: ./client
dockerfile: prod.dockerfile
ports:
- "8080:80"
- "443:443"
depends_on:
- api
networks:
- microservices-network
api:
container_name: api-instance-microservices
image: api-microservices
build:
context: ./server
dockerfile: server.dockerfile
environment:
- NODE_ENV=production
ports:
- "3000:3000"
depends_on:
- mongodb
networks:
- microservices-network
networks:
microservices-network:
driver: bridge
在服务器端,我正在运行主app.js
,它正尝试使用以下连接字符串连接到mongodb:
mongodb:// mongodb-instance-microservices:27020 / TestDatabase
问题是服务器无法连接到mongo db容器。 我试图公开mongo的默认端口,如下所示:
mongodb:
image: mongo
container_name: mongodb-instance-microservices
ports:
- "27017:27017"
networks:
- microservices-network
并像这样更新app.js文件中的连接字符串:
mongodb:// mongodb-instance-microservices:27017 / TestDatabase
就可以了。
问题是如何为mongo容器公开不同的端口并使其正常工作?
答案 0 :(得分:0)
使用Docker内部网络在服务之间进行连接时,始终连接至服务的内部端口。您不需要显式发布端口(在Compose中,使用ports:
指令);如果这样做,您要连接的端口就是右侧上的端口。
从样式上讲,还请注意,您无需使用默认选项手动声明专用网络,该默认选项仅在此Docker Compose文件中使用(Compose将为您提供与之非常相似的功能),而您无需无需声明container_name:
仅用于容器间的连接(Compose将添加与服务名称匹配的网络别名)。