【问题标题】:Can't get correct container IP using traefik无法使用 traefik 获取正确的容器 IP
【发布时间】:2019-01-02 14:07:45
【问题描述】:

在使用 Traefik 和 Docker-compose 时,我想获取容器 IP 以执行基于 IP 的过滤,而是获取 docker 网络网关 IP。

这是来自 curl-client 容器的 curl 请求的结果:

docker-compose exec curl-client curl https://whoami.domain.name

Hostname: 608f3dcaf7d9
IP: 127.0.0.1
IP: 172.18.0.2
GET / HTTP/1.1
Host: whoami.domain.name
User-Agent: curl/7.58.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.18.0.1
X-Forwarded-Host: whoami.domain.name
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: 88756553599b
X-Real-Ip: 172.18.0.1    

这里,172.18.0.1 是 traefik_net 网络的网关。相反,我希望在 X-Forwarded-For 字段中看到 172.18.0.9,因为它是 curl-client 容器的 IP:

docker-compose exec curl-client cat /etc/hosts

172.18.0.9      34f7b6e5472f

我也尝试使用 'traefik.frontend.whiteList.useXForwardedFor=true' 选项但没有成功。

traefik.toml

logLevel = "ERROR"

defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
  [entryPoints.http]
    address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
    address = ":443"
    [entryPoints.https.tls]

[api]
entrypoint="dashboard"

[acme]
email = "something@aaa.com"
storage = "acme.json"
entryPoint = "https"
  [acme.dnsChallenge]
  provider = "ovh"
  delayBeforeCheck = 0

[[acme.domains]]
  main = "*.domain.name"

[docker]
domain = "domain.name"
watch = true
network = "traefik_net"

docker-compose.yml

version: '3'

services:

  traefik_proxy:
    image: traefik:alpine
    container_name: traefik
    networks:
      - traefik_net
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      - ./acme.json:/acme.json
    restart: unless-stopped
    environment:
      - OVH_ENDPOINT=ovh-eu
      - OVH_APPLICATION_KEY=secretsecret
      - OVH_APPLICATION_SECRET=secretsecret
      - OVH_CONSUMER_KEY=secretsecret
    labels:
      - 'traefik.frontend.rule=Host:traefik.domain.name'
      - 'traefik.port=8080'
      - 'traefik.backend=traefik'


  whoami:
    image: containous/whoami
    container_name: whoami
    networks:
      - traefik_net
    labels:
      - 'traefik.frontend.rule=Host:whoami.domain.name'


  curl-client:
    image: ubuntu
    networks:
      - traefik_net
    command: sleep infinity



networks:
  traefik_net:
    external: true

编辑:域名使用以下dnsmasq.conf解析:

domain-needed
expand-hosts
bogus-priv

interface=eno1
domain=domain.name
cache-size=1024
listen-address=127.0.0.1
bind-interfaces

dhcp-range=10.0.10.10,10.0.10.100,24h
dhcp-option=3,10.0.10.1

dhcp-authoritative

server=208.67.222.222
server=208.67.220.220

address=/domain.name/10.0.10.3

【问题讨论】:

  • 您实际上想用这些信息做什么?如果容器重新启动并且它的 IP 地址发生变化,你会怎么做?您的客户端如何知道如何解析whoami.domain.name DNS 名称?
  • @DavidMaze 我有一个运行 openVPN 的容器,所以我想使用 traefik 根据其 IP 将源自该容器的连接列入白名单。它的IP不会改变,直接在对应的docker-compose中指定:networks: traefik_net: ipv4_address: xxx.xx.xx.xx域名是在本地使用dnsmasq解析的(原帖中添加了dnsmasq.conf)。请注意,我对其他解决方案持开放态度,以实现将来自本地网络和 openvpn 容器的连接列入白名单的目标。

标签: docker docker-compose traefik


【解决方案1】:

经过一番调查,似乎 Traefik 不是这里的问题,无法访问容器 IP 是由于 Docker 管理其内部网络的方式(参见以下 cmets:https://github.com/containous/traefik/issues/4352https://github.com/docker/for-mac/issues/180)。

通过在nework_host模式下运行我的openvpn容器,我能够实现将内部连接列入白名单的目标,这样系统直接为客户端分配了一个IP。

【讨论】:

    【解决方案2】:

    如下设置 docker-compose 文件的端口配置应该可以:

        ports:
          - target: 80
            published: 80
            mode: host
          - target: 443
            published: 443
            mode: host
    

    此端口功能仅适用于 docker-compose 文件格式 =>3.2

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 2020-01-26
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多