【问题标题】:How do I connect a Docker container running in boot2docker to a network service running on another host?如何将在 boot2docker 中运行的 Docker 容器连接到在另一台主机上运行的网络服务?
【发布时间】:2014-12-02 11:40:02
【问题描述】:

我在 Windows 7 (SP1) 64 位机器上使用最新版本的 boot2docker 版本 1.3.2、495c19a。

我的 docker 容器正在运行一个 celery 进程,该进程尝试连接到运行 boot2docker 的同一台机器上运行的 rabbitMQ 服务。

在 docker 容器中运行的 Celery 进程无法连接到 RabbitMQ 并报告以下内容:

[2014-12-02 10:28:41,141: ERROR/MainProcess] 消费者:无法连接 到 amqp:// 客人:**@127.0.0.1:5672//:[Errno 111] 连接被拒绝。 2.00 秒后重试...

我有理由相信这是一个与网络相关的问题,与从容器到 VirtualBox 主机以及从主机到本地机器上运行的 RabbitMQ 服务的路由有关;我不知道如何配置它,我想知道是否有人可以建议我如何进行?

我尝试在端口转发中设置端口 5672,但没有成功(但我相信这是用于 VM 的传入流量,例如 boot2docker ssh)。

我将容器作为 docker run -i -t tagname 运行

我在运行容器时没有用 -h 指定主机。

很抱歉,如果这个问题看起来很无知或者答案似乎很明显......我很感激任何帮助!


一些附加信息:

宿主机VM的路由表是boot2docker安装时配置的如下:

  • docker0 IP 地址为 172.17.42.1

  • eth0 IP 地址为 10.0.2.15

  • eth1 IP 地址为 192.168.59.103

  • eth0 连接到 VirtualBox VM 网络配置中的 NAT(适配器 1)。

  • 适配器 1 为 ssh 设置了端口转发;默认主机IP 127.0.0.1,主机端口2022,访客端口22。

  • eth1 连接到仅主机适配器(适配器 2)。

  • 两个适配器都设置为混杂模式(全部允许)。

  • docker容器的IP地址是172.17.0.33。

【问题讨论】:

  • Rabbit 是在 Windows 主机上还是在 VirtualBox Linux 客户机上运行?
  • RabbitMQ 服务正在 Windows 主机上运行。

标签: networking rabbitmq virtualbox docker boot2docker


【解决方案1】:

[2014-12-02 10:28:41,141: ERROR/MainProcess] 消费者:无法连接到 amqp:// 访客:**@127.0.0.1:5672//:[Errno 111] 连接被拒绝。 2.00 秒后重试...

127.0.0.1 是一个特殊的 IP 地址,意思是“我”,在容器内部它的意思是“容器我”,所以这就是它没有连接到外部主机的原因。因此,首先要做的是将您尝试连接到 Rabbit 的 IP 地址更改为运行它的外部主机的 IP 地址。

那么您可能需要对路由做一些事情,但让我们一步一步来。

【讨论】:

  • 谢谢 Bryan,您的建议可以解决我的问题。我将 celery 连接到运行 RabbitMQ 服务的 Windows 主机的 IP 地址设置为 IP 地址。它正在工作,我真的很高兴你能帮助我快速启动和运行!我想知道是否可以使用 VirtualBox 网络将流量从在容器中运行的 celery 路由到 virtualbox VM,然后再到 windows 主机,而不是直接为 celery 设置 windows 主机 IP。
  • 不太确定“而不是设置 Windows 主机 IP” - 如果那是 Rabbit 运行的地方,那么这就是您需要使用的 IP 地址。但是,关于路由的信息,我发现这篇文章非常有用:ispyker.blogspot.co.uk/2014/04/… - 它是为 OSX 编写的,但大多数 VirtualBox 配置在 PC 上将非常相似。
【解决方案2】:

当您的 RabbitMQ 服务器在您的 Windows 主机上运行时,您需要告诉您的容器它应该与该 IP 通信 - 这可能是 192.168.59.3

最重要的是,您的容器的 127.0.0.1 只是该容器服务的环回设备 - 甚至不是 boot2docker 虚拟机的端口。

可以设置一个包含--expose=80 的大使容器,并使用诸如 socat 之类的东西将所有流量从该容器转发到您的主机(请参阅 svendowideit/ambassador)。然后你会 --link 那个大使容器到你当前的图像

但就我个人而言,我最初会避免这种情况,只需将您的容器化应用配置为与真实主机的 IP 通信

【讨论】:

  • 谢谢 Bryan 和 SvenDowideit,
【解决方案3】:

您必须为 boot2docker 和 docker 分别明确指定端口重定向。

请试试这个:

c:\>boot2docker init
c:\>boot2docker up
c:\>boot2docker ssh -L 0.0.0.0:5672:localhost:5672
docker@boot2docker:~$ docker run -it -p 5672:5672 tagname

【讨论】:

  • 嗨魔术棒,感谢您的回复!不幸的是,这不起作用,因为 RabbitMQ 服务正在使用该端口。报如下错误:bind: Not owner channel_setup_fwd_listener: cannot listen to port: 5672 Could not request local forwarding。如果我停止 rabbitMQ 服务,那么端口绑定不会报告错误。
猜你喜欢
  • 2019-03-24
  • 2019-08-25
  • 1970-01-01
  • 2022-01-24
  • 2015-01-07
  • 2021-04-24
  • 2020-11-26
  • 1970-01-01
  • 2019-07-20
相关资源
最近更新 更多