【问题标题】:Meteor DDP call between containers on same host同一主机上的容器之间的 Meteor DDP 调用
【发布时间】:2016-12-16 14:12:49
【问题描述】:

此 Meteor App 服务器代码尝试使用另一个 Meteor 工作人员的方法。应用程序和工作人员都位于同一服务器 EC2 上的单独 docker 容器中。工作程序在端口 9000 上运行。
当应用程序触发方法appCallingWorker 时,我希望看到工作容器会注销字符串“从应用程序调用的工作人员”,但所有docker logs containerID 给出的都是这样的许多行:
stream error Network error: ws://localhost:9000/websocket: connect ECONNREFUSED 127.0.0.1:9000

如何在 App 中使用 worker 的方法?谢谢

//App/server/main.js
let workerConn = DDP.connect('http://localhost:9000');
Meteor.methods({
 'appCallingWorker': () => {
   workerConn.call('workerMethod');
  }
});

//Worker/server/main.js
Meteor.methods({
  'workerMethod': function () {
    console.log('worker called from App');
  }
})

编辑
EC2 是 AWS ECS 中的一个容器实例。并且 containerDefinitions.portMapings.containerPort 和 hostPort 都设置为 9000。
edit 2
docker 主机上的 iptables -L -n 显示在 9000 上侦听的容器的 ip,我将代码中的 localhost 替换为所述 ip,现在它可以工作了。但是,如果主机重新启动或容器重新启动,则所述 ip 可能会发生变化……另一个需要解决的问题。

【问题讨论】:

  • 连接被拒绝,意味着 localhost:9000 上没有任何监听。如果您的应用程序位于单独的 docker 容器中,它们是否有自己的 ip,您是否应该尝试连接到该容器?
  • @Mikkel 我在编辑我的帖子时回答了你很好的观察。谢谢你的意见。如果我的流程不完整,请提供更多信息。
  • 您所做的只是将 localhost 替换为 127.0.0.1 - 这不是有效的网络地址,
  • @Mikkel 我明白了。所以iptables -L -n 向我展示了 9000 的 ip,将 localhost 替换为该 ip 并且它可以工作。但是该数字可以在 EC2 重新启动或容器重新启动时随时更改,那么我该如何进行此“自动发现”?谢谢
  • 你可以使用Route53来锁定一个固定的IP地址,甚至可以使用你在代码中输入的名称(例如myserver.mydomain.com)的动态地址

标签: meteor docker ddp


【解决方案1】:

我在尝试在 docker 容器之间进行通信时遇到了同样的问题。您将不得不使用容器所在服务器的外部 ip:port 地址。

【讨论】:

  • AWS 自动缩放或手动在 ECS 集群中重新创建 EC2 会使 ip 无效,然后呢?
  • 可以用域名吗? service.myapp.com:9000 什么的?
  • 没有域名的后端工人怎么办?,使用域名会使容器之间的本地流量穿越互联网吗?
  • @FredJ。请求在返回之前必须先出去,但它应该只有 1 个跃点,因为它命中的第一个名称服务器会将请求引导回同一个 IP。事实上,你可以编辑机器上的/etc/hosts 文件,将任何域名直接指向你想要的ip,实际上是在欺骗docker容器,让它认为它在外面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
相关资源
最近更新 更多