Docker构建PHP+Apache环境修改VirtualHost端口后连接失败求助
问题分析与解决
你遇到的核心问题是:Apache服务并未实际监听8000端口。虽然修改了VirtualHost配置和Docker相关映射,但php:5.6-apache镜像默认仅监听80端口,未修改Apache全局监听配置的情况下,服务不会切换到8000端口提供服务,导致容器内curl连接被拒绝。
解决步骤
1. 修改Apache监听端口配置
需要修改Apache的ports.conf文件,将默认的监听端口从80改为8000。在你的Dockerfile中添加以下指令:
# 替换Apache监听端口为8000 RUN echo "Listen 8000" > /etc/apache2/ports.conf
将这条指令放在COPY ./site.conf /etc/apache2/sites-available/000-default.conf之后即可。
2. 移除Dockerfile中无效的重启命令
Dockerfile中的service apache2 restart指令在构建镜像时执行,但容器启动时会重新以apache2-foreground启动服务,这条指令毫无意义,建议删除并调整为:
# 仅启用rewrite模块即可 RUN a2enmod rewrite
3. 重新构建并启动容器
执行以下命令重新构建镜像并启动服务:
docker-compose build app docker-compose up -d
验证与检查
1. 确认Apache监听端口
进入容器查看Apache实际监听的端口:
docker-compose exec app bash root@xxx:/var/www# netstat -tulpn | grep apache2
正常输出应包含:::8000,表示Apache已成功监听8000端口。
2. 测试服务可用性
再次在容器内执行curl测试:
curl -l http://localhost:8000/phpinfo.php
此时应能正常返回phpinfo内容。
3. 检查容器日志
如果仍有问题,查看容器日志排查配置错误:
docker-compose logs app
重点关注Apache启动时的报错信息,比如配置文件语法错误。
额外优化建议
site.conf中的ServerName localhost:8000可以简化为ServerName localhost,ServerName用于域名匹配,端口由监听配置控制,无需在ServerName中指定。- 确保容器内的
/var/www/public_html/cake/目录存在且权限正确,避免因文件路径问题导致的404错误。
内容的提问来源于stack exchange,提问作者Kazuhiko Harada
相关产品推荐
相关产品推荐

