我的node.js express app无法连接到Docker中的MongoDB。 我对Docker并不熟悉。
node.js连接:
import mongodb from 'mongodb';
...
mongodb.MongoClient.connect('mongodb://localhost:27017', ... );
Dockerfile:
FROM node:argon
RUN mkdir /app
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 3000
CMD ["npm", "start"]
搬运工-compose.yml
version: “2”
services:
web:
build: .
volumes:
— ./:/app
ports:
— “3000:3000”
links:
— mongo
mongo:
image: mongo
ports:
— “27017:27017”
构建命令:docker build -t NAME .
运行命令:docker run -ti -p 3000:3000 NAME
连接错误:
[MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
name: 'MongoError',
message: 'failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]'
答案 0 :(得分:10)
尝试:
mongodb.MongoClient.connect('mongodb://mongo:27017', ... );
更改您的docker-compose.yml
:
version: "2"
services:
web:
build: .
volumes:
- ./:/app
ports:
- "3000:3000"
links:
- mongo
mongo:
image: mongo
ports:
- "27017:27017"
并使用一些docker compose命令:
docker-compose down
docker-compose build
docker-compose up -d mongo
docker-compose up web
答案 1 :(得分:5)
试试这个。
mongodb.MongoClient.connect('mongodb://mongo:27017', ... );
而不是mongodb.MongoClient.connect('mongodb://localhost:27017', ... );
。将其更改为mongo的原因是因为您在docker-compose.yml
中使用了links属性mongo。这将导致web docker容器的/etc/hosts
中的mongo主机名。参考linking-containers。docker-compose.yml似乎缺少一个缩进。在mongo属性上应该与web相同。
version: '2'
services:
web:
build: .
volumes: ['./:/app']
ports: [ '3000:3000' ]
links: [ mongo ]
mongo:
image: mongo
ports: [ '27017:27017' ]
我使用我的Docker尝试了您的配置,我已完成更新docker-compose.yml
然后我docker-compose build
然后docker-compose up
。 Logs of my local run
答案 2 :(得分:0)
我不确定您是否还有这个问题,但是datasources.json
应该是:
"host": "mongo"
而不是“ localhost”。
在我的日志中,我看到:
mongo | NETWORK [listener] connection accepted from 172.22.0.3:47880 #1 (1 connection now open)
如您所见,docker compose会将mongo NAT NAT到另一个V-LAN。 IP地址172.22.0.0
是守护程序用来路由docker-compose
映像的内部IP地址。因此localhost
现在不在游戏中。
至少对我有用。
datasources.json
"mongoDS": {
"host": "mongo",
"port": 27017,
...
答案 3 :(得分:0)
是这样的:
只需从命令行链接到容器即可。 db是我的数据库容器
sudo docker run -it --link db:db1 --publish 4000-4006:4000-4006 --name backend backend:latest