直接用docker-compose up -d启动需先确保镜像构建、服务编排和环境适配三步闭环:写好dockerfile安装必要php扩展并设工作目录;用docker-compose.yml编排app、web、db、redis服务且共用网络;正确配置.env中db_host=db、redis_host=redis等服务名地址;最后按build→启db/redis→run artisan命令→up -d顺序验证。

直接用 docker-compose up -d 启动即可,但前提是配置已就绪。核心不是“怎么运行”,而是“怎么让容器跑起来不报错”——关键在镜像构建、服务编排和环境适配三步闭环。
写好 Dockerfile 定义 PHP 运行环境
它决定你的 Laravel 能不能启动。别用裸镜像,要装齐扩展并设好工作路径:
- 基础镜像选
php:8.2-fpm-alpine(轻量)或php:8.2-apache(开箱即用) - 必须安装:
pdo_mysql(数据库)、mbstring(多字节字符串)、gd(图像处理)、exif(图片元数据) - 复制代码进容器:
COPY . /var/www/html,并设为工作目录:WORKDIR /var/www/html - 安装依赖:
RUN composer install --no-dev --optimize-autoloader(生产环境用) - 暴露端口:
EXPOSE 9000(fpm)或EXPOSE 80(apache)
用 docker-compose.yml 编排整套服务
单个 PHP 容器跑不起来 Laravel,它需要 Web 服务器、数据库、缓存协同工作:
-
app 服务:基于你写的 Dockerfile 构建,挂载代码(开发时用
volumes),声明依赖db和redis -
web 服务:用
nginx:alpine,挂载自定义nginx.conf,把请求转发给app:9000 -
db 服务:用
mysql:8.0,设置MYSQL_ROOT_PASSWORD和MYSQL_DATABASE -
redis 服务:用
redis:7-alpine,默认暴露 6379 端口 - 所有服务共用同一网络,靠服务名互通(如 app 里连 db,地址就是
db)
改对 .env 才能连上数据库和 Redis
这是最常踩的坑:容器内没有 localhost,只有服务名。不改就一直报“Connection refused”:
-
DB_HOST=db(不是 127.0.0.1,也不是 localhost) -
DB_PORT=3306(保持默认,除非你显式改了 mysql 的端口映射) REDIS_HOST=redis-
APP_URL=http://localhost:8000(开发时可这样,上线需改成真实域名) - 改完执行
docker-compose run --rm app php artisan config:clear刷新配置
启动与验证四步走
别一上来就 up -d,按顺序做更稳:
- 构建镜像:
docker-compose build(检查 Dockerfile 是否有语法错误) - 启动依赖服务:
docker-compose up -d db redis(先确保库和缓存就绪) - 进容器装依赖 & 初始化:
docker-compose run --rm app composer install,再运行php artisan key:generate和php artisan migrate - 全栈启动:
docker-compose up -d,然后curl -I http://localhost或浏览器打开验证











