上一篇 下一篇 分享链接 返回 返回顶部

不用公网 IP,把家里 Docker 服务接入 Cloudflare Tunnel 教程 2026最新版

发布人:慈云数据-客服中心 发布时间:5小时前 阅读量:4

Cloudflare Docker部署教程|2026最新版

本文适用于希望通过 Docker / Docker Compose 部署 Cloudflare 相关服务的用户,重点讲解最常见、最实用的方案:使用 Cloudflare Tunnel(cloudflared) 将本地服务安全暴露到公网,无需公网 IP、无需路由器端口转发,同时支持 HTTPS、访问控制、域名解析等能力。
适用场景包括:家庭服务器、NAS、VPS、内网 Web 服务、开发测试环境、轻量级站点反向代理等。


一、Cloudflare Docker部署是什么?

很多人说“Cloudflare Docker部署”,通常指的是通过 Docker 部署 Cloudflare 官方提供的 cloudflared 服务,也就是 Cloudflare Tunnel

Cloudflare Tunnel 的作用是:
让你的本地服务主动连接 Cloudflare 边缘网络,然后用户通过你的域名访问 Cloudflare,再由 Cloudflare 转发到你的本地服务。

传统方式通常是:

用户 → 域名 → 公网 IP → 路由器端口转发 → 内网服务器

而 Cloudflare Tunnel 的方式是:

用户 → Cloudflare → Tunnel → Docker内服务 / 本地服务

它的核心优势是:

  • 不需要公网 IP;
  • 不需要在路由器上开放端口;
  • 默认支持 HTTPS;
  • 可以隐藏源站真实 IP;
  • 支持 Zero Trust 访问控制;
  • 适合家用宽带、内网服务、NAS、实验环境;
  • 可以通过 Docker 长期稳定运行。

二、适合部署 Cloudflare Tunnel 的场景

如果你有以下需求,非常适合使用 Cloudflare Tunnel:

  1. 家里没有公网 IP

    例如使用家庭宽带、校园网、运营商 NAT 网络,无法直接将服务暴露到公网。

  2. 不想开放路由器端口

    开放 80、443、8080 等端口可能带来安全风险,而 Tunnel 可以避免这一点。

  3. 想让内网服务绑定域名访问

    比如:

    nas.example.com
    blog.example.com
    panel.example.com
    git.example.com
  4. 想给 Docker 服务配置 HTTPS

    Cloudflare 可以自动提供 HTTPS 访问能力。

  5. 想限制访问者身份

    配合 Cloudflare Zero Trust,可以实现邮箱验证、Google 登录、GitHub 登录、一次性验证码等访问控制。


三、部署前准备

在开始之前,你需要准备以下内容:

1. 一个 Cloudflare 账号

前往 Cloudflare 官网注册账号:

https://dash.cloudflare.com/

注册完成后登录后台。


2. 一个域名

你需要拥有一个域名,例如:

example.com

并且该域名需要托管到 Cloudflare。

如果你的域名还没有接入 Cloudflare,需要在 Cloudflare 添加站点,然后根据提示将域名 NS 服务器修改为 Cloudflare 提供的地址。

例如 Cloudflare 可能会给你两个 NS:

amy.ns.cloudflare.com
tom.ns.cloudflare.com

你需要到域名注册商后台修改 NS 记录。


3. 一台已经安装 Docker 的服务器

服务器可以是:

  • Linux VPS;
  • 家庭服务器;
  • NAS;
  • 软路由;
  • Ubuntu / Debian / CentOS / Rocky Linux;
  • 群晖、威联通等支持 Docker 的设备。

检查 Docker 是否安装成功:

docker version

检查 Docker Compose:

docker compose version

如果没有安装 Docker,可以使用以下命令快速安装。

Ubuntu / Debian 系统示例:

curl -fsSL https://get.docker.com | bash

启动 Docker:

systemctl enable docker
systemctl start docker

四、Cloudflare Tunnel 部署方式选择

Cloudflare Tunnel 常见部署方式有两种:

方式一:Token 方式部署

这是最简单的方式,适合大多数用户。

优点:

  • 操作简单;
  • 不需要手动管理配置文件;
  • Cloudflare 后台可视化管理;
  • Docker Compose 写法简洁。

缺点:

  • 高级配置不如本地配置文件灵活;
  • 需要依赖 Cloudflare Zero Trust 后台管理路由。

方式二:配置文件方式部署

这种方式通过 config.yml 管理 tunnel 配置。

优点:

  • 配置集中在本地;
  • 更适合自动化和版本管理;
  • 适合复杂路由规则。

缺点:

  • 初次配置稍复杂;
  • 需要登录认证并生成证书、隧道 ID 等。

对于 2026 年大多数用户,推荐使用 Token 方式,尤其是 Docker Compose 部署。本文也会重点介绍这种方式。


五、使用 Docker Compose 部署 Cloudflare Tunnel

1. 创建 Tunnel

登录 Cloudflare 后台,进入:

Zero Trust → Networks → Tunnels

点击:

Create a tunnel

选择:

Cloudflared

然后输入 Tunnel 名称,例如:

home-server

继续下一步后,Cloudflare 会生成一段运行命令,类似:

docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <你的TOKEN>

你需要复制其中的 token。


2. 创建部署目录

在服务器上创建目录:

mkdir -p /opt/cloudflared
cd /opt/cloudflared

3. 编写 docker-compose.yml

创建文件:

nano docker-compose.yml

写入以下内容:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 替换为你的TOKEN
    networks:
      - cloudflare

networks:
  cloudflare:
    name: cloudflare
    driver: bridge

注意将:

替换为你的TOKEN

替换成 Cloudflare 后台生成的真实 token。

例如:

command: tunnel --no-autoupdate run --token eyJhIjoi...

4. 启动容器

执行:

docker compose up -d

查看容器状态:

docker ps

如果看到类似内容,说明已经运行:

cloudflared   cloudflare/cloudflared:latest   Up

查看日志:

docker logs -f cloudflared

如果看到:

Registered tunnel connection

或:

Connection established

说明 Tunnel 已成功连接 Cloudflare。


六、将域名绑定到本地 Docker 服务

Cloudflare Tunnel 本身只是建立通道,还需要配置访问路由。例如你本地有一个 Web 服务运行在 Docker 中,端口是 8080,希望通过:

app.example.com

访问它。


1. 示例:部署一个 Nginx 测试服务

创建一个测试容器:

docker run -d \
  --name nginx-demo \
  --restart unless-stopped \
  --network cloudflare \
  nginx:latest

这里要注意:

--network cloudflare

表示让 Nginx 容器加入刚才创建的 Docker 网络。这样 cloudflared 容器可以通过容器名访问它。


2. 在 Cloudflare 后台添加 Public Hostname

进入:

Zero Trust → Networks → Tunnels → 你的 Tunnel → Public Hostname

点击:

Add a public hostname

填写如下:

Subdomain: app
Domain: example.com
Path: 留空
Type: HTTP
URL: nginx-demo:80

也就是:

app.example.com → http://nginx-demo:80

保存后,等待几十秒访问:

https://app.example.com

如果看到 Nginx 欢迎页面,说明部署成功。


七、部署自己的 Docker 应用并接入 Cloudflare

下面以常见的 Web 应用为例。

假设你有一个应用监听在容器内部 3000 端口,服务名为 myapp

可以创建一个 docker-compose.yml

services:
  myapp:
    image: your-image:latest
    container_name: myapp
    restart: unless-stopped
    networks:
      - cloudflare
    expose:
      - "3000"

networks:
  cloudflare:
    external: true

启动:

docker compose up -d

然后在 Cloudflare Tunnel 的 Public Hostname 中配置:

Subdomain: app
Domain: example.com
Type: HTTP
URL: myapp:3000

之后即可通过:

https://app.example.com

访问你的服务。


八、接入本机非 Docker 服务

如果你的服务不是 Docker 容器,而是运行在宿主机上,例如:

http://127.0.0.1:8080

由于 cloudflared 运行在容器内,直接访问 127.0.0.1 指的是容器自身,而不是宿主机。

这时可以使用宿主机网关地址。

在 Linux Docker 环境中,推荐在 docker-compose.yml 中增加:

extra_hosts:
  - "host.docker.internal:host-gateway"

完整示例:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 替换为你的TOKEN
    extra_hosts:
      - "host.docker.internal:host-gateway"

然后 Cloudflare 后台配置:

Type: HTTP
URL: host.docker.internal:8080

这样就可以访问宿主机上的服务。


九、HTTPS 与 SSL/TLS 设置建议

Cloudflare 默认会为你的域名提供 HTTPS。建议在 Cloudflare 后台设置:

SSL/TLS → Overview → Full

如果你的源站本身也配置了有效证书,可以选择:

Full strict

对于 Cloudflare Tunnel 来说,用户访问 Cloudflare 是 HTTPS,而 Cloudflare 到 Tunnel 的连接本身也是加密隧道。因此一般情况下不需要你在本地额外申请证书。

推荐设置:

SSL/TLS encryption mode: Full
Always Use HTTPS: On
Automatic HTTPS Rewrites: On

十、开启访问控制:保护你的管理后台

如果你暴露的是管理系统,例如:

  • NAS 后台;
  • Portainer;
  • Proxmox;
  • Home Assistant;
  • OpenWrt;
  • 私有 Git 服务;
  • 内部仪表盘;

强烈建议不要直接裸露公网访问,而是使用 Cloudflare Zero Trust Access 加一层身份验证。


1. 创建 Access Application

进入:

Zero Trust → Access → Applications

点击:

Add an application

选择:

Self-hosted

填写应用域名:

https://panel.example.com

2. 配置访问策略

可以设置允许访问的邮箱,例如:

user@example.com

或者允许某个邮箱域名:

@example.com

常见策略包括:

  • 指定邮箱;
  • Google Workspace 用户;
  • GitHub 组织成员;
  • One-time PIN;
  • SAML / OIDC 登录;
  • IP 范围限制。

保存后,访问该域名时,Cloudflare 会先要求登录验证,通过后才会转发到你的内网服务。


十一、使用配置文件方式部署 Cloudflare Tunnel

如果你希望把配置全部写在服务器本地,可以使用配置文件方式。

1. 创建配置目录

mkdir -p /opt/cloudflared/config
cd /opt/cloudflared

2. 登录 Cloudflare

临时运行 cloudflared 登录:

docker run --rm -it \
  -v /opt/cloudflared/config:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel login

执行后会输出一个链接。打开链接,选择你的域名并授权。

授权成功后,本地会生成证书文件:

cert.pem

3. 创建 Tunnel

docker run --rm -it \
  -v /opt/cloudflared/config:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel create home-server

执行后会生成一个 JSON 凭据文件,例如:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json

并显示 Tunnel ID。


4. 编写 config.yml

进入配置目录:

cd /opt/cloudflared/config
nano config.yml

示例:

tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
credentials-file: /home/nonroot/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json

ingress:
  - hostname: app.example.com
    service: http://myapp:3000

  - hostname: nas.example.com
    service: http://host.docker.internal:5000

  - service: http_status:404

最后一条:

- service: http_status:404

表示没有匹配到的请求返回 404。


5. 创建 DNS 路由

执行:

docker run --rm -it \
  -v /opt/cloudflared/config:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel route dns home-server app.example.com

也可以为多个域名添加:

docker run --rm -it \
  -v /opt/cloudflared/config:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest tunnel route dns home-server nas.example.com

6. 编写 Docker Compose

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --config /home/nonroot/.cloudflared/config.yml run
    volumes:
      - /opt/cloudflared/config:/home/nonroot/.cloudflared
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - cloudflare

networks:
  cloudflare:
    name: cloudflare
    driver: bridge

启动:

docker compose up -d

查看日志:

docker logs -f cloudflared

十二、常见 Docker Compose 完整示例

下面给出一个较完整的组合示例:同时部署 cloudflarednginxportainer

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 替换为你的TOKEN
    networks:
      - cloudflare

  nginx:
    image: nginx:latest
    container_name: nginx-demo
    restart: unless-stopped
    networks:
      - cloudflare
    expose:
      - "80"

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    networks:
      - cloudflare
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    expose:
      - "9000"

networks:
  cloudflare:
    name: cloudflare
    driver: bridge

volumes:
  portainer_data:

Cloudflare Public Hostname 可以这样配置:

nginx.example.com → http://nginx-demo:80
portainer.example.com → http://portainer:9000

对于 Portainer 这类管理后台,务必加 Access 身份验证。


十三、更新 cloudflared 镜像

如果你使用的是:

image: cloudflare/cloudflared:latest

可以定期更新:

cd /opt/cloudflared
docker compose pull
docker compose up -d

清理旧镜像:

docker image prune -f

如果你希望更加稳定,也可以指定版本号,例如:

image: cloudflare/cloudflared:2026.1.0

不过实际版本号需要以 Docker Hub 或官方镜像仓库发布为准。


十四、排错指南

1. 容器启动后无法连接

查看日志:

docker logs -f cloudflared

常见原因:

  • token 填写错误;
  • Tunnel 已被删除;
  • 服务器无法访问 Cloudflare;
  • DNS 或网络被防火墙阻断;
  • 系统时间严重不准确。

可以检查服务器网络:

ping 1.1.1.1
curl https://www.cloudflare.com

2. 域名访问显示 502

502 通常表示 Cloudflare Tunnel 连上了,但后端服务不可用。

检查:

docker ps

确认目标容器是否运行。

如果目标服务是 Docker 容器,确认它和 cloudflared 是否在同一个网络:

docker inspect cloudflared
docker inspect nginx-demo

也可以进入 cloudflared 容器测试:

docker exec -it cloudflared sh

然后尝试:

wget -O- http://nginx-demo:80

如果无法访问,说明容器网络或服务地址配置有问题。


3. 使用 127.0.0.1 无法访问宿主机服务

这是 Docker 网络隔离导致的。容器内的 127.0.0.1 是容器自己,不是宿主机。

解决方法:

extra_hosts:
  - "host.docker.internal:host-gateway"

然后使用:

host.docker.internal:端口

4. 页面跳转异常或无限重定向

常见原因是后端应用没有正确识别 HTTPS。

可以检查:

  • Cloudflare SSL/TLS 是否设置为 Full;
  • 后端应用是否支持反向代理;
  • 是否需要设置 X-Forwarded-Proto
  • 应用是否强制跳转 HTTP/HTTPS。

部分应用需要额外设置环境变量,例如:

environment:
  - TRUST_PROXY=true

或者:

environment:
  - BASE_URL=https://app.example.com

具体以应用文档为准。


5. WebSocket 无法连接

Cloudflare Tunnel 支持 WebSocket。若出现问题,通常是应用自身代理配置、域名配置或协议设置错误。

确认 Public Hostname 的 Type 是否为:

HTTP

对于普通 WebSocket 服务,一般仍然使用 HTTP 类型即可。


十五、安全建议

虽然 Cloudflare Tunnel 可以降低暴露源站的风险,但并不代表可以忽视安全配置。

建议:

  1. 管理后台必须加 Zero Trust Access

    不要把 Portainer、NAS、路由器后台、数据库管理工具直接裸露到公网。

  2. 容器最小化暴露端口

    如果服务只给 cloudflared 访问,可以使用:

    expose:
      - "3000"

    而不是:

    ports:
      - "3000:3000"
  3. 不要泄露 Tunnel Token

    Token 等同于连接你隧道的凭据,应避免上传到公开仓库。

  4. 定期更新镜像

    定期执行:

    docker compose pull
    docker compose up -d
  5. 开启 Cloudflare 安全功能

    可以启用 WAF、Bot Fight Mode、速率限制、防火墙规则等。

  6. 区分公开服务和私有服务

    博客、官网可以公开访问;管理后台建议加登录验证。


十六、推荐目录结构

为了方便维护,推荐使用如下目录:

/opt/
  cloudflared/
    docker-compose.yml
    config/
      config.yml
      cert.pem
      tunnel-id.json
  apps/
    nginx/
      docker-compose.yml
    portainer/
      docker-compose.yml
    blog/
      docker-compose.yml

如果使用 token 方式,cloudflared 目录可以非常简单:

/opt/cloudflared/
  docker-compose.yml

十七、Token方式与配置文件方式怎么选?

对比项 Token方式 配置文件方式
上手难度 简单 较复杂
适合人群 新手、大多数用户 高级用户、自动化部署
路由管理 Cloudflare后台 本地config.yml
维护方式 可视化 文件化
迁移便利性 中等 较高
推荐程度 强烈推荐 按需使用

如果你只是想把家庭服务器、NAS 或 Docker 应用通过域名访问,建议直接使用 Token 方式。如果你需要批量管理大量域名或希望配置文件纳入 Git 版本控制,可以使用配置文件方式。


十八、总结

通过 Docker 部署 Cloudflare Tunnel,是目前非常推荐的内网服务公网访问方案。它不需要公网 IP,不需要端口转发,也不需要自己手动维护 HTTPS 证书,非常适合家庭服务器、NAS、开发测试环境和轻量级生产服务。

最推荐的部署流程是:

Cloudflare 添加域名
→ Zero Trust 创建 Tunnel
→ 获取 Token
→ Docker Compose 部署 cloudflared
→ 添加 Public Hostname
→ 将域名指向 Docker 服务
→ 为敏感后台开启 Access 验证

核心 Docker Compose 示例:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 替换为你的TOKEN
    networks:
      - cloudflare

networks:
  cloudflare:
    name: cloudflare
    driver: bridge

只要你的目标服务和 cloudflared 在同一个 Docker 网络中,就可以通过容器名和端口进行访问,例如:

http://nginx-demo:80
http://myapp:3000
http://portainer:9000

对于宿主机服务,则使用:

host.docker.internal:端口

最后提醒:Cloudflare Tunnel 虽然方便,但安全配置同样重要。对于任何管理后台,都建议启用 Cloudflare Zero Trust Access,避免服务直接暴露在公网。合理使用 Docker 网络、Cloudflare Access、WAF 和最小权限原则,才能让你的部署既方便又安全。

目录结构
全文