Docker Compose 部署 LAMP 最简方式是直接运行 docker-compose up -d,使用官方镜像(如 php:8.2-apache、mysql:8.0),注意 PHP 连 MySQL 时 host 必须用服务名(如 mysql)而非 localhost;推荐生产用 Nginx + PHP-FPM 组合,需正确配置 fastcgi_pass 和监听端口;Composer 应在构建阶段安装并处理权限;环境变量须通过 .env 文件和 environment 字段透传,避免硬编码;务必显式设置时区(如 TZ=Asia/Shanghai、MYSQL_TIME_ZONE='+08:00')。
直接跑 docker-compose up -d 就能拉起 Apache + PHP + MySQL,比手动写 Dockerfile 快得多,也更贴近生产常用模式。官方镜像维护及时,php:8.2-apache 已预装 mysqli、pdo_mysql、opcache 等扩展,不用自己编译。
常见错误是 PHP 应用连不上 MySQL:不是因为端口没映射,而是容器内 PHP 代码里写的数据库 host 写成了 localhost 或 127.0.0.1 —— 容器网络里必须用服务名,比如 mysql(对应 docker-compose.yml 中的 service 名)。
$host 值一致php.ini 文件若需自定义,挂载到 /usr/local/etc/php/php.ini
/var/www/html,源码挂载路径要对齐version: '3.8'
services:
web:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:Apache 自带 PHP 模块的方式在容器里不够灵活,尤其要调优或加扩展时。换成 Nginx + PHP-FPM 是主流选择:Nginx 负责静态文件和反向代理,PHP-FPM 独立进程管理 PHP 请求,资源隔离更好,日志也分开,出问题容易定位。
关键点在于 Nginx 配置里 fastcgi_pass 必须指向 PHP-FPM 容器的服务名和端口,例如 php-fpm:9000;而 PHP-FPM 容器默认监听的是 9000 TCP 端口(不是 Unix socket),否则 Nginx 连不上会报 502 Bad Gateway。
php:8.2-fpm,别用 cli 或 apache
root 和 index 要匹配挂载路径和入口文件名www.conf 中 listen = 9000 且未注释把 composer install 放进 docker-compose.yml 的 command 或启动脚本里,会导致每次容器重启都重装,既慢又可能失败。正确做法是在构建阶段就装好:Dockerfile 里 COPY composer.json 和 composer.lock,再 RUN composer install --no-dev --optimize-autoloader。
另一个坑是权限:宿主机用户 UID 和容器内 www-data 不一致时,vendor/ 目录可能被创建成 root 所有,导致 PHP-FPM 进程读不了。解决方案是构建时指定用户,或在 Dockerfile 末尾加 RUN chown -R www-data:www-data /var/www/html/vendor。
volume 挂载整个项目后才跑 composer install
--no-dev 和 --optimize-autoloader 必须加上,减小镜像体积并提升加载速度/root/.composer/
硬编码数据库密码或 API Key 到 docker-compose.yml 里极不安全。Docker Compose 原生支持 .env 文件读取变量,但仅限于 compose 文件本身的占位符(如 ${DB_PASSWORD})。PHP 应用本身读不到这些——得靠 environme 字段透传,或挂载
nt.env 文件到容器内供应用加载。
更稳妥的做法是:用 docker-compose.override.yml 分离开发/生产配置,再配合 phpdotenv 在 PHP 中读取。注意 phpdotenv 默认只读 .env,如果挂载路径是 /var/www/html/.env,就得在代码里显式指定路径,否则加载失败却无报错。
docker-compose.yml,统一走 .env 文件.env 到容器时,确认 PHP 应用有权限读取该路径实际部署时最容易忽略的是时区和 locale。PHP 容器默认是 UTC,date() 和 strftime() 行为会和预期不符;MySQL 容器若没设 MYSQL_TIME_ZONE,也可能导致时间字段解析异常。这两个必须在 compose 文件里显式配好:TZ=Asia/Shanghai 和 environment: MYSQL_TIME_ZONE: '+08:00'。
# mysql
# php
# word
# html
# js
# json
# docker
# composer
# apache
# nginx
# 编码
# 架构
# gateway
# date
# mysqli
# var
# copy
# 数据库
# unix
# 镜像
# 的是
# 加载
# 容器内
# 会报
# 连不上
# 是在
# 容器里
# 就能
# 能在
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理
Win10怎么设置开机密码_Windows10账户登录密码设置与取消
如何从 Go 的 map[string]interface{} 中安全获取值
如何在 Go 应用中实现自动错误恢复与进程重启机制
Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】
Win11输入法选字框不见了怎么办_Win11输入法修复与重置【教程】
Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】
Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】
php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】
如何使用Golang安装API文档生成工具_快速生成接口文档
C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】
c++如何使用std::bind绑定函数参数_c++ 占位符std::placeholders使用【详解】
如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例
php嵌入式需要什么环境_搭建php+linux嵌入式开发环境【详解】
Python文件和流处理指南_高效读写大体积数据文件
Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】
c++ nullptr与NULL区别_c++11空指针规范
Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】
Win11怎么开启移动热点_Windows11共享网络给手机设置教程
Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】
C++友元类使用场景_C++类间协作设计方式讲解
Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】
如何使用正则表达式批量替换重复的“-”模式为固定字符串
Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Windows 11怎么更改锁屏超时时间_Windows 11电源选项中设置屏幕关闭时间
Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】
Win11怎么关闭搜索历史_Win11清除任务栏搜索记录【隐私】
c++输入输出流 c++ cin与cout格式化输出【方法】
Python大文件处理策略_内存优化说明【指导】
mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】
Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值
PythonPandas数据分析教程_数据清洗与处理技巧
Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】
如何使用Golang benchmark测量函数延迟_统计执行耗时
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】
Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程
Win11怎么关闭小组件_Win11禁用任务栏天气与小组件方法【设置】
Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
Golang如何避免指针逃逸_Golang逃逸分析与堆栈优化策略
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
Bpmn 2.0的XML文件怎么画流程图
Python对象生命周期管理_创建销毁解析【教程】
如何使用Golang处理静态文件缓存_提高页面加载速度
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
Win11怎么设置屏保_Windows 11屏幕保护程序开启与设置【详解】
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。