【问题标题】:docker reverse proxy DNS/networking issuesdocker 反向代理 DNS/网络问题
【发布时间】:2017-09-01 14:23:30
【问题描述】:

我会试着解释并画出来

我想要达到的目标:

对不起,糟糕的油漆图。现在,如果我从 10.10.10.0 网络点击它,它就可以完美运行。问题是 DNS 将 jenkins.network.com 解析为 10.10.10.0 网络。我想通过代理返回,因为它具有 SSL 终止以到达 sonarqube 服务器。有没有一种很好的方法来实现这一点,以保持代理后面的服务?我是否需要创建第二个带有 docker 网络的 DNS 服务器?是否可以通过 consul 让外部和内部服务都指向同一个域名?

编辑: 做这样的事情会奏效,因为一切都通过代理。因此,当詹金斯击中声纳时,它认为它的 ip 真的是 10.10.10.51 并且它可以通过那里击中它。

我需要它做什么: 我需要它退出代理,然后通过代理返回。即:

172.16.10.2 ---- 172.16.10.1 ----- 10.10.10.50 ----- 代理然后接管路由到正确的位置(172.16.10.3:8080 或其他东西)

【问题讨论】:

  • 那么你能解释一下 dig 命令的问题吗?
  • @TarunLalwani 让我尝试扩展它。基本上它可以正常工作。我可以通过代理访问服务器。问题出在内部 docker 网络中。当解析 sonarqube.mynetwork.com 时,它解析为 10.10.10.50。 Docker 容器使用主机 DNS 来获取此信息。所以 jenkins 在 10.10.10.50 获得了 sonarqube 地址,但是因为它只对 172.16.10.1 的代理关闭,所以它试图访问 10.10.10.50 的代理而不是 172.16.10.1 地址,你找不到路由。这有帮助吗?
  • 所以如果我的问题正确,你想在 jenkin 服务器jenkins.network.com 上解析为172.16.10.1?如果是,则发布您的docker-compose 文件(如果使用任何文件)
  • @tarun lalwani 正确。因此,从外部网络它解析为 10 地址并在内部解析为 172 地址。我现在无法访问该文件,但希望我能尽快找到机会,我会再次联系您。谢谢!

标签: docker networking proxy consul


【解决方案1】:

因为你没有发布你的作曲。我做了一些假设。假设的组成如下

version: '3'

services:
  nginx:
    image: nginx
    ports:
      - 80:80
      - 443:443
    depends_on:
      - jenkins
      - sonar
  jenkins:
    image: jenkins
  sonar:
    image: sonarqube

所有这些都在10.10.10.50 上运行。现在,如果您在内部和外部将 DNS 设置为10.10.10.20,则jenkins.network.com 都将解析为10.10.10.50。但在 docker 网络中,您希望 jenkins.network.com 解析为容器的 IP。

所以如果以上都正确,那么下面是最简单的解决方案

version: '3'

service:
  nginx:
    image: nginx
    ports:
      - 80:80
      - 443:443
    depends_on:
      - jenkins
      - sonar
  jenkins:
    image: jenkins
    networks:
      default:
        aliases:
          - jenkins.network.com
  sonar:
    image: sonar
    networks:
      default:
        aliases:
          - sonar.network.com

在 nginx 镜像上我可以联系到jenkins.network.com

root@be6492f18851:/# telnet jenkins.network.com 8080
Trying 172.23.0.3...
Connected to jenkins.network.com.
Escape character is '^]'.
Connection closed by foreign host.

您可以从 jenkins 和声纳容器中执行此操作并获得相同的结果

Edit-1

如果您希望 DNS 通过代理,您可以更改该网络的别名

version: '3'

service:
  nginx:
    image: nginx
    ports:
      - 80:80
      - 443:443
    depends_on:
      - jenkins
      - sonar
    networks:
      default:
        aliases:
          - sonar.network.com
          - jenkins.network.com
  jenkins:
    image: jenkins
  sonar:
    image: sonar

【讨论】:

  • 是的。对不起。我没有忘记,这个周末刚忙。我正在考虑类似的事情,但问题是我仍然需要它通过代理。一个原因就是这样终止。另一个是设置正确的端口。这可能吗?我一直在研究 docker swarm 和服务发现,但尚未确定这是否能解决我的问题
  • @Matt,查看编辑。只需将别名更新为代理
  • 这就是我认为我必须做的事情。我会试一试,看看它是否适合我的使用,然后告诉你。谢谢
【解决方案2】:

用nginx做反向代理怎么样?
如果我没有误会,你想听 443 端口
并反向到 172.16.10.1
下面是一个 nginx 配置示例

server {
listen 443;
root /data/up1; 

location / {
  proxy_pass       172.16.10.1;
  proxy_set_header Host      $host;
  proxy_set_header X-Real-IP $remote_addr;
}

希望对你有帮助

【讨论】:

  • 这个 nginx 配置应该放在 /etc/nginx/site-enable 目录
  • 这是我目前正在做的事情,唯一的事情是,在从服务到服务进行通信时,它没有到达内部代理的路由。所以是的,反向代理有效,但由于 DNS 解析为外部网络地址,它无法重新进入。请参阅我上面的评论以获得进一步的解释。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2023-04-05
相关资源
最近更新 更多