连接到docker容器(osx和docker-machine)中的apache服务器从INTERNET

总之,一切工作,直到我尝试从互联网上访问我的Apache服务器在docker集装箱。 进入的数据包到达docker容器,但是出口数据包被docker-machine上的NAT接口丢弃。

我的设置是

  • 典型的家庭局域网设置与路由器连接到互联网
  • osx机器运行docker(即 – docker-machine aka boot2docker)
  • 运行apache的Docker容器(将端口80暴露为11111)
  • 我有osx(我的主机)上运行的Apache,它将作为一个故障排除工具。
  • 我给docker-machine添加了一个桥接接口,它将docker-machine直接连接到我的LAN,并从我的路由器获得一个IP。
  • 在我的路由器(192.168.1.1)我有端口转发11111到我的docker机IP(192.168.1.102)

我可以做什么

  • 我可以连接到我的主机和从我的局域网(所有192.168.1.X)的另一台计算机的Apache由于桥接口
    泊坞窗机。 同时使用192.168.1.102:11111
    HTTP://:11111
  • 所以显然我的域名parsing它的IP是正确的,我的路由器端口转发工作正常。
  • 我也可以通过互联网轻松访问我的主机(osx)上的Web服务器

我试过了

  • 在我的主机(osx)上使用pfctl进行端口转发
  • 在我的容器上使用–net = host

我已经缩小了问题(使用tcpdump和其他实验),当我连接到我的局域网上的计算机的容器中的Web服务器时,数据包stream经docker机中的桥接接口(192.168.1.102)。 当我从互联网连接传入的数据包stream通过192.168.1.102,但返回数据包不。 相反,它会通过docker-machine上的NAT接口并被丢弃。 我已经通过在docker-machine内部的NAT接口上执行“ifconfig eth0 down”来certificate这一点。 现在显然,这使我的docker机,因为我不能再运行docker命令,并杀死我当前的SSH会话。 但是当我这样做,从互联网的容器中的Web服务器的连接工作! 所以我certificate了返回数据包是问题。

现在, 我可以在docker-machine里面使用iptables来正确地路由这个数据包,这样它就能从桥接接口而不是NAT接口走出去了吗? 我试过没有成功。 这是我的docker-machine上的iptables规则。 我想要路由来自我的容器的源端口为11111的任何数据包,并将它们路由到eth1(桥接接口)。

sudo iptables -I FORWARD 1 -i docker0 -o eth1 -p tcp --syn --sport 11111 -m conntrack --ctstate NEW -j ACCEPT docker@default:~$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:11111 flags:FIN,SYN,RST,ACK/SYN ctstate NEW DOCKER-ISOLATION all -- anywhere anywhere DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination Chain DOCKER-ISOLATION (1 references) target prot opt source destination RETURN all -- anywhere anywhere 

在这里输入图像说明

我是否全部错了? 有没有一个标准的方式来设置,我还没有探索?