【问题标题】:How can I access (forward) the public HTTP request IP address inside a docker compose network?如何访问(转发)docker compose 网络中的公共 HTTP 请求 IP 地址?
【发布时间】:2022-11-28 06:29:42
【问题描述】:

使用以下设置:

只有 YARP 容器有发布的端口。它正确地设置了 X-Forward* 标头供其他容器使用。但不幸的是它是docker compose网关地址。

当我想记录(公共)客户端的 IP 地址时,我得到 ::ffff:172.18.0.1,这是 docker compose 网关 IP 地址。我需要以某种方式告诉 docker 将公共 IP 地址放在 X-Forward-For 标头中,然后我的反向代理将使用它。

我的容器在它们自己的网络中运行:

services:
  yarp:
    ...
    networks:
      - mynet

我可以看到创建的网络:

$ docker network ls
NETWORK ID     NAME                                      DRIVER    SCOPE
2bf19f507987   dockercompose1502733..._mynet             bridge    local

并查看详细信息:

$ docker network inspect 2bf
[
  {
    "Name": "dockercompose1502733..._mynet",
    "Id": "2bf...",
    "Created": "...",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": null,
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1" // this is the address I get for public requests
        }
      ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
      "b82645911...": {
        "Name": "YARP",
        "EndpointID": "fb1b...",
        "MacAddress": "02:42:ac:...",
        "IPv4Address": "172.18.0.10/16",
        "IPv6Address": ""
      },
      ...
    },
    "Options": {},
    "Labels": {
      "com.docker.compose.network": "mynet",
      "com.docker.compose.project": "dockercompose1502733...",
      "com.docker.compose.version": "1.29.2"
    }
  }
]

【问题讨论】:

  • 什么是 docker compose 网关?我在任何地方都找不到对此的引用。
  • 澄清一下,您是说 HARP 将 X-Forwarded-For 标头设置为错误的值吗?
  • 不,据我所知,YARP 工作正常。它从 docker 获取 ::ffff:172.18.0.1 IP 地址并将此值放入 X-Forward-For 供其他人使用。问题是我如何访问客户端的公共 IP 地址(在 docker-compose 网络中丢失)?

标签: docker docker-compose docker-networking ms-yarp


【解决方案1】:

你可以为反向代理服务做network_mode: hosthttps://docs.docker.com/compose/compose-file/#network_mode

不过要注意,因为:

host:它为容器提供了对主机网络接口的原始访问权限

看起来这是您唯一的解决方案:https://github.com/docker/roadmap/issues/157

我假设这是一个生产工作负载,您最好迁移到 kubernetes。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2015-03-06
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多