我正在以模式运行httpd apache2
代理。docker swarm
docker stack deploy
问题:当我访问 时mymachine:80
,access.log
仅显示docker ingress
swarm网络的远程ip,如10.0.0.2
。 而不是真实客户端的ip。
问题:我怎样才能告诉 Swarm 保留原始 IP 地址(也许将其写入另一个 IP 标头?),而不必强制我的容器或端口进入mode: host
?
因为我不想使用零停机部署,这是我在 docker-swarm 模式下没有主机模式下的容器所拥有的。
答案1
简而言之,在您要求的限制内没有办法实现这一点。
Docker swarm 使用流量转发而不是监听端口来处理入口流量。您可以通过 看到这种迹象iptables -nL
,并注意到 docker 防火墙规则(DOCKER-USER
、DOCKER-INGRESS
等)在FORWARD
链中,而不是INPUT
链中(并且时不时地您会看到用户感到惊讶,他们的入口防火墙规则没有阻止流量)。
正如您所指出的,打开端口mode: host
将解决“真实 IP”问题(因为监听端口将位于主机的“真实”网络命名空间上),但这会阻止您进行零停机部署(因为端口是正在使用的单一资源)。