首页 > 解决方案 > Spring Boot v1.5.13 Docker:从请求中获取 Docker IP 而不是客户端 IP

问题描述

我有一个在 docker 容器中运行的 spring boot 服务。我正在使用 HttpServletRequest 从传入的客户端请求中获取远程 IP 地址。这在本地按预期工作,但是一旦服务在 Docker 容器中运行,被抓取的 IP 就是 Docker 容器 IP 而不是客户端 IP。有没有办法解决这个问题并获得实际的客户端 IP?非常感激任何的帮助。

以下是更多程序化细节:

@GetMapping("/foo)
public ResponseEntity requestBar(HttpServletRequest request) {
    String clientIp = request.getRemoteAddr();
    //DO STUFF WITH IP
}

以上是“bar”的示例 GET 请求。使用 HttpServletRequest 您可以获得发出请求的机器的远程地址。在本地运行(在非 dockerized 的本地机器上)上面运行得很好。服务获取客户端IP,我可以验证IP是否正确。在 Docker 中托管相同的服务,调用 getRemoteAddr() 将为容器提供默认网关 IP。我希望这个进一步的解释可以更清楚地说明我想要完成的事情。与往常一样,我们将不胜感激任何和所有帮助。

更新:只需澄清一些花絮,Spring Boot(v1.5.13) 服务在 Docker 主机上运行(Docker 版本 18.06.1-ce,构建 e68fc7a)。我所说的本地运行是指在开发过程中在本地机器上启动服务时。我的所有 Java 开发工作都使用最新版本的 Intellij。可以在我的开发机器上使用 Intellij 启动该服务。

标签: dockerspring-boot

解决方案


推荐阅读