通过cloudflared导出docker容器

问题描述 投票:0回答:3

我有一个 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 bad gateway 错误。

配置不应该是问题,而且绝对不是

NoTLSVerify
标志,因为应用程序在 HTTP 上运行,并且我已经按照这种方式配置了它,所以我没有选择知道发生了什么以及如何解决它.

docker docker-compose cloudflare nas qnap
3个回答
0
投票

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

在此处查看更多详细信息和视频:如何将子域重定向到端口(docker)


0
投票

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

  1. 创建 Docker 网络
    docker network create tunnel
  2. 运行 docker 无需指定网络
    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
    在 cloudflare 隧道配置中,您必须指定容器的 docker 内部地址(如 @lu4t 建议)。您可以通过 
  5. docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container
  6.  来识别地址
    

0
投票
docker-compose

时,请注意,默认情况下,它会创建一个新网络,该网络绑定到您的 NIC,而是绑定到虚拟网络(您可以在网络和虚拟交换机面板中看到)在网络用户界面上)。 因此,如果您映射 4444 端口,则该端口不会侦听您的 NAS IP 地址!为了确保这一点,请将此行添加到

docker-compose.yaml

文件中:

services:
  your-service:
    network_mode: "bridge"

© www.soinside.com 2019 - 2024. All rights reserved.