我有两个通过Docker compose链接在一起的容器,我可以使用主机名从包含node.js应用程序的容器中成功ping包含MongoDB的容器。但是,当涉及到实际连接数据库时,node.js会告诉我该连接被拒绝。如果有帮助,我正在使用Docker for Mac。
mongoose.connect("mongodb://mongo", {server: {auto_reconnect: true}}).catch(error => {
console.log("DB CONNECTION ERROR");
console.log(error)
});
这是我的docker-compose.yml文件:
version: "3" services: mongo: image: mongo:latest volumes: - ./db:/data/db restart: always expose: - 27017 ports: - 27017:27017 container_name: mongo goose: depends_on: - mongo build: . volumes: - ./app/server/templates:/usr/src/app/app/server/templates expose: - 3005 restart: always ports: - 3005:3005 container_name: goose-compose
答案 0 :(得分:0)
暴露端口而不将其发布到主机上-只有链接的服务才能访问它们。只能指定内部端口。
src :docker docs
如果您想采用这种方法,使用网桥网络模式(据我所知,这是默认设置)和 expose ,则必须使用 links ,将会很快(或已经),或 network (或 networks -我记不清)属性弃用。
也值得一看文档的networking in compose部分。
[edit]
顺便说一句,暴露甚至可能被省略,因为您正在映射容器的端口以承载主机(我认为)。如果我错了,请用这个纠正我。
干杯。
答案 1 :(得分:0)
我也遇到了Windows上的Spring Boot应用程序和mongo db的相同问题。 尝试在Dockerfile中以ENTRYPOINT下的格式提供以下格式的mongo uri:data.mongodb.uri = mongodb://:27017 /。
希望这会有所帮助。
答案 2 :(得分:0)
我有一个类似构建的应用程序,在两个独立的容器中使用了 Flask 和 mongodb。我注意到您和我的 compose 之间的一个区别是,您为每个容器都提到了卷,但没有卷定义,如下所示:
version: "3"
services:
web:
image: jzakilla/bookfinderpy
command: nginx -g "daemon off;"
container_name: webapp
ports:
- 80:80
- 443:443 # expose internal container ports to host
db:
image: mongo
container_name: mongodb
ports:
- 27017:27017
volumes:
- book_db:/data/db
volumes:
book_db:
driver: local
如果没有卷部分和告诉容器如何访问数据的驱动程序,我会想象容器会启动,但实际上无法启动 mongo 服务,从而给您一个拒绝错误。