目录

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。

/images/2025/12/11/edit-tunnel.png

点击 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 管理