必须使用命名卷挂载确保数据持久化:创建php-app-data卷并挂载到/var/www/html,上传、日志等需分卷管理,备份前须docker pause容器以保证完整性。

在Docker中部署PHP应用时,必须确保代码、上传文件、日志等关键数据不随容器重启或删除而丢失,否则网站图片无法显示、用户注册信息消失、错误日志无从追溯。
创建命名卷并挂载到PHP容器
优先使用命名卷(Named Volume),它由Docker统一管理路径和权限,避免绑定挂载常见的宿主机路径权限错乱、路径硬编码、迁移困难等问题。
执行命令创建卷:docker volume create php-app-data
启动PHP容器时挂载该卷:docker run -d --name php-web -v php-app-data:/var/www/html -p 8080:80 php:8.3-apache
【php-app-data必须与容器内路径严格对应,/var/www/html是Apache默认Web根目录,改错会导致页面403或空白】
验证挂载是否生效:运行docker inspect php-web,在Mounts字段中确认Type为volume、Source为/var/lib/docker/volumes/php-app-data/_data、Destination为/var/www/html。
区分挂载用途:代码 vs 上传文件 vs 日志
单个卷不能混用多种数据类型——上传文件频繁写入会触发日志轮转失败,日志滚动又可能挤占用户上传空间。应按职责拆分:
方法一:代码用绑定挂载(开发调试)→ docker run -v $(pwd)/src:/var/www/html:ro php:8.3-apache,只读挂载保证本地代码实时生效,又防容器内误删。
方法二:上传目录用独立命名卷→ -v php-uploads:/var/www/html/uploads,避免与代码卷耦合,后续可单独备份或限速。
方法三:日志输出到stdout → Apache配置中禁用ErrorLog CustomLog,改用LogLevel info + docker logs php-web统一收集,省去日志卷权限管理麻烦。
备份PHP应用数据卷
第一步:暂停写入。对PHP应用而言,上传接口仍在接收文件,直接打包会导致部分文件不完整。执行docker pause php-web冻结容器状态。
第二步:启动只读临时容器打包:docker run --rm -v php-app-data:/data:ro -v $(pwd)/backups:/backup alpine tar -czf /backup/php-app-$(date +%Y%m%d).tar.gz -C /data .
第三步:解冻容器:docker unpause php-web。这一步不可跳过,否则PHP服务持续不可用。
【若跳过暂停步骤,备份中可能出现零字节上传文件或截断的日志片段,恢复后用户看到的是损坏的图片或500错误】
从备份恢复PHP数据卷
① 创建新卷:docker volume create php-app-data-restored
② 启动解压容器:docker run --rm -v php-app-data-restored:/data -v $(pwd)/backups:/backup alpine tar -xzf /backup/php-app-20260812.tar.gz -C /data
③ 停止原容器:docker stop php-web && docker rm php-web
④ 启动新容器并挂载恢复后的卷:docker run -d --name php-web -v php-app-data-restored:/var/www/html -p 8080:80 php:8.3-apache
验证:访问curl http://localhost:8080/uploads/test.jpg,确认返回HTTP 200且内容正确;进入容器执行ls -l /var/www/html/uploads,检查文件时间戳与备份日期一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











