meteor mongo -U
向我显示 mongodb://127.0.0.1:3001/meteor
作为连接字符串。我知道 docker 图像将尝试连接到自身并失败。我尝试用 127.0.0.1 替换我在运行 ifconfig
时能找到的任何 IP 地址,结果相同:
{ [MongoError: connect ECONNREFUSED xxx.xxx.xxx.xxx:3001]
name: 'MongoError',
message: 'connect ECONNREFUSED xxx.xxx.xxx.xxx:3001' }
不确定我还能尝试什么来解决这个问题。任何指针将不胜感激。
更多信息:
mongo 127.0.0.1:3001/meteor
在不同的 shell 窗口中工作。但是其他 IP 地址都不起作用:mongo 10.0.0.96:3001/meteor
:
2015-11-16T10:16:14.089-0500 W NETWORK Failed to connect to 10.0.0.96:3001, reason: errno:61 Connection refused
2015-11-16T10:16:14.091-0500 E QUERY Error: couldn't connect to server 10.0.0.96:3001 (10.0.0.96), connection attempt failed
at connect (src/mongo/shell/mongo.js:181:14)
at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed
====================== 附加设置信息====================
创建一个基本的 meteor 应用:meteor create app
cd app
meteor
.在同一文件夹 app
的另一个终端中运行 meteor mongo -U
以获取连接字符串:mongodb://127.0.0.1:3001/meteor
.现在在不同的文件夹中创建一个想要连接到 mongo 数据库的节点应用程序:mkdir worker
、cd worker
、npm install mongodb
,创建worker.js:
var MongoClient = require('mongodb').MongoClient;
// Use connect method to connect to the Server
MongoClient.connect("mongodb://127.0.0.1:3001/meteor", function(err, db) {
if (err){
console.log(err);
}else{
console.log("Connected correctly to server");
}
});
最后在docker中运行:
docker run --rm -v "$(pwd)":/worker -w /worker iron/images:node-4.1 sh -c "node worker.js"
docker IP地址是192.168.99.100 我从 ifconfig 中列出的 IP 地址之一是
vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
我插上它,运行 docker 命令并得到这个:
{ [MongoError: connect ECONNREFUSED 192.168.99.1:3001]
name: 'MongoError',
message: 'connect ECONNREFUSED 192.168.99.1:3001' }
最佳答案
因此假设您在本地 Mac 上运行 meteor 应用程序,然后节点应用程序的 docker 容器在 docker-machine
中运行。可能是VirtualBox?如果您在 MacOS 上使用默认的 docker-machine (boot2docker)
问题是在 MacOS 机器上的 VM 中运行的容器不一定与 MacOS 机器实际所在的网络通信(使用 127.0.0.1
或 本地主机
)
例如在我的 Mac 上:
$ ifconfig
...
vboxnet0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
vboxnet1: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:01
vboxnet2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:02
inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
vboxnet3: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:03
...
您看到 VirtualBox 网络 vboxnet2
是 192.168.99.x
范围。如果你 ssh 到你的 docker-machine
$ docker-machine ssh default
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@default:~$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:2C:33:C7:80
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:2cff:fe33:c780/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1031 errors:0 dropped:0 overruns:0 frame:0
TX packets:1755 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:62290 (60.8 KiB) TX bytes:2561234 (2.4 MiB)
eth0 Link encap:Ethernet HWaddr 08:00:27:CC:FD:18
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fecc:fd18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:482311 errors:0 dropped:0 overruns:0 frame:0
TX packets:209033 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:401054787 (382.4 MiB) TX bytes:12923400 (12.3 MiB)
eth1 Link encap:Ethernet HWaddr 08:00:27:E6:C7:20
inet addr:192.168.99.100 Bcast:192.168.99.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fee6:c720/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:47929 errors:0 dropped:0 overruns:0 frame:0
TX packets:47777 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3259250 (3.1 MiB) TX bytes:10663711 (10.1 MiB)
您看到您的容器网络是 172.17.x.x
。因此任何容器都属于该网络,并且不一定能够使用 127.0.0.1
或 localhost
好的,所以有一种方法可以在主机 (MacOS) 上访问 mongodb docker 容器可以通过 vboxnet2
ip 地址 192.168.99.1
查看它,但是这里要注意的是 mongodb 必须绑定(bind)到 0.0.0.0
(任何 IP)而不是 127.0.0.1
。因此,如果您查看在 Mac 上使用 meteor
运行的默认 mongodb。
$ ps -Af | grep mongo
503 75294 73105 0 6:08PM ttys005 0:00.00 grep mongo
503 74375 74356 0 5:55PM ttys006 0:02.17 /Users/username/.meteor/packages/meteor-tool/.1.1.9.1sd3e7j++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/mongodb/bin/mongod --bind_ip 127.0.0.1 --smallfiles --port 3001 --dbpath /Users/username/work/meteor/app/.meteor/local/db --oplogSize 8 --replSet meteor
你看到它绑定(bind)到 IP 127.0.0.1
所以当你从你的容器尝试时:
user@b4d40a25f67d:/worker#:/worker# telnet 192.168.99.1 3001
你没有得到回应。
这里的 hack 只是绑定(bind)到 0.0.0.0
(不推荐用于生产):
~/.meteor/packages/meteor-tool/1.1.9/mt-os.osx.x86_64/tools/runners/run-mongo.js
- '--bind_ip', '127.0.0.1', '--smallfiles', '--port', port, '--dbpath', dbPath,
+ '--bind_ip', '0.0.0.0', '--smallfiles', '--port', port, '--dbpath', dbPath,
然后瞧瞧:
user@b4d40a25f67d:/worker# telnet 192.168.99.1 3001
Trying 192.168.99.1...
Connected to 192.168.99.1.
Escape character is '^]'.
然后,你需要在你的 worker.js 中修改这一行
MongoClient.connect("mongodb://192.168.99.1:3001/meteor", function(err, db) {
我很高兴地说它有效! :
$ docker run --rm -v "$(pwd)":/worker -w /worker iron/images:node-4.1 sh -c 'node worker.js'
Connected correctly to server
关于mongodb - 在 Mac 上从本地 docker 镜像连接到 meteor mongo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33737487/