我的资料
首页
Linux技术
开发指南
前端技术
快速开始
Gitee
首页
Linux技术
开发指南
前端技术
快速开始
Gitee
  • Linux技术文档

    • Linux 技术文档
    • VSCode SSH远程连接教程
    • LNMP环境安装指南
    • phpMyAdmin 安装与配置
    • ab-test 压力测试
    • Docker Desktop 开发 & 生产部署
    • Docker 静态站点部署指南
    • WSL2 + Docker 本地开发 & 生产部署

WSL2 + Docker 本地开发 & 生产部署

本项目放弃 Docker Desktop,改用 WSL2 + Ubuntu 原生 Docker Engine。

本文档涵盖:本地开发环境搭建、Docker 服务使用、生产环境部署、数据库备份还原。


为什么不用 Docker Desktop?

Docker DesktopWSL2 原生 Docker
收费(企业用户)完全免费
资源占用高(GUI + 后台服务)纯命令行,轻量
更新频繁、偶尔崩溃稳定,和服务器环境一致
镜像加速需在 GUI 中配置直接改 /etc/docker/daemon.json

第一部分:本地开发环境搭建

1.1 Docker 服务概览

本项目 docker-compose.yml 包含以下服务:

服务说明端口绑定地址
nginxNginx 1.25 Web 服务器8000127.0.0.1
phpPHP 8.4-FPM (ThinkPHP 8)9000容器内网
mysqlMySQL 8.0 数据库3306127.0.0.1
redisRedis 7 缓存6379127.0.0.1
phpmyadmin数据库管理面板(可选)8081127.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

配置说明:

配置项值作用
memory4GB限制 WSL 最大内存,防止吃满系统资源
processors4限制 CPU 核心数
swap8GB交换空间大小
networkingModemirrored关键:WSL 与 Windows 共享 IP 地址
dnsTunnelingtrue借用 Windows DNS,解决 WSL 内 DNS 问题
firewalltrueWSL 端口自动被 Windows 防火墙放行
autoProxytrue自动跟随 Windows 代理设置
hostAddressLoopbacktrue关键:允许本机通过局域网 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=mirroredWSL 与 Windows 共享同一个 IP,局域网设备访问 http://<Windows本机IP>:8000 即等于访问 WSL 内的 Nginx
firewall=trueWSL 端口自动向 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 端操作

  1. 打开 HBuilderX
  2. 「文件」→「打开目录」→ 选择 D:\...\frontend-sync\
  3. 「运行」→「运行到小程序模拟器」→「微信开发者工具」
  4. HBuilderX 自动编译并调起微信开发者工具,即可实时预览

在 WSL 中编辑前端代码 → Rsync 自动同步到 Windows → HBuilderX 检测文件变更自动重新编译 → 微信开发者工具热更新预览。

访问地址

服务地址
后端 APIhttp://localhost:8000 或 http://<本机IP>:8000
phpMyAdminhttp://localhost:8081
MySQL127.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
进入 MySQLdocker exec -it gmm-mysql mysql -uroot -proot general_management
查看容器日志docker logs gmm-php -f
重新构建 PHPdocker 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 注意事项

  1. 端口安全 — 容器端口均绑定 127.0.0.1,不暴露公网,由宿主机 Nginx 反代接入
  2. 前端开发 — 前端是微信小程序 uni-app,不运行在 Docker 中。通过 Rsync 将 WSL 中的前端源码同步到 Windows 目录,再由 HBuilderX 调起微信开发者工具进行实时预览,详见 1.7 节
  3. 热重载 — 后端代码通过 Volume 挂载,修改 backend/ 下的文件实时生效,无需重启容器
  4. PHP 扩展 — 编辑 docker/php/Dockerfile 后执行 docker compose build php 重新构建
  5. 编辑 .env 文件 — Docker 配置在 .env;ThinkPHP 配置在 backend/.env(从 .env.example 复制),两个文件都需正确配置
  6. 手动生成 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.conf HTTPS 重定向 + 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_SCHEDULE0 3 * * *备份周期(cron 表达式,北京时间)
RETENTION_DAYS7备份保留天数
TZAsia/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 日常操作

操作命令
进入 Ubuntuwsl(Windows 终端/PowerShell)
退出 Ubuntuexit 或 Ctrl+D
关闭 WSL(省内存)wsl --shutdown
查看 WSL 状态wsl -l -v
启动 Dockersudo 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、备份脚本
最近更新:: 2026/7/22 16:00
Prev
Docker 静态站点部署指南

MIT 许可 © 2026 我的资料

Gitee 仓库  |  快速开始

皖ICP备2026030673号-1
皖公网安备34040002000683号