我读了很多关于使用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发布于 2018-10-30 00:20:32
默认情况下,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发布于 2018-10-30 02:46:01
这里只是一个猜测,但Docker Compose中的depends_on字段只表示“这个容器必须等到另一个容器启动”。内部的服务并不一定要启动并运行。因此,您的应用程序可能启动得太快。当你的应用程序尝试连接时,Mongo服务器可能还没有准备好接受连接。运行docker-compose up,等待它无法启动,然后运行docker-compose restart service。
如果这样可以修复它,那么如果应用程序在启动时连接失败,那么您可能希望让应用程序在某种超时后重新尝试连接。
发布于 2018-10-30 16:18:58
看看这个:
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
检查以下可以解决问题的方法:
如果configuration.
authSource mongo容器设置为connect.https://stackoverflow.com/questions/53049436
复制相似问题