我在用户创建的覆盖网络中的Docker Swarm中运行nginx容器作为服务。两者都创建于:
docker network create --driver overlay proxy
docker service create --name proxy --network proxy -p 80:80 nginx
当通过浏览器访问nginx站点时,在nginx访问日志远程地址被记录为10.255 ...格式化地址,我认为是Swarm负载均衡器地址。问题是如何知道/记录访问站点的最终客户端的地址,而不是负载均衡器地址。
答案 0 :(得分:4)
好抓!大多数人分析nginx access.log
和客户端ip是其中的重要部分。
作为docker版本1.12.1存在问题。 nginx会记录swarm overlay ip。但是客户端ip可以作为独立容器记录。作为一种解决方法,您可以reverse proxy
指向群服务。我知道这违反了High availablity
和Self Healing
群体的概念,但似乎是目前唯一的解决方法。
示例配置:(假设swarm服务正在localhost上监听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;
}
}
可在this github issue找到更多信息。
另一种选择:
您可以在主机模式下使用网络。
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
答案 1 :(得分:1)
所以我现在解决这个问题的方法是使用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
答案 2 :(得分:0)
我们必须解决为运行 https://www.newsnow.co.uk/ 的 Docker Swarm 生产部署识别客户端真实 IP 的问题(mode=host
不是一个选项,因为我们需要在多个节点上运行多个副本)。< /p>
为了解决这个问题,我们创建了:https://github.com/newsnowlabs/docker-ingress-routing-daemon,一个修改入口网状网络路由以向服务容器公开真实客户端 IP 的守护进程。