从Mac上的本地docker镜像连接到meteor mongo

Ale*_*sky 3 mongodb meteor docker

meteor mongo -U将我显示mongodb://127.0.0.1:3001/meteor为连接字符串。据我所知,docker 映像将尝试连接到自身并失败。我尝试用 127.0.0.1 替换运行时能找到的任何 IP 地址,ifconfig结果相同:

{ [MongoError: connect ECONNREFUSED xxx.xxx.xxx.xxx:3001]
  name: 'MongoError',
  message: 'connect ECONNREFUSED xxx.xxx.xxx.xxx:3001' }
Run Code Online (Sandbox Code Playgroud)

不知道我还能尝试什么来解决这个问题。任何指示将不胜感激。

更多信息: 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
Run Code Online (Sandbox Code Playgroud)

====================== 其他设置信息 ====================

创建一个基本的流星应用程序:meteor create app cd app meteor . 在同一文件夹中的另一个终端中app运行meteor mongo -U以获取连接字符串:mongodb://127.0.0.1:3001/meteor。现在在另一个文件夹中创建一个想要连接到 mongo db 的节点应用程序:、、、mkdir worker创建worker.js:cd workernpm install mongodb

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");
    }

});
Run Code Online (Sandbox Code Playgroud)

最后在docker中运行:

docker run --rm -v "$(pwd)":/worker -w /worker iron/images:node-4.1 sh -c "node worker.js"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我将其插入,运行 docker 命令并得到:

{ [MongoError: connect ECONNREFUSED 192.168.99.1:3001]
  name: 'MongoError',
  message: 'connect ECONNREFUSED 192.168.99.1:3001' }
Run Code Online (Sandbox Code Playgroud)

Ric*_*ico 5

因此,假设您正在本地 Mac 中运行 Meteor 应用程序,然后您的 Node 应用程序的 docker 容器正在运行docker-machine. 可能是虚拟盒子?如果您在 MacOS 上使用默认的 docker-machine (boot2docker)

\n\n

问题是,在 MacOS 计算机上的虚拟机中运行的容器不一定能够与 MacOS 计算机实际所在的网络通信(使用127.0.0.1localhost

\n\n

以我的 Mac 为例:

\n\n
$ ifconfig\n...\nvboxnet0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500\nether 0a:00:27:00:00:00\nvboxnet1: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500\nether 0a:00:27:00:00:01\nvboxnet2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500\nether 0a:00:27:00:00:02\ninet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255\nvboxnet3: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500\nether 0a:00:27:00:00:03\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

您会看到 VirtualBox 网络vboxnet2就是192.168.99.x范围。如果你 ssh 进入你的docker-machine

\n\n
$ docker-machine ssh default\n                        ##         .\n                  ## ## ##        ==\n               ## ## ## ## ##    ===\n           /"""""""""""""""""\\___/ ===\n      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~\n           \\______ o           __/\n             \\    \\         __/\n              \\____\\_______/\n _                 _   ____     _            _\n| |__   ___   ___ | |_|___ \\ __| | ___   ___| | _____ _ __\n| \'_ \\ / _ \\ / _ \\| __| __) / _` |/ _ \\ / __| |/ / _ \\ \'__|\n| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |\n|_.__/ \\___/ \\___/ \\__|_____\\__,_|\\___/ \\___|_|\\_\\___|_|\nBoot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015\nDocker version 1.8.1, build d12ea79\ndocker@default:~$ ifconfig\ndocker0   Link encap:Ethernet  HWaddr 02:42:2C:33:C7:80\n          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0\n          inet6 addr: fe80::42:2cff:fe33:c780/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:1031 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:1755 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:62290 (60.8 KiB)  TX bytes:2561234 (2.4 MiB)\n\neth0      Link encap:Ethernet  HWaddr 08:00:27:CC:FD:18\n          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0\n          inet6 addr: fe80::a00:27ff:fecc:fd18/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:482311 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:209033 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000\n          RX bytes:401054787 (382.4 MiB)  TX bytes:12923400 (12.3 MiB)\n\neth1      Link encap:Ethernet  HWaddr 08:00:27:E6:C7:20\n          inet addr:192.168.99.100  Bcast:192.168.99.255  Mask:255.255.255.0\n          inet6 addr: fe80::a00:27ff:fee6:c720/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:47929 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:47777 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000\n          RX bytes:3259250 (3.1 MiB)  TX bytes:10663711 (10.1 MiB)\n
Run Code Online (Sandbox Code Playgroud)\n\n

你看到你的容器网是172.17.x.x。因此,任何容器都将属于该网络,并且不一定能够使用127.0.0.1或路由到另一个容器localhost

\n\n

好吧,有一种方法可以访问主机(MacOS)上的 mongodb,docker 容器可以通过vboxnet2ip 地址看到它192.168.99.1,但这里的问题是 mongodb 必须绑定到0.0.0.0(任何 IP)而不是127.0.0.1. 因此,如果您查看meteorMac 上运行的默认 mongodb。

\n\n
 $ ps -Af | grep mongo\n  503 75294 73105   0  6:08PM ttys005    0:00.00 grep mongo\n  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\n
Run Code Online (Sandbox Code Playgroud)\n\n

您会看到它绑定到 IP,127.0.0.1因此当您从容器中尝试时:

\n\n
user@b4d40a25f67d:/worker#:/worker# telnet 192.168.99.1 3001\n
Run Code Online (Sandbox Code Playgroud)\n\n

你没有得到任何回应。

\n\n

这里的技巧是绑定到0.0.0.0(不推荐用于生产):

\n\n
~/.meteor/packages/meteor-tool/1.1.9/mt-os.osx.x86_64/tools/runners/run-mongo.js\n\n\n-   \'--bind_ip\', \'127.0.0.1\', \'--smallfiles\', \'--port\', port, \'--dbpath\', dbPath,\n+   \'--bind_ip\', \'0.0.0.0\', \'--smallfiles\', \'--port\', port, \'--dbpath\', dbPath,\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后查看\xc3\xa1:

\n\n
user@b4d40a25f67d:/worker# telnet 192.168.99.1 3001\nTrying 192.168.99.1...\nConnected to 192.168.99.1.\nEscape character is \'^]\'.\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您需要修改worker.js中的这一行

\n\n
MongoClient.connect("mongodb://192.168.99.1:3001/meteor", function(err, db) {\n
Run Code Online (Sandbox Code Playgroud)\n\n

我很高兴地说它有效!:

\n\n
$ docker run --rm -v "$(pwd)":/worker -w /worker iron/images:node-4.1 sh -c \'node worker.js\'\nConnected correctly to server\n
Run Code Online (Sandbox Code Playgroud)\n