我有两个应用程序:
当我的节点应用程序在本地运行时,这两个应用程序可以完美地交互。现在,我将其放入Docker容器中,当我与docker compose up
一起启动时,后端无法连接到MongoDB。
这是启动顺序的摘录:
mongodb_1 | 2018-11-10T22:22:52.481+0000 I NETWORK [initandlisten] waiting for connections on port 27017
[...]
backend_1 | 2018-11-10T22:23:48.119Z 'MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]'
这是我的docker-compose.yml
:
version: '2'
services:
mongodb:
image: bitnami/mongodb:latest
expose:
- 27017
environment:
- ALLOW_EMPTY_PASSWORD=yes
backend:
build: ./backend
environment:
API_HOST: http://localhost:3000/
APP_SERVER_PORT: 3000
expose:
- 3000
volumes:
- ./backend:/app/backend
links:
- mongodb
depends_on:
- mongodb
这是我对数据库的节点调用:
mongoose.connect('mongodb://localhost:27017/groceryList', {
useNewUrlParser: true
});
我浏览了大约15个Stackoverflow问题,但仍未找到原因:
mongodb://mongo:27017/groceryList
时,同样适用,仅使用ENOTFOUND
标志而不是ECONNREFUSED
。我想念什么?
答案 0 :(得分:1)
您的mongodb服务被命名为mongodb
而不是mongo
。
尝试
mongoose.connect('mongodb://mongodb:27017/groceryList', {
useNewUrlParser: true
});
通用格式为'mongodb://mongoServiceName:27017/dbname'
,它对同一网络内的容器使用docker的自动dns解析。
您可能已经从其他问题/答案中知道,在一个容器中,URL是相对于其自身的,因此,由于后端容器内部没有运行mongodb,因此它无法连接到它。
答案 1 :(得分:0)
不可能在容器中使用localhost:27017与其他容器通信,因为范围“ localhost”是自引用的(localhost:27017将在容器后端中查找端口27017-不是在 mongodb 容器中)
然后,您需要输入或输入服务名称(mongodb)或计算机的IP地址