Docker入门:通过docker-compose.yml运行PHP脚本失败求助
咱们一步步排查问题,找到为什么访问localhost看不到预期的Hello World:
1. 确认容器运行状态
先检查所有服务是否正常启动:
docker-compose ps
你需要确保web、mysql、phpmyadmin三个容器的状态都是Up。如果有容器状态是Exit或者Restarting,查看对应容器的日志找问题:
# 查看web容器(PHP-Apache)的日志 docker-compose logs web # 如果是数据库容器有问题,查看mysql日志 docker-compose logs mysql
2. 验证目录映射是否正确
你的目录结构是:
-app -public_html -index.php -docker-compose.yml
必须在app目录下执行docker-compose up -d,否则./public_html/会映射到你执行命令所在目录的public_html,而不是app下的。
可以进入web容器验证文件是否存在:
docker exec -it web bash # 进入容器后,查看/var/www/html下的文件 ls /var/www/html # 查看index.php内容 cat /var/www/html/index.php
如果看不到index.php或者内容不对,说明目录映射路径错误,确保在docker-compose.yml所在的目录执行启动命令。
3. 检查端口占用情况
本地的80端口可能被其他服务(比如本地Apache、Nginx、IIS)占用,导致Docker容器的80端口无法正常映射。
检查端口占用:
- Linux/macOS:
lsof -i :80
- Windows:
netstat -ano | findstr ":80"
如果发现有其他进程占用80端口,可以:
- 停止本地占用80端口的服务;
- 或者修改
docker-compose.yml中web服务的端口映射,比如改成:
ports: - "8081:80" - "443:443" - "32823:22"
然后重启服务:
docker-compose down && docker-compose up -d
之后访问localhost:8081试试。
4. 确认PHP脚本无语法错误
虽然你的脚本很简单,但还是要确保index.php的内容完全正确,没有多余的空格或者字符:
<?php echo 'Hello World !'; ?>
如果有语法错误,因为你设置了PHP_DISPLAY_ERRORS=1,浏览器应该会显示错误信息,你可以根据错误提示修复。
5. 检查Apache是否正确解析PHP
webdevops/php-apache-dev镜像默认已经配置好PHP解析,但如果还是有问题,可以在容器内测试PHP是否能正常运行:
# 在web容器内执行PHP命令行测试 docker exec -it web php -r "echo 'Hello World !';"
如果这个命令能输出Hello World !,说明PHP本身没问题,问题可能出在Apache的配置或者文件权限上。
另外提个小优化:在Docker Compose 3版本中,links已经是过时的用法,推荐使用depends_on来定义服务依赖,不过这不会影响你当前的PHP脚本运行(因为你的脚本没用到数据库),可以把web服务的配置改成:
services: web: # ... 其他配置 ... depends_on: - mysql
内容的提问来源于stack exchange,提问作者Dominik Malik

