凌晨把站点从宝塔面板搬到 Docker 的 40 分钟

11 月 15 日凌晨两点,我把跑了 11 个月的宝塔面板整机迁到 Docker Compose,起因是面板升级后 PHP 8.1 与 Nginx 的 fastcgi 超时配置被覆盖,日志里出现 502 报错 37 次。做法是先用 docker-compose 编排 nginx、php-fpm、mysql 三个容器,把站点目录挂载为卷,再把原 /www/wwwroot 下的静态资源 rsync 到新目录,MySQL 用 mysqldump 导出 214MB 后导入,最后用 cloudflared tunnel 替换原来的 frp 映射。过程中踩了两个坑:php-fpm 容器内的 user 权限与宿主 uid 不一致导致上传目录写入失败,改成 1000:1000 后解决;另外 mysql 的 8.0 认证插件让旧站点连接报错,加 --default-authentication-plugin=mysql_native_password 才通。迁移后首屏 TTFB 从 480ms 降到 260ms,面板内存占用少了 180MB。结论是容器化对单机小站收益主要在可复现,不是性能,配置写进 compose 文件比面板点选更省心。

11 月 15 日凌晨两点,我把跑了 11 个月的宝塔面板整机迁到 Docker Compose,起因是面板升级后 PHP 8.1 与 Nginx 的 fastcgi 超时配置被覆盖,日志里出现 502 报错 37 次。做法是先用 docker-compose 编排 nginx、php-fpm、mysql 三个容器,把站点目录挂载为卷,再把原 /www/wwwroot 下的静态资源 rsync 到新目录,MySQL 用 mysqldump 导出 214MB 后导入,最后用 cloudflared tunnel 替换原来的 frp 映射。过程中踩了两个坑:php-fpm 容器内的 user 权限与宿主 uid 不一致导致上传目录写入失败,改成 1000:1000 后解决;另外 mysql 的 8.0 认证插件让旧站点连接报错,加 --default-authentication-plugin=mysql_native_password 才通。迁移后首屏 TTFB 从 480ms 降到 260ms,面板内存占用少了 180MB。结论是容器化对单机小站收益主要在可复现,不是性能,配置写进 compose 文件比面板点选更省心。

相关实践 →