Docker:从容器访问主机服务

时间:2018-09-26 22:50:35

标签: docker iptables docker-networking

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

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

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

出于某些原因(包括安全性),主机服务必须位于127.0.0.1(而不是另一个IP)中,并且该服务无法绑定到多个接口。确实不能选择使用0.0.0.0。

从理论上讲,这似乎是IP表应该能够解决的问题,但是我无法使其正常工作,因此我认为它是Docker在主机中的规则有机会处理之前过滤掉数据包的过程它们(iptables日志记录不显示主机中正在接收的任何数据包)。

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

2 个答案:

答案 0 :(得分:1)

弄清楚了。和往常一样,您知道的事情真的很容易。

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

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

m = c[:,None] > x
m2 = m[:,:-1] & ~m[:,1:]
i = [np.flatnonzero( mi ) for mi in m2]

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

Scanner input = new Scanner(new File(“C:\temp\new files\test.dat”));

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

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

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

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

答案 1 :(得分:0)

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

因此,您应该能够将127.0.0.1指向host.docker.internal。

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