PHP网站容器化部署需用Docker Compose编排Nginx+PHP-FPM+MySQL,统一目录结构(src/、nginx/conf.d/、php/Dockerfile等),PHP-FPM镜像基于php:8.2-fpm构建并显式启用OPcache,Nginx通过服务名php:9000反向代理,数据库host须设为db,初始化SQL挂载至/docker-entrypoint-initdb.d/。

PHP网站容器化部署不是简单打包镜像,关键在于服务协同、路径对齐和配置显式化。用 Docker Compose 编排 Nginx + PHP-FPM + MySQL 是当前最稳妥的标准化路径,既贴近生产实际,又便于本地开发与 CI/CD 对齐。
统一项目结构,明确职责边界
从一开始就规范目录组织,避免后期挂载混乱或配置错位:
- src/:只放 PHP 源码(如 index.php、vendor/、.env),不混入配置或构建文件
-
nginx/conf.d/default.conf:Nginx 虚拟主机配置,重点设好
root /var/www/html和fastcgi_pass php:9000 - php/Dockerfile:专用于构建 PHP-FPM 镜像,不耦合 Web 服务器
- docker-compose.yml:定义三服务网络、卷挂载、依赖顺序和环境变量
- .env:存放数据库密码、APP_ENV 等敏感或可变参数,不提交到 Git
用 PHP-FPM 镜像构建应用层,不走 Apache 一体包
官方 php:8.2-fpm 镜像轻量稳定,扩展安装可控,适合分层部署:
- 基础扩展用
docker-php-ext-install pdo mysqli opcache,顺序不能颠倒(pdo 必须在 pdo_mysql 前) - OPcache 启用需两步:编译后执行
docker-php-ext-enable opcache,再通过RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini显式开启 - 挂载代码时用只读模式:
volumes: - ./src:/var/www/html:ro,防止运行时意外修改 - 权限处理加一句
RUN chown -R www-data:www-data /var/www/html,尤其在 macOS/Windows 下挂载后默认属主为 root
用 Nginx 容器反向代理,通信靠服务名而非 IP
Nginx 和 PHP-FPM 是两个独立容器,必须通过 Docker 内网通信:
立即学习“PHP免费学习笔记(深入)”;
- 在
docker-compose.yml中为三个服务声明同一自定义网络(如app-network) - Nginx 配置中写
fastcgi_pass php:9000,其中php是 PHP 服务在 compose 中定义的 service 名,不是 localhost 或 127.0.0.1 - PHP-FPM 容器内确认监听 TCP:检查
/usr/local/etc/php-fpm.d/www.conf中listen = 9000未被注释,且listen.allowed_clients = 0.0.0.0/0(或删掉该行,默认允许) - Nginx 容器无需暴露 9000 端口,只需映射 80/443 到宿主机
MySQL 连接与初始化要符合容器网络逻辑
PHP 应用连数据库失败,90% 是因为写错了 host:
- PHP 代码中数据库 host 必须写成
db(或你在 docker-compose.yml 中定义的 MySQL service 名),不是localhost或127.0.0.1 - MySQL 初始化 SQL 放在
./init.sql,通过volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro挂载,确保首次启动自动建库建表 - 在 PHP 服务的
environment或.env中透传数据库连接参数,避免硬编码 - 用
depends_on仅控制启动顺序,不保证 MySQL 已就绪;可在 PHP 启动脚本里加重试逻辑(如循环执行mysqladmin ping -h db -u root --password=$MYSQL_ROOT_PASSWORD)



















