可用两种办法
修改 docker 所在网络。
取决于你在哪里运行 Docker, 是直接运行,还是用 k8s, docker-compose 之类的,配置上可能会不同。
说一下直接运行的情况。Docker 直接运行时,如未指定网络参数,Docker创建了一个隔离的网络,以便桥接网络中的每个容器都可以进行通信。即默认为 bridge
模式。这个模式下,容器在一个 docker 创建的子网里 docker0
,172.17.0.1
是docker0
网络上的默认路由。
参见官方文档:https://docs.docker.com/network/
指定为 host 或 macvlan 模式可以获取与主机同一个子网的 ip 地址,不经过 nat 转换,自然也就可以获得真实的客户端 ip 地址了。
docker run --net=host --name your-con -i --rm -p 3307:3306 your-image
通过前端负载均衡或 nginx 代理
通过能获取真实 ip 的前端 nginx 代理,然后通过类似 X-Forwarded-For
的请求头获取用户 ip.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…