Cloudflare Tunnel Docker 一键部署:不用公网 IP,也能把本地服务安全发布上线
Cloudflare Docker部署教程|一键部署
在现代网站与服务部署中,Cloudflare 已经成为非常常见的基础设施工具。它不仅可以提供 DNS 解析、CDN 加速、HTTPS 证书、DDoS 防护,还可以通过 Cloudflare Tunnel 将本地服务、内网服务或服务器上的 Web 服务安全地暴露到公网,而不需要开放服务器端口,也不需要公网 IP。
本文将以 Docker 部署 Cloudflare Tunnel(cloudflared) 为核心,讲解如何通过 Docker 或 Docker Compose 实现 Cloudflare 的一键部署。适合用于部署个人博客、NAS 服务、后台管理面板、Home Assistant、Web 应用、API 服务等场景。
一、Cloudflare Docker 部署适合哪些场景?
很多用户在部署 Web 服务时,会遇到以下问题:
- 服务器没有公网 IP;
- 家庭宽带无法开放 80、443 端口;
- 不想暴露真实服务器 IP;
- 想通过 Cloudflare 免费 HTTPS 访问内网服务;
- 想快速将 Docker 服务绑定到自己的域名;
- 想减少防火墙、Nginx 反向代理、证书申请等复杂配置。
这时,Cloudflare Tunnel 就非常适合。
Cloudflare Tunnel 的工作方式是:
在你的服务器或本地设备中运行一个 cloudflared 客户端,它会主动连接 Cloudflare 网络。用户访问你的域名时,请求会先到 Cloudflare,再通过加密隧道转发到你的本地服务。
整个过程不需要在服务器上开放入站端口,也不需要公网 IP。
二、部署前准备
在开始之前,你需要准备以下内容:
1. 一个 Cloudflare 账号
如果还没有账号,可以前往 Cloudflare 官网注册:
https://www.cloudflare.com/
2. 一个已经托管到 Cloudflare 的域名
你需要将域名 DNS 托管到 Cloudflare。
例如你有一个域名:
example.com
需要在域名注册商后台将 NS 服务器修改为 Cloudflare 提供的 NS 地址。
修改完成后,Cloudflare 后台会显示该域名处于 Active 状态。
3. 一台已经安装 Docker 的服务器
可以是:
- VPS 云服务器;
- 家庭 NAS;
- Linux 主机;
- 树莓派;
- 群晖、威联通;
- 本地 Docker 环境。
检查 Docker 是否安装成功:
docker -v
如果返回类似内容,说明 Docker 已安装:
Docker version 26.1.4, build xxxx
如果没有安装 Docker,可以使用以下命令安装:
curl -fsSL https://get.docker.com | bash
安装完成后,启动 Docker:
systemctl enable docker
systemctl start docker
三、部署方式说明
Cloudflare Tunnel 的 Docker 部署主要有两种方式:
- 临时 Token 方式部署
- 配置文件方式部署
其中最推荐新手使用的是 Token 方式部署,因为它最简单,几乎可以实现一键运行。
本文主要介绍 Token 一键部署方式,同时也会补充 Docker Compose 的部署方法,方便长期运行和维护。
四、创建 Cloudflare Tunnel
首先登录 Cloudflare 后台:
https://dash.cloudflare.com/
然后按照以下步骤操作:
1. 进入 Zero Trust 控制台
在 Cloudflare 后台左侧找到:
Zero Trust
如果是第一次使用,Cloudflare 可能会要求你创建团队名称,按照提示完成即可。
2. 创建 Tunnel
进入 Zero Trust 后,依次点击:
Networks → Tunnels
然后点击:
Create a tunnel
选择:
Cloudflared
然后给 Tunnel 起一个名字,例如:
my-docker-tunnel
点击保存。
3. 获取 Docker Token 命令
创建完成后,Cloudflare 会让你选择安装环境。
选择:
Docker
你会看到类似下面的命令:
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <你的Token>
其中 <你的Token> 是 Cloudflare 自动生成的隧道认证令牌。
这个 Token 非常重要,不要公开泄露。
五、Docker 一键部署 Cloudflare Tunnel
如果你只是想快速运行,可以直接使用 Cloudflare 提供的命令:
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token 你的Token
参数说明:
| 参数 | 说明 |
|---|---|
-d |
后台运行容器 |
--name cloudflared |
容器名称 |
--restart unless-stopped |
容器异常退出后自动重启 |
cloudflare/cloudflared:latest |
Cloudflare 官方镜像 |
tunnel run --token |
使用 Token 运行隧道 |
运行后,查看容器状态:
docker ps
如果看到 cloudflared 容器处于运行状态,说明部署成功。
查看日志:
docker logs -f cloudflared
如果日志中出现类似内容:
Registered tunnel connection
Connection established
说明 Tunnel 已经成功连接 Cloudflare。
六、使用 Docker Compose 部署
如果你希望后续更方便地管理服务,推荐使用 Docker Compose。
创建目录:
mkdir -p /opt/cloudflared
cd /opt/cloudflared
创建 docker-compose.yml 文件:
nano docker-compose.yml
写入以下内容:
version: "3.8"
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token 你的Token
保存后启动:
docker compose up -d
查看运行状态:
docker compose ps
查看日志:
docker compose logs -f
如果需要停止:
docker compose down
如果需要更新镜像:
docker compose pull
docker compose up -d
七、一键部署脚本
为了进一步简化部署流程,可以使用下面的一键部署脚本。
1. 创建脚本
nano install-cloudflared.sh
写入以下内容:
#!/bin/bash
set -e
echo "======================================"
echo " Cloudflare Tunnel Docker 一键部署脚本"
echo "======================================"
read -p "请输入 Cloudflare Tunnel Token: " CF_TOKEN
if [ -z "$CF_TOKEN" ]; then
echo "Token 不能为空,部署终止。"
exit 1
fi
echo "正在检查 Docker 是否安装..."
if ! command -v docker >/dev/null 2>&1; then
echo "未检测到 Docker,开始安装 Docker..."
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker
else
echo "Docker 已安装。"
fi
echo "正在创建部署目录..."
mkdir -p /opt/cloudflared
cd /opt/cloudflared
echo "正在生成 docker-compose.yml..."
cat > docker-compose.yml <
2. 赋予执行权限
chmod +x install-cloudflared.sh
3. 执行脚本
bash install-cloudflared.sh
按照提示输入 Cloudflare Tunnel Token 即可完成部署。
八、绑定域名到本地服务
Tunnel 部署完成后,还需要在 Cloudflare 后台配置访问规则。
回到 Cloudflare Zero Trust 控制台,进入你的 Tunnel 设置页面,找到:
Public Hostname
点击:
Add a public hostname
填写以下内容:
| 配置项 | 示例 |
|---|---|
| Subdomain | app |
| Domain | example.com |
| Type | HTTP |
| URL | localhost:8080 |
这样配置后,访问:
https://app.example.com
就会转发到服务器本机的:
http://localhost:8080
如果你的服务运行在 Docker 容器中,需要特别注意网络访问方式。
九、访问 Docker 容器中的服务
假设你有一个 Web 服务容器,名为 webapp,监听端口为 3000。
如果 cloudflared 和 webapp 不在同一个 Docker 网络中,cloudflared 可能无法直接通过容器名访问它。
推荐做法是创建一个公共 Docker 网络。
1. 创建 Docker 网络
docker network create cloudflare-net
2. 修改 cloudflared 的 Compose 文件
version: "3.8"
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token 你的Token
networks:
- cloudflare-net
networks:
cloudflare-net:
external: true
3. 将业务容器加入同一网络
示例 Web 服务:
version: "3.8"
services:
webapp:
image: nginx:latest
container_name: webapp
restart: unless-stopped
networks:
- cloudflare-net
networks:
cloudflare-net:
external: true
此时在 Cloudflare Public Hostname 中可以填写:
http://webapp:80
这样 Cloudflare Tunnel 就可以通过 Docker 容器名访问 Web 服务。
十、完整示例:部署 Nginx 并通过 Cloudflare 访问
下面演示一个完整例子:使用 Docker 部署 Nginx,然后通过 Cloudflare Tunnel 绑定域名访问。
1. 创建网络
docker network create cloudflare-net
2. 部署 Nginx
mkdir -p /opt/nginx-demo
cd /opt/nginx-demo
创建 docker-compose.yml:
version: "3.8"
services:
nginx-demo:
image: nginx:latest
container_name: nginx-demo
restart: unless-stopped
networks:
- cloudflare-net
networks:
cloudflare-net:
external: true
启动:
docker compose up -d
3. 部署 Cloudflared
mkdir -p /opt/cloudflared
cd /opt/cloudflared
创建 docker-compose.yml:
version: "3.8"
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token 你的Token
networks:
- cloudflare-net
networks:
cloudflare-net:
external: true
启动:
docker compose up -d
4. 配置 Public Hostname
在 Cloudflare 后台添加:
app.example.com → http://nginx-demo:80
等待几分钟后访问:
https://app.example.com
如果能看到 Nginx 默认欢迎页,说明部署成功。
十一、常见问题排查
1. 容器启动后无法访问域名
首先查看 cloudflared 日志:
docker logs -f cloudflared
检查是否出现连接失败、Token 错误或服务不可达等提示。
如果日志正常,再检查 Cloudflare 后台 Public Hostname 是否配置正确。
2. 提示 502 Bad Gateway
502 通常说明 Cloudflare Tunnel 已经连通,但后端服务无法访问。
常见原因包括:
- 服务端口写错;
- 服务容器没有和 cloudflared 在同一 Docker 网络;
- URL 协议写错,例如应该是
http却写成了https; - 后端服务只监听了
127.0.0.1,没有监听容器网络; - 容器名称写错。
如果访问 Docker 容器,建议使用:
http://容器名:端口
例如:
http://nginx-demo:80
3. Token 泄露怎么办?
如果 Tunnel Token 不小心泄露,建议立即到 Cloudflare 后台删除该 Tunnel,重新创建新的 Tunnel,并重新部署容器。
不要将 Token 写入公开 GitHub 仓库,也不要截图公开展示。
4. 是否需要开放服务器端口?
通常不需要。
Cloudflare Tunnel 是由本地 cloudflared 主动连接 Cloudflare,所以不需要开放 80、443 端口。
但服务器需要能够访问外网,否则无法连接 Cloudflare。
5. 是否可以部署多个域名?
可以。
一个 Tunnel 可以配置多个 Public Hostname,例如:
blog.example.com → http://blog:80
api.example.com → http://api:3000
nas.example.com → http://nas:5000
你只需要在 Cloudflare 后台继续添加 Public Hostname 即可。
十二、安全建议
虽然 Cloudflare Tunnel 可以隐藏源站 IP,并减少端口暴露,但仍然需要注意安全。
建议做到以下几点:
1. 后台服务增加访问认证
如果你暴露的是管理后台、NAS、数据库管理工具等敏感服务,建议配合 Cloudflare Access 使用身份认证。
Cloudflare Access 可以限制只有指定邮箱、指定组织或指定用户才能访问。
2. 不要暴露高风险服务
不建议直接暴露以下服务:
- 数据库端口;
- Redis;
- SSH;
- 未加密的后台;
- 无密码的管理面板;
- 内网核心管理系统。
3. 定期更新镜像
定期更新 cloudflared 镜像:
docker compose pull
docker compose up -d
4. 妥善保管 Token
Token 等同于 Tunnel 的连接凭证,需要妥善保存。
建议使用环境变量或 .env 文件管理 Token,而不是直接硬编码在配置中。
例如创建 .env:
CF_TOKEN=你的Token
Compose 文件改为:
version: "3.8"
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token ${CF_TOKEN}
这样更适合长期维护。
十三、卸载 Cloudflare Docker 服务
如果不再需要该 Tunnel,可以执行以下命令卸载本地容器:
cd /opt/cloudflared
docker compose down
删除部署目录:
rm -rf /opt/cloudflared
如果使用的是普通 Docker 命令运行:
docker stop cloudflared
docker rm cloudflared
如果还想删除镜像:
docker rmi cloudflare/cloudflared:latest
最后,建议到 Cloudflare 后台删除对应 Tunnel,避免无效配置长期存在。
十四、总结
通过 Docker 部署 Cloudflare Tunnel,可以非常快速地将本地服务或服务器中的 Docker 应用发布到公网。相比传统的 Nginx 反向代理、端口映射和证书配置,Cloudflare Tunnel 的优势非常明显:
- 不需要公网 IP;
- 不需要开放服务器入站端口;
- 自动支持 HTTPS;
- 可以隐藏真实服务器 IP;
- 支持 Docker 一键部署;
- 适合 NAS、家庭服务器、个人博客和内网应用;
- 后续维护简单,只需要管理容器即可。
如果你只是想快速使用,直接执行:
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token 你的Token
如果你希望长期稳定运行,推荐使用 Docker Compose:
docker compose up -d
部署完成后,在 Cloudflare 后台添加 Public Hostname,将域名指向本地服务地址,就可以通过自己的域名安全访问 Docker 服务了。
对于个人用户、开发者、小团队来说,Cloudflare Tunnel 是一种非常轻量、高效且安全的公网访问方案。只要掌握本文中的 Docker 部署方法,你就可以轻松实现 Cloudflare 一键部署,并将各类本地服务快速发布到公网。