在Docker Swarm 1.12中login客户端的“真实”IP地址访问服务

我有nginx容器在用户创build的覆盖networking中的Docker Swarm中作为服务运行。 两者都创build了:

docker network create --driver overlay proxy docker service create --name proxy --network proxy -p 80:80 nginx 

当通过浏览器访问nginx站点时,在nginx访问日志中,远程地址被logging为10.255 …格式化地址,我认为是Swarm负载均衡器地址。 问题是如何知道/logging访问站点的最终客户端的地址,而不是负载平衡器地址。

好的,大多数人分析nginx access.log和客户端ip是很重要的一部分。

作为码头版本1.12.1的问题存在。 nginx会记录swarm overlay ip。 但客户端IP作为独立的容器日志很好。 作为解决方法,您可以有一个reverse proxy指向群集服务。 我知道这是反对群体的High availablitySelf Healing概念,但似乎是目前唯一的工作。

示例配置:(假设群服务正在本地主机上的8081监听)

 server { listen 80 default_server; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://localhost:8181; proxy_read_timeout 90; } } 

更多信息可以在这个github问题上找到。

另外一个选择:

您可以在主机模式下使用网络。

 docker service create \ --name nginx \ --network <your overlay network> \ --publish mode=host,target=80,published=80 \ --publish mode=host,target=443,published=443 \ --replicas 1 \ nginx 

所以现在我已经解决了这个问题,通过使用mode=host选项来发布端口,并将代理容器固定到单个节点上,如下所示:

 docker service create \ --name proxy \ --network proxy \ --publish mode=host,target=80,published=80 \ --publish mode=host,target=443,published=443 \ --constraint 'node.hostname == myproxynode' \ --replicas 1 \ letsnginx