无需公网IP!Docker + Cloudflare Tunnel 完美部署 WordPress
前言
在家庭宽带或内网服务器上部署网站,通常面临没有公网 IP、端口被封锁(80/443)以及安全风险等问题。
今天分享一个极其优雅的解决方案:使用 Docker 配合 Cloudflare Tunnel (隧道)。这种方案不需要在路由器开端口,不需要公网 IP,且自带免费的 SSL 证书,还能隐藏服务器真实 IP,安全性极高。
准备工作
一台安装了 Docker 和 Docker Compose 的服务器(Linux/Mac/NAS均可)。
一个托管在 Cloudflare 上的域名。
Cloudflare 账号(开通免费的 Zero Trust 功能)。
第一步:获取 Cloudflare Tunnel Token
首先,我们需要在 Cloudflare 后台建立一条隧道,打通 Cloudflare 边缘节点到我们服务器的连接。
登录 Cloudflare Dashboard,点击左侧的 Zero Trust。
进入 Networks -> Tunnels,点击 Create a tunnel。
Connector 选择 Cloudflared,给隧道起个名字(如 wp-server)。
在安装界面选择 Docker 环境。
关键步骤: 复制下方的安装命令中 –token 后面的一长串字符(这就是你的隧道认证密钥),保存备用。
第二步:服务器端部署 (Docker Compose)
为了方便管理,我们将 WordPress、MySQL 和 Cloudflared 隧道程序编排在同一个 docker-compose.yml 文件中。
- 创建目录
Bash
mkdir -p my-wordpress && cd my-wordpress- 创建配置文件
创建并编辑 docker-compose.yml 文件:
YAML
version: '3.8'
services:
# --- 1. 数据库服务 ---
db:
image: mysql:5.7
container_name: wp_db
restart: always
environment:
# 【请修改】数据库 Root 密码
MYSQL_ROOT_PASSWORD: changeme123
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
# 【请修改】数据库用户密码 (需与 WP 服务一致)
MYSQL_PASSWORD: wp_password123
volumes:
- db_data:/var/lib/mysql
networks:
- wp_network
# --- 2. WordPress 服务 ---
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wp_app
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp_user
# 【请修改】必须与上面的 MYSQL_PASSWORD 一致
WORDPRESS_DB_PASSWORD: wp_password123
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- wp_network
# --- 3. Cloudflare Tunnel 服务 ---
tunnel:
image: cloudflare/cloudflared
container_name: wp_tunnel
restart: always
command: tunnel run
environment:
# 【请修改】这里粘贴第一步获取的长 Token
- TUNNEL_TOKEN=eyJhIjoiM…这里填你的Token…
networks:
- wp_network
volumes:
db_data:
wp_data:
networks:
wp_network:注意: 请务必修改代码中注释标注的密码和 Token。
- 启动服务
Bash
docker compose up -d第三步:配置公网域名
回到 Cloudflare Tunnel 的设置页面,点击 Next 进入 Public Hostname 配置:
Subdomain (子域名): 输入你想用的前缀,例如 blog。
Domain (域名): 选择你的主域名。
Service (服务转发):
Type: 选择 HTTP
URL: 输入 wordpress:80
这里的 wordpress 就是我们在 Docker 配置文件中定义的服务名,Docker 内部网络会自动解析,非常方便。
第四步:解决 “重定向次数过多” 问题(关键)
配置完成后,访问域名可能会报错或样式丢失。这是因为 Cloudflare 使用 HTTPS 访问隧道,但 WordPress 容器内部认为是 HTTP,导致陷入死循环。
解决方法: 我们需要强制 WordPress 识别 HTTPS 头部。在服务器终端执行以下命令,直接给 WordPress 配置文件打补丁:
Bash
docker exec -it wp_app sh -c "sed -i \"2iif (isset(\\$_SERVER['HTTP_X_FORWARDED_PROTO']) && \\$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { \\$_SERVER['HTTPS'] = 'on'; }\" /var/www/html/wp-config.php"总结
现在,打开你的浏览器访问域名,应该就能看到 WordPress 的安装界面了。
通过这种方式部署,你获得了一个:
✅ 无需公网 IP 的站点
✅ 自动配置 SSL 证书 的站点
✅ 隐藏源站 IP 的安全站点
希望这篇教程对你有帮助!