草庐IT

mongodb - 在 Mac 上从本地 docker 镜像连接到 meteor mongo

coder 2023-10-30 原文

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 workercd workernpm 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 网络 vboxnet2192.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.1localhost

路由到另一个容器

好的,所以有一种方法可以在主机 (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/

有关mongodb - 在 Mac 上从本地 docker 镜像连接到 meteor mongo的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  4. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  5. ruby-on-rails - 如何在 mac os snow leopard 中升级 ruby​​ 和 rails - 2

    我想将我的MacSnowLeopardruby​​从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai

  6. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  9. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

  10. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

随机推荐