【问题标题】:Docker: Access host service from containerDocker:从容器访问主机服务
【发布时间】:2018-09-29 02:32:29
【问题描述】:

我已经看到了这种明显常见场景的几种变体,但所有提供的解决方案都针对每种情况(例如,如果您要共享的服务是 MySQL,则共享 sock 文件)。

我在主机上有一个服务。为简单起见,假设它是 netcat 监听 127.0.0.1:5000 TCP。

我需要使用另一个 netcat 或 telnet 从容器连接到该地址,并且能够发送和接收数据。

由于某些原因(包括安全性),主机服务需要位于 127.0.0.1(而不是另一个 IP)中,并且该服务无法绑定到多个接口。使用 0.0.0.0 实在不行。

从理论上讲,这似乎是 IP 表应该能够解决的问题,但我无法让它工作,所以我假设它是 Docker 在主机中的规则有机会处理之前过滤掉数据包它们(iptables 日志不会显示主机接收到任何数据包)。

编辑:如果可能的话,我想避免使用主机网络驱动程序。

【问题讨论】:

  • 你可以在容器内移动主机服务吗?
  • @BMitch 不是真的,它增加了许多其他问题。我试图避免这种情况——不想“完全容器化”。无论如何,我想通了。

标签: docker iptables docker-networking


【解决方案1】:

想通了。像往常一样,事情真的很容易,你知道他们。

无论如何,这是我必须做的三件事:

1) 在防火墙中,接受来自网桥接口的连接

iptables -A INPUT -i br+ -p TCP --dport 5000 -j ACCEPT

2) 在预路由中更改目标 IP:

iptables -t nat -I PREROUTING  -d 172.17.0.1 -p tcp --dport 5000 -j DNAT --to 127.0.0.1:5000

3) 允许非本地 IP 连接回环:

sysctl -w net.ipv4.conf.all.route_localnet=1

最后一个可能有点不安全,应该更改为仅桥梁(而不是“全部”)。

完成此操作后,容器可以连接到 172.17.0.1:5000,并且在仅侦听 127.0.0.1:5000 的主机上运行的服务会正确处理连接。

【讨论】:

  • 谢谢SSSSSSSSSSSSSS
【解决方案2】:

From inside of a Docker container, how do I connect to the localhost of the machine?

据此,您应该可以将 127.0.0.1 指向 host.docker.internal。

为什么要避免使用主机网络驱动程序?为什么不将主机的服务也放入容器中呢?这会解决你的很多问题。

【讨论】:

  • 那是我在问题中提到的 MySql 上的链接 :-) 不同的东西。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2020-11-22
  • 2020-02-17
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多