如何获得docker中运行的服务的真实客户端IP

我的场景:我希望我的基于Docker的服务知道什么IP从networking调用它们(我的应用程序的要求)。

我在Docker 1.12.2上运行一个云端VPS,debian jessie。

我在详细模式下使用nc打开端口8080

 docker run --rm -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080" 

说,VPS有域example.com ,并从我的另一台机器,让我们说有IP dead:::::beef我打电话

 nc example.com 8080 

服务器说:

 Ncat: Version 6.40 ( http://nmap.org/ncat ) Ncat: Listening on :::8080 Ncat: Listening on 0.0.0.0:8080 Ncat: Connection from 172.17.0.1. Ncat: Connection from 172.17.0.1:49799. 

172.17.0.1位于服务器的本地networking上,当然与我的客户无关。 事实上:

 docker0 Link encap:Ethernet HWaddr .... inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 

如果我以主机联网模式启动容器

 docker run --rm --net=host -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080" 

并再次呼叫我的服务器

 nc example.com 8080 

我得到了预期的结果:

 Ncat: Connection from dead:::::beef. Ncat: Connection from dead:::::beef:55650. 

我的问题是:

  • 为什么不在主机联网模式下docker“掩码”ips? 我认为docker守护进程可能是打开端口,接收连接,然后使用自己的内部虚拟networking接口连接将其中继到容器进程的进程。 nc在容器中运行,因此只能看到来自docker守护进程IP的调用。
  • (如何)我可以让我的docker服务知道外部IP调用它, 而不必将其全部置入主机模式?