我有一个 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 上运行,并且我已经按照这种方式配置了它,所以我没有选择知道发生了什么以及如何解决它.
看起来您在 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)
事实证明,问题是由于 docker 如何与网络配合使用,而不是 Cloudflare 如何访问它们。我首先必须创建一个连接两个容器的网络,因为由于某种原因,将 cloudflare 添加到我的 docker-compose 文件中不起作用。
docker network create tunnel
docker run -d --name cloudflare cloudflare/cloudflared:latest tunnel --no-autoupdate run --token
docker network connect tunnel cloudflare
docker-compose up
在 cloudflare 隧道配置中,您必须指定容器的 docker 内部地址(如 @lu4t 建议)。您可以通过 docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container
来识别地址
时,请注意,默认情况下,它会创建一个新网络,该网络不绑定到您的 NIC,而是绑定到虚拟网络(您可以在网络和虚拟交换机面板中看到)在网络用户界面上)。 因此,如果您映射 4444 端口,则该端口不会侦听您的 NAS IP 地址!为了确保这一点,请将此行添加到
docker-compose.yaml
文件中:
services:
your-service:
network_mode: "bridge"