Cloudflare Tunnel 用 Docker 部署全流程:从安装到公网访问命令汇总
Cloudflare Docker部署教程|附完整命令
在日常建站、内网穿透、反向代理、Web 服务加速以及安全防护场景中,Cloudflare 是非常常用的一套基础设施服务。它不仅可以提供 DNS 解析、CDN 加速、HTTPS 证书、防火墙规则,还可以通过 Cloudflare Tunnel 将本地或服务器内网服务安全地暴露到公网,而无需开放服务器端口。
本文将以 Docker 部署方式为主,详细介绍如何使用 Docker 部署 Cloudflare Tunnel,也就是常见的 cloudflared 服务。相比传统二进制安装方式,Docker 部署更加方便、干净、易迁移,也更适合在服务器、NAS、软路由、家庭实验室以及 Kubernetes 之外的小型环境中使用。
本文会包含完整命令,适合新手直接复制执行。
一、Cloudflare Docker部署适合哪些场景?
在正式开始之前,我们先明确一下本文要部署的内容。
这里说的 Cloudflare Docker 部署,主要是指通过 Docker 运行 Cloudflare 官方提供的 cloudflared 镜像,用于创建 Cloudflare Tunnel。
Cloudflare Tunnel 可以实现以下效果:
- 将本地 Web 服务映射到公网域名;
- 无需在服务器安全组或路由器中开放 80、443 等端口;
- 适合家宽、内网、NAT 环境;
- 可以保护源站 IP,减少被扫描和攻击的风险;
- 支持 HTTP、HTTPS、SSH、RDP、TCP 等多种服务;
- 可以与 Cloudflare Zero Trust 配合做访问控制。
举个例子,如果你本地 Docker 中运行了一个网站服务:
http://localhost:8080
通过 Cloudflare Tunnel,可以让外部用户通过下面的域名访问:
https://demo.example.com
而你的服务器并不需要开放 8080 端口,也不需要有公网 IP。
二、部署前准备工作
在开始之前,你需要准备以下条件。
1. 一个 Cloudflare 账号
如果还没有账号,可以访问 Cloudflare 官网注册:
https://dash.cloudflare.com/
2. 一个已经托管到 Cloudflare 的域名
你需要将域名 DNS 托管到 Cloudflare,也就是说域名的 NS 服务器需要切换为 Cloudflare 提供的 NS。
例如:
example.com
切换完成后,你应该可以在 Cloudflare 控制台看到该域名。
3. 一台已安装 Docker 的服务器
本文以 Linux 服务器为例,例如:
- Ubuntu
- Debian
- CentOS
- Rocky Linux
- AlmaLinux
- NAS 系统
- 软路由系统
你可以先检查 Docker 是否已经安装:
docker -v
如果输出类似下面内容,说明 Docker 已安装:
Docker version 26.1.4, build 5650f9b
如果还没安装 Docker,可以参考下面命令快速安装。
三、安装 Docker 和 Docker Compose
如果你的服务器已经安装 Docker,可以跳过本节。
1. Ubuntu / Debian 安装 Docker
执行以下命令:
curl -fsSL https://get.docker.com | bash
安装完成后,启动 Docker:
systemctl enable docker
systemctl start docker
检查 Docker 状态:
systemctl status docker
查看 Docker 版本:
docker -v
2. 安装 Docker Compose 插件
现在新版 Docker 通常使用 docker compose,而不是旧版的 docker-compose。
检查是否已安装:
docker compose version
如果可以正常输出版本号,说明已经安装。
如果没有,可以使用以下方式安装:
apt update
apt install docker-compose-plugin -y
CentOS / Rocky Linux 可以使用:
yum install docker-compose-plugin -y
四、Cloudflare Tunnel部署方式说明
使用 Docker 部署 Cloudflare Tunnel,常见有两种方式:
- 使用 Cloudflare 控制台生成 Token,然后通过 Docker 直接运行;
- 使用
cloudflared登录账号,手动创建 Tunnel 和配置文件。
对于大多数用户来说,第一种方式最简单,也最推荐。
本文会重点介绍:
- Docker 一键运行方式;
- Docker Compose 部署方式;
- 手动配置 Tunnel 的方式;
- 常见问题排查。
五、方式一:使用 Token 快速部署 Cloudflare Tunnel
这是最简单、最适合新手的方式。
1. 进入 Cloudflare Zero Trust 控制台
打开 Cloudflare 控制台:
https://dash.cloudflare.com/
进入:
Zero Trust
如果是第一次进入,可能需要初始化团队名称。按照页面提示完成即可。
然后依次进入:
Networks → Tunnels
点击:
Create a tunnel
选择:
Cloudflared
输入 Tunnel 名称,例如:
my-docker-tunnel
点击保存。
2. 选择 Docker 部署方式
创建 Tunnel 后,Cloudflare 会让你选择运行环境。
选择:
Docker
此时页面会生成一条类似下面的命令:
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token
其中 是 Cloudflare 自动生成的隧道 Token。
注意:Token 非常重要,不要泄露给他人。
3. 使用 Docker 运行 cloudflared
推荐使用后台运行模式:
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token
请将 替换为你在 Cloudflare 控制台中看到的真实 Token。
例如:
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token eyJhIjoixxxxxxxxxxxxxxxxxxxxxxxx
参数说明:
| 参数 | 说明 |
|---|---|
-d |
后台运行容器 |
--name cloudflared |
容器名称 |
--restart unless-stopped |
容器异常退出后自动重启 |
cloudflare/cloudflared:latest |
Cloudflare 官方 Docker 镜像 |
tunnel run |
运行 Tunnel |
--token |
使用 Cloudflare 生成的 Tunnel Token |
4. 查看容器运行状态
执行:
docker ps
如果看到 cloudflared 容器正在运行,说明启动成功。
查看日志:
docker logs -f cloudflared
如果日志中出现类似内容:
Registered tunnel connection
Connection established
说明 Tunnel 已经成功连接到 Cloudflare。
5. 添加公网访问域名
Tunnel 运行后,还需要在 Cloudflare 控制台中配置访问规则。
进入:
Zero Trust → Networks → Tunnels
找到刚才创建的 Tunnel,点击进入,然后选择:
Public Hostname
点击:
Add a public hostname
填写示例:
| 配置项 | 示例 |
|---|---|
| Subdomain | demo |
| Domain | example.com |
| Type | HTTP |
| URL | http://localhost:8080 |
最终访问地址就是:
https://demo.example.com
如果你的服务运行在同一台宿主机,但不是同一个 Docker 网络中,localhost 有时并不一定能正确访问。因为在容器内部,localhost 指的是 cloudflared 容器自身,而不是宿主机。
这种情况下建议使用下面方式之一:
Linux 宿主机服务访问方式
如果 Web 服务运行在宿主机上,可以使用:
http://host.docker.internal:8080
但 Linux 默认不一定支持 host.docker.internal,可以在启动容器时增加:
--add-host=host.docker.internal:host-gateway
完整命令:
docker run -d \
--name cloudflared \
--restart unless-stopped \
--add-host=host.docker.internal:host-gateway \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token
然后在 Cloudflare 中填写:
http://host.docker.internal:8080
六、方式二:使用 Docker Compose 部署 Cloudflare Tunnel
如果你希望后续管理更加方便,推荐使用 Docker Compose。
1. 创建目录
mkdir -p /opt/cloudflared
cd /opt/cloudflared
2. 创建 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
如果需要访问宿主机服务,可以使用:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway"
command: tunnel --no-autoupdate run --token
保存文件后退出。
3. 启动服务
docker compose up -d
查看运行状态:
docker compose ps
查看日志:
docker compose logs -f
如果需要停止服务:
docker compose down
如果需要重启服务:
docker compose restart
如果需要更新镜像:
docker compose pull
docker compose up -d
七、方式三:手动创建 Tunnel 配置文件
除了 Token 方式,你也可以通过配置文件方式部署。这种方式更灵活,适合高级用户。
1. 创建配置目录
mkdir -p /opt/cloudflared/config
cd /opt/cloudflared
2. 使用 Docker 登录 Cloudflare
执行:
docker run --rm -it \
-v /opt/cloudflared/config:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel login
执行后会输出一个链接,复制到浏览器打开,选择你的 Cloudflare 域名并授权。
授权完成后,会在本地目录生成证书文件,通常类似:
cert.pem
查看文件:
ls -al /opt/cloudflared/config
3. 创建 Tunnel
执行:
docker run --rm -it \
-v /opt/cloudflared/config:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel create my-docker-tunnel
成功后会生成一个 Tunnel ID,例如:
Created tunnel my-docker-tunnel with id 12345678-abcd-1234-abcd-1234567890ab
同时会生成一个凭据文件:
12345678-abcd-1234-abcd-1234567890ab.json
4. 创建配置文件 config.yml
nano /opt/cloudflared/config/config.yml
写入以下内容:
tunnel: 12345678-abcd-1234-abcd-1234567890ab
credentials-file: /home/nonroot/.cloudflared/12345678-abcd-1234-abcd-1234567890ab.json
ingress:
- hostname: demo.example.com
service: http://host.docker.internal:8080
- service: http_status:404
注意替换:
- Tunnel ID;
- 域名;
- 本地服务地址。
最后一条:
- service: http_status:404
表示如果请求没有匹配到任何规则,则返回 404。
5. 创建 DNS 记录
执行:
docker run --rm -it \
-v /opt/cloudflared/config:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel route dns my-docker-tunnel demo.example.com
该命令会自动在 Cloudflare DNS 中创建对应的 CNAME 记录。
6. 使用 Docker Compose 启动
创建 docker-compose.yml:
nano /opt/cloudflared/docker-compose.yml
写入:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- /opt/cloudflared/config:/home/nonroot/.cloudflared
command: tunnel --config /home/nonroot/.cloudflared/config.yml run
启动:
cd /opt/cloudflared
docker compose up -d
查看日志:
docker compose logs -f
八、将 Docker Web 服务接入 Cloudflare Tunnel
很多时候,我们要暴露的服务本身也是 Docker 容器,例如 Nginx、WordPress、Vaultwarden、Alist、Nextcloud 等。
这种情况下,推荐将 cloudflared 和目标服务放到同一个 Docker 网络中。
1. 创建 Docker 网络
docker network create tunnel-net
2. 示例:部署一个 Nginx 服务
docker run -d \
--name nginx-demo \
--restart unless-stopped \
--network tunnel-net \
nginx:latest
此时 Nginx 容器在 Docker 网络中的名称是:
nginx-demo
3. cloudflared 加入同一网络
Token 方式可以这样运行:
docker run -d \
--name cloudflared \
--restart unless-stopped \
--network tunnel-net \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token
然后在 Cloudflare Public Hostname 中配置:
http://nginx-demo:80
这样 cloudflared 容器可以直接通过容器名访问 Nginx 容器。
4. Docker Compose 示例
创建目录:
mkdir -p /opt/tunnel-demo
cd /opt/tunnel-demo
创建 Compose 文件:
nano docker-compose.yml
写入:
services:
nginx-demo:
image: nginx:latest
container_name: nginx-demo
restart: unless-stopped
networks:
- tunnel-net
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token
networks:
- tunnel-net
networks:
tunnel-net:
driver: bridge
启动:
docker compose up -d
然后在 Cloudflare 控制台中配置服务地址:
http://nginx-demo:80
九、常用维护命令
1. 查看容器
docker ps
查看所有容器:
docker ps -a
2. 查看日志
docker logs -f cloudflared
Compose 方式:
docker compose logs -f cloudflared
3. 停止容器
docker stop cloudflared
4. 启动容器
docker start cloudflared
5. 重启容器
docker restart cloudflared
6. 删除容器
docker rm -f cloudflared
7. 更新 cloudflared 镜像
Docker Run 方式:
docker pull cloudflare/cloudflared:latest
docker rm -f cloudflared
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token
Docker Compose 方式:
docker compose pull
docker compose up -d
8. 查看 Docker 网络
docker network ls
查看某个网络详情:
docker network inspect tunnel-net
十、常见问题与解决方法
1. cloudflared 容器启动后访问不了服务
首先查看日志:
docker logs -f cloudflared
如果 Tunnel 显示连接成功,但域名无法访问,多半是服务地址填写错误。
常见错误是将服务地址写成:
http://localhost:8080
如果 cloudflared 在容器里运行,localhost 指的是 cloudflared 容器本身,不是宿主机。
解决方法:
- 访问宿主机服务:使用
host.docker.internal; - 访问另一个 Docker 容器:将两个容器加入同一个 Docker 网络,然后使用容器名访问;
- 确认目标服务监听地址不是仅绑定
127.0.0.1。
2. 提示 502 Bad Gateway
502 通常说明 Cloudflare Tunnel 已经连通,但 cloudflared 无法访问你的本地服务。
检查目标服务是否正常:
curl http://127.0.0.1:8080
如果是 Docker 网络内服务,可以进入 cloudflared 容器测试:
docker exec -it cloudflared sh
然后执行:
wget -O- http://nginx-demo:80
如果无法访问,说明 Docker 网络或服务地址配置有问题。
3. 域名解析没有生效
如果使用控制台配置 Public Hostname,Cloudflare 通常会自动创建 DNS 记录。
你也可以手动检查:
Cloudflare 控制台 → 对应域名 → DNS → Records
通常记录类型是 CNAME,目标类似:
xxxx.cfargotunnel.com
如果是手动方式,也可以执行:
docker run --rm -it \
-v /opt/cloudflared/config:/home/nonroot/.cloudflared \
cloudflare/cloudflared:latest \
tunnel route dns my-docker-tunnel demo.example.com
4. Token 泄露怎么办?
如果 Tunnel Token 泄露,别人可能使用该 Token 连接你的 Tunnel。
建议立即进入:
Zero Trust → Networks → Tunnels
删除旧 Tunnel 或重新生成部署命令,然后重新部署容器。
同时删除旧容器:
docker rm -f cloudflared
再使用新 Token 启动。
5. 是否需要开放服务器端口?
一般不需要。
Cloudflare Tunnel 的原理是由本地 cloudflared 主动向 Cloudflare 建立出站连接,因此你不需要在服务器上开放 80、443 或业务端口。
但是服务器需要能够访问外网,尤其是 Cloudflare 相关服务。
十一、安全建议
虽然 Cloudflare Tunnel 很方便,但仍然建议做好基础安全配置。
1. 不要随意暴露后台服务
例如数据库、Redis、管理面板等,不建议直接暴露到公网。
如果必须暴露,建议配合 Cloudflare Access 做身份认证。
2. 给敏感服务增加访问控制
在 Cloudflare Zero Trust 中可以配置 Access Policy,例如:
- 只允许指定邮箱登录;
- 只允许指定 IP 访问;
- 使用一次性验证码;
- 使用 GitHub、Google、Azure AD 等身份提供商。
3. 定期更新镜像
建议定期执行:
docker compose pull
docker compose up -d
或者:
docker pull cloudflare/cloudflared:latest
4. 妥善保存 Token 和配置文件
不要把包含 Token 的 docker-compose.yml 上传到公开 GitHub 仓库。
如果需要版本管理,可以使用环境变量:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
创建 .env 文件:
nano .env
写入:
CLOUDFLARE_TUNNEL_TOKEN=
启动:
docker compose up -d
十二、完整推荐部署示例
如果你只想快速部署,推荐使用以下流程。
1. 创建目录
mkdir -p /opt/cloudflared
cd /opt/cloudflared
2. 创建 .env
nano .env
写入:
CLOUDFLARE_TUNNEL_TOKEN=
3. 创建 docker-compose.yml
nano docker-compose.yml
写入:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway"
command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
4. 启动
docker compose up -d
5. 查看日志
docker compose logs -f
6. 在 Cloudflare 中配置 Public Hostname
示例:
demo.example.com → http://host.docker.internal:8080
配置完成后,访问:
https://demo.example.com
如果可以正常打开你的服务,说明 Cloudflare Docker 部署完成。
十三、总结
通过 Docker 部署 Cloudflare Tunnel,是目前非常推荐的内网服务发布方案。它不需要公网 IP,不需要开放入站端口,也不需要复杂的 Nginx 反向代理配置。只要你的服务器能够访问外网,就可以通过 Cloudflare 将本地服务安全地映射到公网域名。
对于新手用户,最推荐的方式是:
docker run -d \
--name cloudflared \
--restart unless-stopped \
--add-host=host.docker.internal:host-gateway \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token
如果你更注重长期维护,则建议使用 Docker Compose:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
extra_hosts:
- "host.docker.internal:host-gateway"
command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
总体来说,Cloudflare Tunnel 非常适合个人站点、家庭服务器、NAS 服务、开发测试环境以及轻量级生产服务。只要合理配置访问控制和安全策略,就能在便利性和安全性之间取得较好的平衡。