如何访问Docker容器中运行的Laravel项目?配置端口后仍无法访问
问题排查与解决
一、Apache配置问题(80端口访问失败)
你的Dockerfile里设置Apache工作目录为/var/www/html,但docker-compose把本地目录挂载到了/var/www,还将容器工作目录改成了/var/www。Apache默认从/var/www/html加载网站内容,现在Laravel在/var/www,Apache找不到入口文件public/index.php,自然访问失败。
解决方法二选一:
- 调整挂载路径:修改docker-compose.yml,把本地目录挂载到
/var/www/html,同步调整工作目录:services: dw2_apache_php: # 保留原有其他配置 working_dir: /var/www/html volumes: - .:/var/www/html - 修改Apache站点配置:在Dockerfile中添加内容,让Apache指向Laravel的
public目录(Laravel的入口目录),同时启用路由需要的重写模块:# 替换默认Apache站点配置 RUN echo "<VirtualHost *:80> DocumentRoot /var/www/public <Directory /var/www/public> AllowOverride All Require all granted </Directory> </VirtualHost>" > /etc/apache2/sites-available/000-default.conf # 启用mod_rewrite RUN a2enmod rewrite
二、Laravel Artisan Serve(8000端口访问失败)
你只是给php artisan serve设置了别名,但容器启动后默认运行的是Apache,不会自动启动这个命令。另外,就算手动启动,php artisan serve默认只监听127.0.0.1,容器外部根本访问不到。
解决方法二选一:
- 容器启动时自动运行:在docker-compose.yml中添加
command字段,覆盖默认的Apache启动命令:
注意:这样容器只会运行artisan serve,Apache会被停止。services: dw2_apache_php: # 保留原有其他配置 command: php artisan serve --host=0.0.0.0 --port=8000 - 手动进入容器启动:执行
docker exec -it dw2_apache_php bash进入容器,再运行php artisan serve --host=0.0.0.0 --port=8000,之后就能通过localhost:8000访问。
三、权限问题(常见隐形坑)
本地目录挂载到容器后,Laravel的storage和bootstrap/cache目录需要Apache或PHP进程有写入权限,否则会出现500错误或页面加载失败。
解决方法:进入容器执行以下命令:
chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache chmod -R 775 /var/www/storage /var/www/bootstrap/cache
四、验证步骤
- 重新构建镜像:
docker-compose build - 启动容器:
docker-compose up -d - 查看容器日志排查报错:
docker-compose logs dw2_apache_php - 测试访问:用Apache就访问
localhost:80,用artisan serve就访问localhost:8000
内容的提问来源于stack exchange,提问作者Mauricio Silva Batista
相关产品推荐
相关产品推荐

