学完这篇,你能把跑在宝塔面板上的 PHP 站点(以 Clara BBS 为例)连代码带数据库搬进 Docker 容器,并且知道迁移过程中哪些地方最容易出事。
第一步:先在宝塔侧把东西盘清楚
Docker 迁移不是"复制粘贴",先把家底列出来,缺一样后面都得返工。
- PHP 版本:宝塔「网站 → 站点 → 设置 → PHP 版本」看一眼。Clara BBS 支持 PHP 7.4–8.5,尽量在容器里用同版本,跨大版本升级留到迁移完成之后再做,别一次动两个变量。
- PHP 扩展:同页面「扩展」列表截图。这个系统实际会用到的通常是
pdo_mysql、gd、mbstring、fileinfo、curl、exif、zip,开了 Redis 缓存的话再加 redis。
- 站点文件:
/www/wwwroot/你的站点目录,重点是上传目录和安装时生成的数据库配置文件。
- 数据库:
mysqldump 导出,别用宝塔的"备份"按钮直接拿 zip,统一用 SQL 文件最省事。
mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 库名 > /www/backup/clara_$(date +%F).sql
cd /www/wwwroot/你的站点目录 && tar czf /www/backup/clara_files.tar.gz .
注意:一定要加 --default-character-set=utf8mb4,否则中文帖子标题和正文可能在导入后变问号,这类乱码回滚起来很痛苦。
第二步:写 Dockerfile 装扩展
Clara BBS 无框架纯 PHP、不需要 Composer、也没有编译缓存,这对容器化是巨大利好——不用 composer install、不用预热缓存,代码目录挂载进去就能跑。唯一要自己动手的是扩展。
FROM php:8.2-fpm-alpine
RUN apk add --no-cache libpng-dev libjpeg-turbo-dev freetype-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install pdo_mysql gd exif \
&& pecl install redis && docker-php-ext-enable redis
构建:docker build -t clara-php:8.2 .
第三步:docker-compose 编排四件套
services:
php:
build: .
volumes:
- ./www:/var/www/html
restart: always
nginx:
image: nginx:alpine
ports: ["80:80", "443:443"]
volumes:
- ./www:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on: [php]
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 换成长密码
MYSQL_DATABASE: 库名
volumes: ["./mysql:/var/lib/mysql"]
restart: always
redis:
image: redis:alpine
restart: always
nginx.conf 里 fastcgi_pass php:9000;——容器之间用服务名互访,不要再写 127.0.0.1。
注意:上传目录必须单独封死 PHP 执行,否则图片马能直接跑起来:
> location ~* /(uploads|data)/.*\.(php|phtml|php5)$ { deny all; }
>
第四步:导数据、改配置、跑起来
docker compose up -d
docker compose exec -T db mysql -uroot -p密码 库名 < /www/backup/clara.sql
tar xzf /www/backup/clara_files.tar.gz -C ./www
然后把站点里保存数据库连接信息的那个配置文件打开,把 host 从 127.0.0.1 改成 db,Redis 的 host 改成 redis。密码用第二步 compose 里设的那个。
权限也要对:php:8.2-fpm-alpine 里跑的是 www-data,UID 是 82。
chown -R 82:82 ./www
第五步:验证与计划任务
先用 IP 或临时域名访问,重点看四件事:首页能否打开、发一帖能否成功、附件能否上传、后台能否登录。这四项过了再切正式域名。系统保存即生效、无需清缓存,所以改配置不用重启容器,改完刷新即可,只有动了扩展才需要 docker compose restart php。
计划任务这块,Clara BBS 支持前台访问懒触发,也有 /cron 精准入口。流量起来后建议在宿主机加 crontab,而不是塞进容器:
* * * * * curl -s https://你的域名/cron > /dev/null
注意:别把域名解析切过去之后才发现 HTTPS 没配——这个系统的环境体检会检查协议层和安全响应头,迁移完去后台点一次「环境体检」,比肉眼排查快得多。另外源站 IP 变了,Nginx 的证书路径、伪静态规则都要跟着搬,别只搬了代码。
小结
- 迁移前先盘点:PHP 版本、扩展列表、站点文件、数据库 SQL,四样缺一不可。
- 这套系统无框架、无 Composer、无编译缓存,容器化只需处理扩展,用官方
php:8.2-fpm-alpine 自己装就行。
- 容器间用服务名通信,
127.0.0.1 在 compose 里是错的。
- 上传目录必须在 Nginx 层禁掉 PHP 执行。
- 计划任务放宿主机调
/cron,别放容器里跟业务抢资源。
- 先 IP 验证再切域名,切完跑一次后台环境体检。