Cloudflared反代容器服务
在公网暴露端口一直是很多 VPS 用户担心的安全问题:
- 不想暴露内部服务的端口
- 又希望能通过域名访问这些服务
Cloudflare Tunnel(Cloudflared) 给出了完美的解决方案: VPS 完全不需要暴露任何端口,所有流量通过 Cloudflare 全球网络中转,再进入 VPS 容器网络。
本教程将演示:
- 使用 Docker Compose 部署 Cloudflared
- 使用 Docker Compose 部署业务容器
- 两者共享同一个 Docker 网络
- 通过 Cloudflare Tunnel 暴露内部服务,不开放任何端口
方案架构说明
整体思路如下:
用户访问域名 → Cloudflare Edge → Cloudflare Tunnel → Cloudflared 容器 → 同网段容器服务特点:
- VPS 无需开放任何端口
- 只要在同一个 Docker 网络,Cloudflared 就能直接访问容器
- 域名解析自动由 Cloudflare 管理
创建一个专用 Docker 网络
让 Cloudflared 与所有业务容器在同一个网络中通信:
docker network create tunnel之后的 compose 文件中会引用这个网络。
安装 Cloudflared
获取 Tunnel Token
登录 Cloudflare → Zero Trust → Networks → Connectors 新建一个 Tunnel,选择隧道类型为 Cloudflared,Cloudflare 会生成如下命令:
cloudflared.exe service install eyJ...我们只需要后面的 Token。
docker compose文件
创建目录:
mkdir -p ~/cloudflared
cd ~/cloudflared将以下内容写入 compose.yml 文件,其中 command 中的 token 参数填入前面获取的 Token:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=your_token
networks:
- tunnel
networks:
tunnel:
external: true启动 cloudflared 容器:
docker compose up -d部署业务容器
假设你要暴露一个内部服务,比如 dockge ,内部端口5001。先创建一个目录:
mkdir -p ~/dockge
cd ~/dockge将以下内容写入 compose.yml 文件:
services:
dockge:
image: louislam/dockge:1
container_name: dockge
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
# Stacks Directory
# ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
# ⚠️ 1. FULL path only. No relative path (MUST)
# ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
- /home/gitop/dockge/stacks:/home/gitop/dockge/stacks
environment:
# Tell Dockge where to find the stacks
- DOCKGE_STACKS_DIR=/home/gitop/dockge/stacks
- TZ=Asia/Shanghai
expose:
- "5001"
networks:
- tunnel
networks:
tunnel:
external: true启动 dockge 容器:
docker compose up -d在 Cloudflare Tunnel 配置反代规则
回到 Cloudflare → Zero Trust → Networks → Connectors,点击刚刚建好的 Tunnel,然后点击 Edit。

点击 Published application routes 页签,再点击 Add a published application route 添加一条路由:
- Subdomain:
dockge - Domain: 选择自己托管的域名
- Service Type: HTTP
- URL:
dockge:5001
因为 Cloudflared 和 dockge 在同一 Docker 网络,容器名跟域名一样可直接访问。保存后
你就可以通过URLhttps://dockge.your-domain访问 dockge 服务了, Cloudflare 会帮你解析域名并通过 cloudflared 找到相应的容器服务。
其他的业务容器跟 dockge 一样配置,这里不再赘述了。
总结
使用 Cloudflared + Docker,你可以实现:
- 容器服务端口隐藏
- 无需公网端口,也能正常对外提供服务
- Cloudflared 反代同一个 Docker 网络的业务容器
- 反代配置统一在 Cloudflare 管理