php与数据库容器化部署需解耦、可复现、环境一致:数据库须独立容器运行,用docker compose定义php-fpm、db、nginx三服务,通过服务名通信;敏感配置外置,php镜像精简,非root运行,数据持久化与初始化分离,健康检查保障依赖就绪,网络隔离确保安全。

PHP 应用与数据库容器化部署的核心是解耦、可复现和环境一致性。关键不在于“能不能跑”,而在于“如何稳定、安全、易维护地运行”。
数据库独立容器,不与 PHP 同容器
MySQL 或 PostgreSQL 必须单独运行在专属容器中(如 mysql:8.0 或 postgres:15),而非与 PHP-FPM 打包进同一个镜像。共容器会违反单一职责原则,导致升级困难、日志混乱、资源争抢,且无法横向扩展数据库。
- 使用 Docker Compose 定义服务:一个
php-fpm服务 + 一个db服务 + 一个nginx(或 caddy)反向代理服务 - 数据库容器通过
networks与 PHP 容器互通,PHP 代码中连接地址写成db(即服务名),端口保持默认(3306/5432) - 敏感配置(如 DB_PASSWORD)从
.env文件或 Docker secrets 注入,不硬编码进镜像
PHP 镜像精简可靠,优先用官方基础镜像
避免基于 Ubuntu/Alpine 自建大而全的 PHP 环境。推荐直接使用 php:8.2-apache 或 php:8.2-fpm-alpine,再按需安装扩展(pdo_mysql、opcache、gd 等)。
- Dockerfile 中用
docker-php-ext-install安装扩展,不用apt-get混装,减少漏洞面 - 生产环境禁用
display_errors和expose_php,通过php.ini-production基础配置加固 - 应用代码以非 root 用户(如 www-data)运行,避免容器内提权风险
数据持久化与初始化分离处理
数据库文件必须挂载到宿主机或命名卷(named volume),否则容器重启后数据丢失;但初始化 SQL(如建库、建表、导入种子)不能靠每次启动执行,应通过初始化脚本或专用 init 容器完成。
SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板
立即学习“PHP免费学习笔记(深入)”;
- MySQL 容器支持
/docker-entrypoint-initdb.d/目录自动执行.sql或.sh脚本,仅在首次初始化时触发 - 已有数据迁移场景,用
mysqldump导出 +mysql导入,或通过docker exec -i db mysql -u root -p dbname - 应用启动前加健康检查(如
curl -f http://php-app/health或mysqladmin ping),确保依赖就绪再启动
网络与安全边界清晰可控
默认 bridge 网络足够开发与中小规模生产使用,但需显式控制访问关系:Nginx 可访问 PHP,PHP 可访问 DB,DB 不暴露给 Nginx 或外部网络。
- 在 docker-compose.yml 中设置
expose:(仅内部端口)而非ports:(对外映射),让 DB 完全隔离 - PHP 容器不映射 9000 端口到宿主机,由 Nginx 通过
fastcgi_pass php-fpm:9000内网通信 - 如需远程管理 DB,启用专用 adminer/phpmyadmin 容器,并配强密码或反向代理加 Auth
不复杂但容易忽略:环境变量名大小写、时区设置(TZ=Asia/Shanghai)、字符集统一(MySQL utf8mb4 + PHP PDO charset=utf8mb4)、以及每次修改 compose 配置后执行 docker-compose down -v 清理旧卷再 up。










