我遇到了一个我以前从未遇到过的非常奇怪的码头问题。我想要做的是使用docker-compose从互联网上提供我的应用程序。它目前正在DigitalOcean的一个实例上运行,我目前正在使用以下docker-compose.yml
:
version: '2.2'
services:
mongodb:
image: mongo:3.4
volumes:
- ./mongo:/data/db
ports:
- "27017"
mongoadmin: # web UI for mongo
image: mongo-express
ports:
- "8081:8081"
links:
- "mongodb:mongo"
environment:
- ME_CONFIG_OPTIONS_EDITORTHEME=ambiance
- ME_CONFIG_BASICAUTH_USERNAME=user
- ME_CONFIG_BASICAUTH_PASSWORD=pass
app:
image: project/name:0.0.1
volumes:
- ./project:/usr/src/app
working_dir: /usr/src/app
links:
- "mongodb:mongodb"
environment:
- NODE_ENV=production
command: ["npm", "start"]
ports:
- "3000:3000"
Mongoadmin
正确连接并且能够连接到数据库,而数据库本身无法从主机外部连接。
问题是该应用无法连接到正确的地址。它是一个使用mongoose连接到数据库的快速服务器。在连接之前,我正在记录它将连接到的URL。在我的config.js中,我列出了mongodb://mongodb/project
,但这已解析为localhost
,从而导致MongoError: failed to connect to server [localhost:27017] on first connect
。已解析容器的名称,但未解析到正确的地址。
我尝试连接到该容器的docker的IP(在172.18.0.0
范围内),但也解析为localhost。我查看了/ etc / hosts,但这并未显示与此相关的任何内容。此外,我很困惑,因为mongo-express容器能够连接。
我已经尝试更改容器的名称,认为由于某些原因,由于之前的运行或类似的原因,它可能会阻塞,但这并没有解决问题
我已尝试使用显式links
和隐式使用docker内部DNS解析,但两者都不起作用。
将端口27017绑定到localhost时,它能够连接,但由于安全性和通过环境变量轻松配置,我宁愿将mongodb实例绑定到localhost。
我还尝试在我的本地计算机上运行此功能,并且按预期工作,因为mongoadmin
和app
都能够连接到mongodb
容器。我的本地机器运行Docker version 1.12.6, build 78d1802
,而VPS运行Docker version 17.06.2-ce, build cec0b72
,因此是更新的版本。
这可能是一个新引入的错误吗?还是我错过了别的什么?任何帮助将不胜感激。
答案 0 :(得分:0)
您的docker-compose文件似乎没有链接app和mongodb容器。
你有这个:
app:
image: project/name:0.0.1
volumes:
- ./project:/usr/src/app
working_dir: /usr/src/app
environment:
- NODE_ENV=production
command: ["npm", "start"]
ports:
- "3000:3000"
虽然我认为应该是这样的:
app:
image: project/name:0.0.1
volumes:
- ./project:/usr/src/app
working_dir: /usr/src/app
links:
- "mongodb:mongodb"
environment:
- NODE_ENV=production
command: ["npm", "start"]
ports:
- "3000:3000"