WSL2 + Docker 本地开发 & 生产部署
本项目放弃 Docker Desktop,改用 WSL2 + Ubuntu 原生 Docker Engine。
本文档涵盖:本地开发环境搭建、Docker 服务使用、生产环境部署、数据库备份还原。
为什么不用 Docker Desktop?
| Docker Desktop | WSL2 原生 Docker |
|---|---|
| 收费(企业用户) | 完全免费 |
| 资源占用高(GUI + 后台服务) | 纯命令行,轻量 |
| 更新频繁、偶尔崩溃 | 稳定,和服务器环境一致 |
| 镜像加速需在 GUI 中配置 | 直接改 /etc/docker/daemon.json |
第一部分:本地开发环境搭建
1.1 Docker 服务概览
本项目 docker-compose.yml 包含以下服务:
| 服务 | 说明 | 端口 | 绑定地址 |
|---|---|---|---|
| nginx | Nginx 1.25 Web 服务器 | 8000 | 127.0.0.1 |
| php | PHP 8.4-FPM (ThinkPHP 8) | 9000 | 容器内网 |
| mysql | MySQL 8.0 数据库 | 3306 | 127.0.0.1 |
| redis | Redis 7 缓存 | 6379 | 127.0.0.1 |
| phpmyadmin | 数据库管理面板(可选) | 8081 | 127.0.0.1 |
所有容器端口均绑定
127.0.0.1,不直接暴露公网,由宿主机 Nginx 统一反代并处理 SSL。
1.2 整体架构
┌──────────────────────────────────────────────────────────────┐
│ Windows 11 │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ WSL2 虚拟机 │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Ubuntu 26.04 LTS │ │ │
│ │ │ │ │ │
│ │ │ Docker Engine (原生 Linux) │ │ │
│ │ │ ├── nginx :8000 │ │ │
│ │ │ ├── php :9000 │ │ │
│ │ │ ├── mysql :3306 │ │ │
│ │ │ ├── redis :6379 │ │ │
│ │ │ └── phpmyadmin :8081 │ │ │
│ │ │ │ │ │
│ │ │ 项目代码: /mnt/d/MyProjects/... │ │ │
│ │ │ 前端源码: frontend/ (uni-app) │ │ │
│ │ └──────────────────┬───────────────────────────────┘ │ │
│ └─────────────────────┼─────────────────────────────────┘ │
│ │ Rsync 同步 │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Windows 前端同步目录 D:\...\frontend-sync\ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ HBuilderX ──编译运行──→ 微信开发者工具 │ │
│ │ (实时预览 / 调试小程序) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ 浏览器访问后端 API: http://localhost:8000 │
│ (mirrored 模式,WSL 与 Windows 共享 IP) │
└──────────────────────────────────────────────────────────────┘
1.3 第一步:安装 WSL2 + Ubuntu
在 Windows PowerShell(管理员) 中执行:
# 1. 安装 Ubuntu 推荐24.04
wsl --install -d Ubuntu-24.04
# 2. 进入 Ubuntu,首次启动会提示创建用户名和密码
wsl
更多细节参考微软官方文档:安装 WSL
1.4 第二步:配置 .wslconfig
项目已提供 .wslconfig 文件,位于 wsl/.wslconfig。复制到 Windows 用户目录:
# 在 Windows PowerShell 中执行
copy wsl\.wslconfig $env:USERPROFILE\.wslconfig
[wsl2]
# ============ 性能限制(防止 WSL 吃光电脑资源) ============
# 限制 WSL 最大占用内存为 4GB(16G 内存的电脑推荐 4-6G)
# 防止 Docker 或编译任务把内存吃满导致 Windows 卡顿
memory=4GB
# 限制 WSL 最多使用 4 个 CPU 核心
# 防止大型编译任务(如 npm install、make -j)把 CPU 占满
processors=4
# 交换空间大小(虚拟内存),设为内存的 1-2 倍即可
# 当物理内存不足时,WSL 会使用这部分磁盘空间作为临时内存
swap=8GB
# ============ 网络配置(让局域网设备直接访问 WSL 服务) ============
# 镜像网络模式:让 WSL 和 Windows 共享同一个 IP 地址
# 开启后,Windows 和 WSL 拥有相同的局域网 IP(如 192.168.1.100)
# 不再需要手动 netsh 端口转发,局域网设备直接访问 Windows IP 即可
networkingMode=mirrored
# DNS 隧道:让 WSL 借用 Windows 的 DNS 解析能力
# 解决 WSL 里 apt update、curl、docker pull 偶尔 DNS 解析失败的问题
# 特别适合公司内网环境,访问内网域名更稳定
dnsTunneling=true
# 防火墙自动放行:WSL 服务自动向 Windows 防火墙申请放行端口
# 开启后,你在 Docker 里映射的端口(如 -p 8080:80)会被自动放行
# 不再需要手动添加入站规则,其他设备直接访问即可
firewall=true
# 自动代理:WSL 自动跟随 Windows 系统代理设置
# 如果你在 Windows 上开了 Clash/V2Ray 等代理软件
# WSL 里的 apt、curl、docker pull 会自动走代理,无需手动 export
autoProxy=true
# localhost 转发:让 Windows 应用能通过 localhost 访问 WSL 服务
# 在镜像模式下自动生效,无需配置
# localhostForwarding=true
[experimental]
# 宿主机环回访问:让 Windows 本机也能通过局域网 IP 访问 WSL 服务
# 开启后,Windows 上可以用 http://192.168.1.100:8000 访问自己的 WSL 端口
# 不开的话 Windows 本机只能通过 localhost 访问,局域网 IP 反而连不上自己
hostAddressLoopback=true
配置说明:
| 配置项 | 值 | 作用 |
|---|---|---|
memory | 4GB | 限制 WSL 最大内存,防止吃满系统资源 |
processors | 4 | 限制 CPU 核心数 |
swap | 8GB | 交换空间大小 |
networkingMode | mirrored | 关键:WSL 与 Windows 共享 IP 地址 |
dnsTunneling | true | 借用 Windows DNS,解决 WSL 内 DNS 问题 |
firewall | true | WSL 端口自动被 Windows 防火墙放行 |
autoProxy | true | 自动跟随 Windows 代理设置 |
hostAddressLoopback | true | 关键:允许本机通过局域网 IP 访问 WSL |
配置修改后需重启 WSL:
wsl --shutdown
wsl
补充:Windows 防火墙入站规则
firewall=true 理论上会自动放行 WSL 端口,但实际可能不生效(尤其是非管理员账户或公司域环境)。建议手动添加防火墙规则,确保局域网设备能访问。
以放行本项目的 Nginx(8000)、phpMyAdmin(8081)端口为例:
# 在 Windows PowerShell(管理员)中执行
# 放行 8000 端口(Nginx)
New-NetFirewallRule -DisplayName "WSL Docker Nginx 8000" `
-Direction Inbound -Protocol TCP -LocalPort 8000 `
-Action Allow -Profile Private,Public
# 放行 8081 端口(phpMyAdmin)
New-NetFirewallRule -DisplayName "WSL Docker phpMyAdmin 8081" `
-Direction Inbound -Protocol TCP -LocalPort 8081 `
-Action Allow -Profile Private,Public
# 验证规则已添加
Get-NetFirewallRule -DisplayName "WSL*" | Format-Table DisplayName, Enabled, Direction, Action
如果只想在家庭/公司局域网内访问,
-Profile Private即可;公共 Wi-Fi 环境按需加Public。
宿主机监听局域网 IP 的原理
.wslconfig 中以下两项配合即可让宿主机(Windows)监听本地局域网 IP,无需额外配置:
| 配置 | 作用 |
|---|---|
networkingMode=mirrored | WSL 与 Windows 共享同一个 IP,局域网设备访问 http://<Windows本机IP>:8000 即等于访问 WSL 内的 Nginx |
firewall=true | WSL 端口自动向 Windows 防火墙申请放行(不生效时参考上方手动规则) |
效果:
局域网其他设备(手机/平板)
│
│ http://192.168.1.100:8000
▼
Windows 宿主机(192.168.1.100)
│
│ mirrored 模式(共享 IP)
▼
WSL2 Ubuntu → Docker Nginx :8000
关于
hostAddressLoopback:mirrored模式让 WSL 与 Windows 共享 IP,但 Windows 本机默认只能通过localhost访问自己的服务。开启hostAddressLoopback=true后,Windows 本机也能通过局域网 IP(如192.168.1.100:8000)访问 WSL 端口,方便本机调试时与移动端保持一致地址。未开启
mirrored模式时,WSL 拥有独立 IP(如172.x.x.x),局域网设备无法直接访问,需要手动netsh interface portproxy做端口转发。开启后这一切自动搞定。
1.5 第三步:配置 Ubuntu 软件源 + 安装 Docker Engine
Ubuntu 换源(阿里云镜像)
Ubuntu 24.04 引入的新配置格式(.sources 文件),操作方式如下。
# 1. 备份原文件
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 2. 删除配置文件
sudo rm /etc/apt/sources.list.d/ubuntu.sources
# 3. 编辑(新建)配置文件
sudo nano /etc/apt/sources.list.d/ubuntu.sources
将文件内容替换为以下阿里云镜像源:
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: resolute resolute-updates resolute-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: resolute-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Nano 编辑器操作:
Ctrl+O保存,回车确认;Ctrl+X退出。
# 3. 更新软件源
sudo apt update
# 4. 可选:升级已安装的软件
sudo apt upgrade
看到从 mirrors.aliyun.com 拉取软件包列表即表示换源成功。
安装 Docker Engine(从阿里云 Docker CE 源安装)
# 1. 更新软件包索引
sudo apt update
# 2. 安装依赖包
sudo apt install -y ca-certificates curl gnupg
# 3. 创建密钥目录并下载 Docker GPG 密钥(从阿里云镜像)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --batch --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 4. 添加阿里云 Docker APT 源(24.04 的代号是 noble)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
noble stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 更新源并安装 Docker 及 Compose 插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 6. 验证安装
docker --version
docker compose version
将当前用户加入 docker 组(之后无需 sudo):
sudo usermod -aG docker $USER
sudo newgrp docker
配置镜像加速(国内必做):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://hub.uuuadc.top"
]
}
EOF
重启 WSL 使 docker 组和镜像加速配置生效(在 Windows PowerShell 中执行):
wsl --shutdown
wsl
不配置镜像加速可能导致
docker compose up -d时拉取镜像极慢或超时。
1.6 第四步:启动项目
# 进入项目目录(Windows D 盘挂载在 /mnt/d)
cd /mnt/d/MyProjects/general-member-management
# 启动所有 Docker 服务
docker compose up -d
首次启动会自动:构建 PHP 镜像 → 创建数据库 → 执行 database/init_database.sql 初始化 → 配置 Nginx。
首次启动后,安装 ThinkPHP 依赖(vendor/ 目录通过 Volume 挂载,不会自动安装):
docker exec -it gmm-php composer install
验证:
curl http://localhost:8000
若 Ubuntu 内已安装 PHP + Composer,也可在启动前于
backend/目录执行composer install。
1.7 第五步:前端开发环境(Rsync + HBuilderX)
本项目前端是微信小程序(uni-app),不运行在 Docker 中。本地开发时,前端源码位于 WSL 的项目目录中,通过 Rsync 同步到 Windows 文件夹,再使用 HBuilderX 调起微信开发者工具进行实时预览和调试。
工作流程
WSL 前端源码 Rsync 单向同步 Windows 文件夹 HBuilderX 打开
frontend/ ──────────────────→ D:\...\frontend-sync\ ─────────────→ 微信开发者工具
(编辑代码) (自动/手动触发) (中间桥梁) (编译运行) (实时预览)
为什么需要 Rsync?因为微信开发者工具和 HBuilderX 是 Windows 应用,无法直接读取 WSL 虚拟磁盘内的文件。Rsync 将前端代码从 WSL 映射到 Windows 本地目录,作为中间桥梁。
安装 Rsync
# Ubuntu 通常已预装 rsync,检查版本
rsync --version
# 如未安装
sudo apt install -y rsync
自动同步方案
源码始终在 WSL 原生文件系统(~/.projects/...)中编辑,仅将同步目标指向 Windows 目录(/mnt/d/...)。使用 inotifywait 事件驱动方案:
inotifywait 事件驱动
检测到文件变更立刻触发 Rsync,延迟最低。源码在 WSL 原生 ext4 文件系统中,inotify 完全可用。
sudo apt install -y inotify-tools
创建 watch-frontend.sh:
#!/bin/bash
# watch-frontend.sh — 检测变更立刻同步,延迟 < 1 秒
WIN_TARGET="/mnt/d/projects/wsl-sync/gmm-frontend/"
WSL_SOURCE="/home/ubuntu/projects/general-member-management/frontend"
# 先全量同步一次
rsync -avz --delete \
--exclude 'node_modules/' \
--exclude '.git/' \
--exclude 'dist/' \
"$WSL_SOURCE/" "$WIN_TARGET/"
echo "👀 正在监听 $WSL_SOURCE 文件变更..."
inotifywait -m -r -e modify,create,delete,move \
--exclude 'node_modules|.git|dist' \
"$WSL_SOURCE" | while read -r path action file; do
rsync -avz --delete \
--exclude 'node_modules/' \
--exclude '.git/' \
--exclude 'dist/' \
"$WSL_SOURCE/" "$WIN_TARGET/"
echo "[$(date '+%H:%M:%S')] 已同步: $file"
done
chmod +x watch-frontend.sh
# 前台运行(调试用)
./watch-frontend.sh
# 后台运行
nohup ./watch-frontend.sh > /dev/null 2>&1 &
# 停止后台同步
pkill -f watch-frontend.sh
原理:
inotifywait监听 WSL 内文件的modify/create/delete/move事件,一旦触发立即执行 Rsync。源码在 Linux 原生文件系统上,事件捕获零延迟。
设置 WSL 启动时自动运行(避免每次手动跑)
watch-frontend.sh 是一个常驻后台进程,配置为 WSL 启动时自动拉起,一劳永逸。
无需手动打开终端,Windows 开机或 wsl 命令启动 Ubuntu 时就自动拉起。
# 编辑 /etc/wsl.conf(可能需要 sudo)
sudo nano /etc/wsl.conf
添加以下内容:
[boot]
command="sudo -u ubuntu /bin/bash /home/ubuntu/projects/general-member-management/watch-frontend.sh"
⚠️ 注意:
/etc/wsl.conf中的[boot]指令以 root 身份运行,务必用sudo -u 用户名切换到普通用户执行,且脚本内路径必须写绝对路径(root 下~和相对路径均不指向用户目录)。
保存后重启 WSL 验证:
# Windows PowerShell 中执行
wsl --shutdown
wsl
然后在 WSL 中检查进程:
ps aux | grep watch-frontend
Windows 端操作
- 打开 HBuilderX
- 「文件」→「打开目录」→ 选择
D:\...\frontend-sync\ - 「运行」→「运行到小程序模拟器」→「微信开发者工具」
- HBuilderX 自动编译并调起微信开发者工具,即可实时预览
在 WSL 中编辑前端代码 → Rsync 自动同步到 Windows → HBuilderX 检测文件变更自动重新编译 → 微信开发者工具热更新预览。
访问地址
| 服务 | 地址 |
|---|---|
| 后端 API | http://localhost:8000 或 http://<本机IP>:8000 |
| phpMyAdmin | http://localhost:8081 |
| MySQL | 127.0.0.1:3306(root / root) |
停止
docker compose stop # 保留容器和数据
docker compose down # 删除容器,保留数据
docker compose down -v # ⚠️ 全部清除(含数据库数据)
第二部分:Docker 服务详解
2.1 生产环境安装 Docker
Ubuntu / Debian(从阿里云 Docker CE 源安装)
# 1. 更新软件包索引
sudo apt update
# 2. 安装依赖包
sudo apt install -y ca-certificates curl gnupg
# 3. 创建密钥目录并下载 Docker GPG 密钥(从阿里云镜像)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --batch --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 4. 添加阿里云 Docker APT 源(24.04 的代号是 noble)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
noble stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 更新源并安装 Docker 及 Compose 插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 6. 验证安装
docker --version
docker compose version
将当前用户加入 docker 组(之后无需 sudo):
sudo usermod -aG docker $USER
sudo newgrp docker
加入
docker组后需重新登录 SSH 才能永久生效。
CentOS / RHEL
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable docker --now
sudo usermod -aG docker $USER
以上均使用阿里云镜像源,国内下载速度更快。
Docker 镜像加速(国内必配)
与上文 1.5 节配置相同,生产服务器同样需要。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://hub.uuuadc.top"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2 常用命令
| 用途 | 命令 |
|---|---|
| 查看容器状态 | docker compose ps |
| 查看实时日志 | docker compose logs -f |
| 进入 PHP 容器 | docker exec -it gmm-php sh |
| 进入 MySQL | docker exec -it gmm-mysql mysql -uroot -proot general_management |
| 查看容器日志 | docker logs gmm-php -f |
| 重新构建 PHP | docker compose build php |
| 无缓存重建 | docker compose build --no-cache |
| 重新构建并启动 | docker compose up -d --build |
| 测试后端 | curl http://localhost:8000 |
| 手动执行备份 | docker exec gmm-mysql-backup backup.sh |
| 查看备份文件 | ls -lh docker/backup/ |
| 查看备份日志 | docker exec gmm-mysql-backup cat /var/log/backup.log |
| 进入备份容器 | docker exec -it gmm-mysql-backup sh |
2.3 注意事项
- 端口安全 — 容器端口均绑定
127.0.0.1,不暴露公网,由宿主机 Nginx 反代接入 - 前端开发 — 前端是微信小程序 uni-app,不运行在 Docker 中。通过 Rsync 将 WSL 中的前端源码同步到 Windows 目录,再由 HBuilderX 调起微信开发者工具进行实时预览,详见 1.7 节
- 热重载 — 后端代码通过 Volume 挂载,修改
backend/下的文件实时生效,无需重启容器 - PHP 扩展 — 编辑
docker/php/Dockerfile后执行docker compose build php重新构建 - 编辑 .env 文件 — Docker 配置在
.env;ThinkPHP 配置在backend/.env(从.env.example复制),两个文件都需正确配置 - 手动生成 init_database.sql — 表结构变更后更新初始化脚本:
docker exec gmm-mysql mysqldump -uroot -proot --no-data general_management > database/init_database.sql
2.4 Docker 目录结构
docker/ # Docker 配置目录
├── php/
│ ├── Dockerfile # PHP 镜像构建文件
│ └── php.ini # PHP 自定义配置
├── nginx/
│ ├── conf.d/
│ │ └── default.conf # Docker 内 Nginx 配置
│ ├── host-nginx-template.conf # 宿主机 HTTP 反代模板(阶段一)
│ ├── host-nginx-https-template.conf # 宿主机 HTTPS 反代模板(阶段二)
│ └── host-default-deny.conf # 宿主机默认阻断(拒绝未匹配域名)
├── backup/ # 数据库备份服务
│ ├── Dockerfile # 备份容器镜像
│ ├── backup.sh # 备份脚本
│ ├── restore.sh # 还原脚本
│ ├── entrypoint.sh # 容器入口
│ └── db_*.sql.gz # 自动生成的备份文件
└── README.md # 简短指针 → wsl/README.md
第三部分:生产环境部署
3.1 生产架构
浏览器 HTTPS ──→ 宿主机 Nginx (:80/:443) ← SSL 在这里终结
│
┌────────────┼────────────┐
▼ ▼ ▼
127.0.0.1:8000 127.0.0.1:9000 127.0.0.1:8080
[本项目 Docker] [其他项目A] [其他项目B]
纯 HTTP 通信 纯 HTTP 纯 HTTP
Docker 内所有服务只跑裸 HTTP,不碰 SSL 证书。SSL 统一在宿主机 Nginx 管理,一份泛域名证书覆盖所有子域名。
3.2 前置条件
- Linux 服务器(CentOS 7+ / Ubuntu 20.04+ / Debian 11+)
- root 或 sudo 权限
- Docker Engine 已安装(参考上方 2.1)
3.3 步骤 1:部署项目代码
scp -r ./ root@your-server:/var/www/general-member-management/
3.4 步骤 2:配置环境变量
# Docker Compose 环境变量
cp .env.example .env
nano .env # 修改 DB_PASS、NGINX_PORT 等
# ⚠️ 生产环境务必添加:BIND_ADDRESS=127.0.0.1
# ThinkPHP 后端配置
cp backend/.env.example backend/.env
nano backend/.env # DB_HOST=mysql, CACHE_HOST=redis
3.5 步骤 3:启动 Docker 服务
cd /var/www/general-member-management
docker compose up -d
docker compose ps # 验证
3.6 步骤 4:安装 ThinkPHP 依赖
docker exec -it gmm-php composer install --no-dev --optimize-autoloader
curl http://127.0.0.1:8000 # 验证
若部署前已在宿主机执行过
composer install,则vendor/目录已存在,容器启动后直接可用。
3.7 步骤 5:安装宿主机 Nginx
Docker 内的 Nginx 仅监听 127.0.0.1,需要宿主机安装 Nginx 统一反向代理并处理 SSL。
# CentOS / RHEL
sudo yum install -y nginx
# Ubuntu / Debian
sudo apt update && sudo apt install -y nginx
sudo systemctl enable nginx --now
3.8 步骤 6:配置宿主机 Nginx 反代
项目已提供配置模板,复制到 sites-available 并创建软链接启用:
sudo cp docker/nginx/host-nginx-template.conf /etc/nginx/sites-available/gmm.shouchunyun.cn.conf
sudo sed -i 's/YOUR_DOMAIN/gmm.shouchunyun.cn/g; s/YOUR_PORT/8000/g' /etc/nginx/sites-available/gmm.shouchunyun.cn.conf
sudo ln -s /etc/nginx/sites-available/gmm.shouchunyun.cn.conf /etc/nginx/sites-enabled/gmm.shouchunyun.cn.conf
sudo nginx -t && sudo nginx -s reload
3.9 步骤 7:申请 SSL 证书(推荐 acme.sh)
curl https://get.acme.sh | sh
source ~/.bashrc
# 以腾讯云 DNSPod 为例,前往 https://console.dnspod.cn/account/token/token 创建密钥
export DP_Id="你的DNSPod ID"
export DP_Key="你的DNSPod Token"
acme.sh --issue --dns dns_dp -d '*.shouchunyun.cn' -d shouchunyun.cn
# 安装证书到宿主机 Nginx
sudo mkdir -p /etc/nginx/ssl
sudo chown -R $USER:$USER /etc/nginx/ssl
~/.acme.sh/acme.sh --install-cert -d '*.shouchunyun.cn' \
--key-file /etc/nginx/ssl/privkey.key \
--fullchain-file /etc/nginx/ssl/fullchain.pem \
--reloadcmd "sudo nginx -s reload"
sudo chown root:root /etc/nginx/ssl/*
泛域名证书
*.shouchunyun.cn一份即可覆盖所有子域名。
部署默认阻断
防止不存在的子域名被路由到其他站点:
sudo cp docker/nginx/host-default-deny.conf /etc/nginx/sites-available/000-default-deny
sudo ln -s /etc/nginx/sites-available/000-default-deny /etc/nginx/sites-enabled/000-default-deny
sudo nginx -t && sudo nginx -s reload
000-开头确保 Nginx 优先将其作为default_server,不匹配的域名请求return 444直接关闭连接。
3.10 步骤 8:启用 HTTPS
sudo cp docker/nginx/host-nginx-https-template.conf /etc/nginx/sites-available/gmm.shouchunyun.cn.conf
sudo sed -i 's/YOUR_DOMAIN/gmm.shouchunyun.cn/g; s/YOUR_PORT/8000/g' /etc/nginx/sites-available/gmm.shouchunyun.cn.conf
sudo nginx -t && sudo nginx -s reload
两个模板区别:
host-nginx-template.conf纯 HTTP,host-nginx-https-template.confHTTPS 重定向 + SSL。
3.11 增加新站点
使用 sites-available/sites-enabled 模式管理:
# 启用新站点
sudo cp docker/nginx/host-nginx-https-template.conf /etc/nginx/sites-available/新域名.conf
sudo sed -i 's/YOUR_DOMAIN/新域名/g; s/YOUR_PORT/新端口/g' /etc/nginx/sites-available/新域名.conf
sudo ln -s /etc/nginx/sites-available/新域名.conf /etc/nginx/sites-enabled/新域名.conf
sudo nginx -t && sudo nginx -s reload
# 禁用站点(保留配置)
sudo rm /etc/nginx/sites-enabled/新域名.conf
sudo nginx -s reload
第四部分:数据库备份与还原
备份服务 mysql-backup 基于 Debian + MySQL 客户端,定时将数据库 dump 到宿主机磁盘。
4.1 备份服务说明
| 项目 | 说明 |
|---|---|
| ⏰ 执行时间 | 每天凌晨 3:00(北京时间,可自定义 cron 表达式) |
| 📦 备份方式 | mysqldump --single-transaction(保证数据一致性) |
| 🗜️ 压缩格式 | gzip 压缩 |
| 🗑️ 保留策略 | 最近 7 天,自动清理旧文件 |
| 🕐 时区 | Asia/Shanghai(北京时间 UTC+8) |
| 📂 存储位置 | ./docker/backup/db_库名_日期时间.sql.gz |
4.2 启动备份服务
docker compose up -d # 随所有服务一起启动
docker compose up -d --build mysql-backup # 单独构建启动
首次启动会立即执行一次备份,之后按定时任务自动执行。
4.3 手动操作
docker exec gmm-mysql-backup backup.sh # 立即备份
ls -lh docker/backup/ # 查看备份文件
docker exec gmm-mysql-backup ls -lh /backup/ # 容器内查看
4.4 自定义配置
编辑 docker-compose.yml 中 mysql-backup 服务的环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
CRON_SCHEDULE | 0 3 * * * | 备份周期(cron 表达式,北京时间) |
RETENTION_DAYS | 7 | 备份保留天数 |
TZ | Asia/Shanghai | 容器时区 |
cron 表达式示例:0 3 * * *(每天3点)、0 3,15 * * *(每天3点和15点)、0 */6 * * *(每6小时)、30 2 * * 0(每周日2:30)
4.5 还原数据库
推荐 — 通过备份容器还原:
docker exec -it gmm-mysql-backup sh
ls -lh /backup/ # 查看可用备份
restore.sh /backup/db_general_management_20260616_030000.sql.gz
快速 — 一句话还原(无确认):
docker exec gmm-mysql-backup sh -c \
"gunzip -c /backup/db_general_management_20260616_030000.sql.gz | \
mysql -h mysql -u root -p\${DB_PASS:-root} \${DB_NAME:-general_management}"
⚠️ 还原操作会覆盖数据库中的所有现有数据,请谨慎操作!
第五部分:日常使用 & 故障排查
5.1 WSL 日常操作
| 操作 | 命令 |
|---|---|
| 进入 Ubuntu | wsl(Windows 终端/PowerShell) |
| 退出 Ubuntu | exit 或 Ctrl+D |
| 关闭 WSL(省内存) | wsl --shutdown |
| 查看 WSL 状态 | wsl -l -v |
| 启动 Docker | sudo service docker start |
| 前端开发 | 在 Windows 终端用 npm run dev:mp-weixin |
Docker 服务不会随 WSL 自动启动。首次进入 Ubuntu 后若
docker compose报连接错误,先执行sudo service docker start。可添加到
~/.bashrc实现自动启动:echo 'sudo service docker start 2>/dev/null' >> ~/.bashrc
5.2 网络说明
本项目 .wslconfig 启用了 mirrored 镜像网络模式:
- WSL Ubuntu 和 Windows 共享同一个 IP 地址
- 在 Windows 浏览器访问
http://localhost:8000即可访问 WSL 内的 Docker 服务 - 局域网内其他设备可通过 Windows 的局域网 IP 访问,例如
http://192.168.1.100:8000 - 不需要手动配置端口转发(
netsh interface portproxy)
如果未启用 mirrored 模式,WSL 有独立 IP,需用
wsl hostname -I查看 IP 后访问。
5.3 故障排查
Docker 无法连接
sudo service docker status # 检查是否运行
sudo service docker start # 启动
端口无法访问
docker compose ps # 检查容器状态
docker compose logs nginx # 检查日志
WSL 内存占用过高
编辑 %USERPROFILE%\.wslconfig,调低 memory 值(如 2GB),然后 wsl --shutdown 重启。
DNS 解析失败
.wslconfig 中已启用 dnsTunneling=true,若仍有问题,可手动指定国内 DNS:
sudo sh -c 'echo "nameserver 223.5.5.5" > /etc/resolv.conf'
223.5.5.5为阿里云公共 DNS,国内用户也可使用114.114.114.114。
文件性能慢
项目代码在 Windows 文件系统(/mnt/d/...)时,Docker Volume 跨文件系统挂载性能较差。可将项目 clone 到 WSL 内部文件系统:
cd ~
git clone <你的仓库地址> general-member-management
cd general-member-management
docker compose up -d
WSL 内部路径(
/home/xxx/)比/mnt/d/的 IO 性能高 3-5 倍,但文件在 Windows 资源管理器中不可见。
参考
- WSL 官方文档
- Docker Engine 安装指南
- docker/ 目录配置 — Nginx 模板、PHP Dockerfile、备份脚本