我阅读了很多有关将应用程序与docker连接的示例,这似乎很简单
我有我的情况
version: '2'
services:
mongodb:
image: mongo
container_name: infra-mongodb
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin
ports:
- 27017:27017
service:
build:
context: .
container_name: service
restart: always
ports:
- 3012:3012
depends_on:
- mongodb
links:
- mongodb
我在节点中的连接是
const MongoClient = require('mongodb').MongoClient;
const mongoUrl = 'mongodb://admin:admin@mongodb:27017/admin?replicaSet=rs0&slaveOk=true'
MongoClient.connect(mongoUrl, { useNewUrlParser: true }, (err, client) => {
console.log(err)
});
我遇到以下错误
{ MongoNetworkError: failed to connect to server [9d574801e4b4:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND 9d574801e4b4 9d574801e4b4:27017]
at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:564:11)
at emitOne (events.js:116:13)
at Pool.emit (events.js:211:7)
at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:317:12)
at Object.onceWrapper (events.js:317:30)
at emitTwo (events.js:126:13)
at Connection.emit (events.js:214:7)
at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:246:50)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at emitErrorNT (internal/streams/destroy.js:64:8)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],
[Symbol(mongoErrorContextSymbol)]: {} }
我不明白为什么主机成为9d574801e4b4
当我在容器中运行ping mongodb
时一切正常
PING mongodb (172.21.0.3) 56(84) bytes of data.
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from infra-mongodb.app-admin_default (172.21.0.3): icmp_seq=4 ttl=64 time=0.216 ms
^C
--- mongodb ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3156ms
rtt min/avg/max/mdev = 0.088/0.126/0.216/0.053 ms
答案 0 :(得分:0)
默认情况下,mongo仅在localhost上侦听。如果是用于本地开发,只需bind it to all interfaces:
version: '2'
services:
mongodb:
image: mongo
container_name: infra-mongodb
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin
ports:
- 27017:27017
command: --bind_ip_all
答案 1 :(得分:0)
这里只是个猜测,但是Docker Compose中的docker-compose up
字段仅表示“此容器必须等待另一个容器启动”。内部的服务不一定必须启动并运行。因此,您的应用程序启动速度可能太快。当您的应用尝试连接时,Mongo服务器可能尚未准备好接受连接。运行docker-compose restart service
,等待其启动失败,然后运行> packrat::init()
Initializing packrat project in directory: - "~/R/statistics"
。
如果此问题得以解决,那么在启动后无法连接的情况下,您可能希望使应用程序在某种超时后重试连接。
答案 2 :(得分:0)
检查一下:
docker-compose.yaml
version: '2'
services:
nodejs:
container_name: nodejs
image: nexus.XXXX.com:8000/${BE_BUILD}
restart: always
environment:
- dbhost=mongo
ports:
- "8888:8888"
links:
- mongo
mongo:
container_name: mongo
image: nexus.XXXX.com:8000/doc/docker/proj-mongodb:latest
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin
ports:
- "27017:27017"
我可以通过以下URL成功连接:
const mongoUrl = mongodb://admin:admin@mongo:27017/admin?authSource=admin
authSource
是否需要URL。答案 3 :(得分:0)
只是发现这个问题,我不太了解它是如何工作的...
version: '2'
services:
mongodb:
image: mongo
container_name: infra-mongodb
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin
ports:
- 27017:27017
networks:
service-network:
aliases:
- localhost
service:
build:
context: .
container_name: service
restart: always
ports:
- 3012:3012
depends_on:
- mongodb
links:
- mongodb
networks:
app-admin-network:
driver: bridge
答案 4 :(得分:0)
但是看不到docker-compose up日志。今天也有类似的问题。 用我制作的一个小脚本解决了。 wait-for-mongo 在您的dockerfile文件中添加以下内容:
RUN npm install -g wait-for-mongodb-slim
## Launch the wait tool and then your application
CMD wait-for-mongo --uri $MONGO_URI --t 2.5 && npm start
其中–t是屏幕,直到再次检查为止。
并在撰写内容时将uri添加为环境变量:
environment:
MONGO_URI: mongodb://usr:pw@containername:27017/dbname