【问题标题】:Export docker container through cloudflared通过 cloudflared 导出 docker 容器
【发布时间】:2023-01-28 15:37:16
【问题描述】:

我有一个 NAS,我通过 docker-compose 在 docker 容器中运行各种 web 应用程序。我希望这些网络应用程序中的一些可以通过互联网访问,而不仅仅是当我连接到我的家庭网络时。

我目前面临的问题是,虽然 cloudflare 能够公开默认的 Web 应用程序(例如,默认 NAS 管理 192.168.1.135:80 可以映射到 subdomain.domain.com),但它无法公开我尝试运行的任何 docker 容器(192.168.1.135:4444 无法映射到 subdomain2.domain.com),到目前为止我尝试过的每个应用程序都收到 502 错误网关错误。

配置不应该是问题,而且绝对不是 NoTLSVerify 标志,因为应用程序在 HTTP 上运行并且我已经这样配置了它,所以我无法知道发生了什么以及如何解决它。

【问题讨论】:

    标签: docker docker-compose cloudflare nas qnap


    【解决方案1】:

    看起来您在 NAS 上运行的应用程序是通过 docker 运行时代理的。因此,您需要添加到 cloudflare 隧道配置中的 IP:port 是可以从主机访问的端口(而不是主机本身的 IP)。

    如果主机是 192.168.1.135,则需要知道要从外部访问的应用程序的 IP(Docker 网络内部),通常在 172.0.0.1/24 范围内。

    示例:如果运行您要访问的应用程序的容器在 app1 的 172.0.0.2:4444 和 app2 的 172.0.0.3:5555 上运行,则 cloudflare 配置将如下所示:

    tunnel: the_ID_of_the_tunnel
    credentials-file: /root/.cloudflared/the_ID_of_the_tunnel.json
    
    ingress:
      - hostname: yourapp1.example.com
        service: http://172.0.0.2:4444
      - hostname: ypurapp2.example.com
        service: http://172.0.0.3:5555
      - service: http_status:404
    

    在此处查看更多详细信息和视频:How to redirect subdomain to port (docker)

    【讨论】:

    • 我检索了前端的 IP 地址,它是 172.29.20.2,docker-compose 在端口部分 80:80 中,所以我将 cloudflare 重定向到 172.29.20.2:80,但我仍然遇到同样的错误。我已经尝试使用 docker 创建的其余容器,但是当我访问我的公共域时,它们都没有将我重定向到应用程序
    • 原来问题可能不是 IP 本身,而是我必须运行两个容器的方式。显然他们彼此之间没有可见性,而且我没有指定网络,所以在我能够首先解决该问题之前它不会起作用。
    • 如果您正在运行 cloudflared 的容器版本,则需要将容器附加到主机 nw 或应用程序附加到的 nw。否则它不会工作。
    【解决方案2】:

    原来问题是由于 docker 如何与网络一起工作,而不是 Cloudflare 如何访问它们。我首先必须创建一个连接两个容器的网络,因为将 cloudflare 添加到我的 docker-compose 文件由于某种原因不起作用。

    1. 创建一个docker网络docker network create tunnel
    2. 运行泊坞窗没有指定网络docker run -d --name cloudflare cloudflare/cloudflared:latest tunnel --no-autoupdate run --token
    3. 将docker添加到网络docker network connect tunnel cloudflare
    4. 运行容器(请注意,容器应具有您指定的与您之前创建的网络名称相同的网络名称,但 cloudflare 应不是在你的 docker-compose 文件中)docker-compose up
    5. 在 cloudflare 隧道配置中,您必须指定容器的 docker 内部地址(如@lu4t 建议的那样)。你可以用docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container来标识地址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2020-03-11
      • 2021-01-02
      相关资源
      最近更新 更多