不用公网 IP,把家里 Docker 服务接入 Cloudflare Tunnel 教程 2026最新版
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:
-
家里没有公网 IP
例如使用家庭宽带、校园网、运营商 NAT 网络,无法直接将服务暴露到公网。
-
不想开放路由器端口
开放 80、443、8080 等端口可能带来安全风险,而 Tunnel 可以避免这一点。
-
想让内网服务绑定域名访问
比如:
nas.example.com blog.example.com panel.example.com git.example.com -
想给 Docker 服务配置 HTTPS
Cloudflare 可以自动提供 HTTPS 访问能力。
-
想限制访问者身份
配合 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 完整示例
下面给出一个较完整的组合示例:同时部署 cloudflared、nginx 和 portainer。
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 可以降低暴露源站的风险,但并不代表可以忽视安全配置。
建议:
-
管理后台必须加 Zero Trust Access
不要把 Portainer、NAS、路由器后台、数据库管理工具直接裸露到公网。
-
容器最小化暴露端口
如果服务只给 cloudflared 访问,可以使用:
expose: - "3000"而不是:
ports: - "3000:3000" -
不要泄露 Tunnel Token
Token 等同于连接你隧道的凭据,应避免上传到公开仓库。
-
定期更新镜像
定期执行:
docker compose pull docker compose up -d -
开启 Cloudflare 安全功能
可以启用 WAF、Bot Fight Mode、速率限制、防火墙规则等。
-
区分公开服务和私有服务
博客、官网可以公开访问;管理后台建议加登录验证。
十六、推荐目录结构
为了方便维护,推荐使用如下目录:
/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 和最小权限原则,才能让你的部署既方便又安全。