php-fpm容器需显式安装pdo、mbstring等扩展,.env文件必须挂载至php-fpm容器而非nginx,nginx root应设为public目录,redis连接须用service名“redis”而非localhost,storage目录权限需设为www-data。

PHP-FPM 容器里必须装全 Laravel 所需扩展
直接用官方 php:8.1-fpm 镜像跑 Laravel 会报错——Class 'PDO' not found 或 mbstring extension is required 是最常见现象。这是因为基础镜像只含最小 PHP 运行时,没装任何扩展。
你得在 Dockerfile 里显式安装:pdo、pdo_mysql、mbstring、xml、zip、bcmath、opcache、gd、curl。别漏掉 libzip-dev 和 zlib1g-dev,否则 zip 扩展编译失败。
- Ubuntu/Debian 基础镜像用
apt-get install -y装扩展包,再用docker-php-ext-install启用 - 别在容器启动后用
pecl install动态装 redis 扩展——它依赖hiredis,容易因版本不匹配失败;改用docker-php-ext-install redis(PHP 8.0+ 内置)或提前 apt 装php-redis -
opcache.enable=1和opcache.memory_consumption=256必须写进php.ini,否则生产环境性能掉一截
Nginx 容器不能直接读取 Laravel 的 .env 文件
很多人把整个 Laravel 项目目录挂载进 Nginx 容器,结果发现 .env 被直接 HTTP 访问——Nginx 默认不禁止敏感文件,location ~ /\.(env|log|conf)$ 规则必须手动加。
更关键的是:Nginx 本身不解析 .env,它只负责转发请求。Laravel 读取环境变量靠的是 PHP-FPM 容器里的 getenv() 或 $_ENV,所以 .env 文件必须挂载进 PHP-FPM 容器,且路径要和 APP_ENV 指向一致(通常是项目根目录)。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 用
volumes把.env单独挂载到 PHP-FPM 容器的/var/www/html/.env,别挂整个项目目录进 Nginx - Nginx 的
root必须设为/var/www/html/public,不是项目根目录;否则index.php可被直接下载 - 在 Nginx 配置里加
location ~ /\.(env|log|htaccess) { deny all; },防止误暴露
Redis 连接失败大概率是网络或配置没对齐
PHP-FPM 容器连不上 Redis,错误通常是 Connection refused 或 php_network_getaddresses: getaddrinfo failed。这不是 Redis 没启动,而是容器间网络不通或 host 写错了。
Docker Compose 默认为每个 service 创建一个别名,PHP-FPM 容器里应该用 redis 当 host(对应 docker-compose.yml 里 service 名),而不是 localhost 或 127.0.0.1——后者指向容器自己,不是 Redis 容器。
- Laravel 的
REDIS_HOST必须设为redis(service 名),端口保持6379 - 确保
docker-compose.yml中 Redis service 暴露了6379端口,且没加127.0.0.1:前缀(那会限制只本机访问) - PHP-FPM 容器里执行
ping redis或telnet redis 6379,能通才说明网络层没问题
缓存与日志路径权限经常被忽略
容器里运行 php artisan config:cache 或写日志时抛 Permission denied,根本原因是 Laravel 的 storage/ 和 bootstrap/cache/ 目录属主不是 www-data(PHP-FPM 默认用户)。
Docker 镜像默认以 root 启动,但 PHP-FPM 进程降权为 www-data,如果挂载进来的宿主机目录权限是 root:root,它就写不了。
- 构建 PHP-FPM 镜像时,在
Dockerfile末尾加RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache - 或者启动容器时用
user: "www-data",并确保宿主机对应目录权限是775且组为www-data - 别在
docker-compose.yml里用command: ["sh", "-c", "chown ... && php-fpm"]——每次重启都重设权限,效率低还可能冲突
depends_on 配合自定义 healthcheck,不能只靠启动延时。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










