Docker本地同容器两PHP站点无法跨站本地请求问题排查
问题根因
- 浏览器能正常访问两个本地测试域名,是因为宿主机hosts文件配置了
website-A-local、website-B-local到127.0.0.1的映射,请求通过宿主机80端口转发到Apache容器。但PHP代码运行在独立的php容器内部,容器默认DNS解析中没有这两个域名的记录,请求无法路由到目标服务,PHP未开启错误提示时就会表现为静默失败。 - 现有
links配置仅为php容器添加了apache、epicor-web-local两个主机别名,和代码中使用的本地域名不匹配,无法完成解析。 - 替换为生产环境地址能正常加载,是因为公网DNS可正常解析生产域名,请求链路通畅,也反向证明PHP的远程文件加载相关配置处于开启状态。
- 单Apache实例配置多虚拟主机托管两个站点的场景下,即使解析通了,如果Apache虚拟主机规则中没有配置对应域名的
ServerName,请求会默认落到第一个虚拟主机上,同样会找不到目标文件。
配置步骤
1. 配置容器内DNS解析
直接修改docker-compose.yml,为Apache服务添加网络别名,Docker内置DNS会自动将别名解析到Apache容器的内部IP,同网络下所有容器都可以直接通过这些别名访问Apache服务,无需手动维护IP映射:
services : # Apache apache : build : '.\docker\apache\' ports : - 80:80 volumes : - ./:/var/www/html/ # 新增以下网络别名配置 networks: default: aliases: - website-A-local - website-B-local # PHP 其余配置保持不变即可 php : build : '.\docker\php\' environment: XDEBUG_CONFIG: remote_host=host.docker.internal remote_port=9003 remote_enable=1 volumes : - ./:/var/www/html/ links: - apache:epicor-web-local expose: - 9003
如果后续新增测试域名,直接在aliases列表下追加即可,重启容器就会生效。
2. 校验Apache虚拟主机配置
确保Apache中两个站点的虚拟主机规则匹配对应域名:
- 托管website-A的VirtualHost块中,
ServerName配置为website-A-local,站点根目录指向A站代码路径 - 托管website-B的VirtualHost块中,
ServerName配置为website-B-local,站点根目录指向B站代码路径
配置完成后重载Apache服务,保证容器内发起带对应Host头的请求时,Apache能正确路由到目标站点,不会返回默认站点的404响应。
3. 校验PHP配置(可选,生产地址可访问时可跳过)
进入php容器检查php.ini配置,确保两个核心开关处于开启状态:
allow_url_fopen = On:保证file_get_contents等函数可以发起远程HTTP请求allow_url_include = On:保证include/require可以加载远程HTTP/HTTPS资源
修改配置后重启php容器生效。开发环境建议同时开启display_errors = On、设置error_reporting = E_ALL,遇到问题不会静默失败,可直接看到错误原因减少排查成本。
4. 重启服务验证
执行命令重启所有容器让配置生效:
docker-compose down && docker-compose up -d
验证链路:进入php容器内部,先测试域名解析是否正常,再测试HTTP请求是否能拿到目标文件内容
# 进入php容器命令行 docker-compose exec php bash # 测试解析,能返回Apache容器IP即为正常 ping website-A-local -c 3 # 测试HTTP请求,能正常返回some-file.php的内容即为链路通畅 curl http://website-A-local/api/some-file.php
验证通过后,PHP代码中的include、file_get_contents等函数就可以正常通过本地域名调用同环境下的跨站资源了。
优化建议
你当前的配置中,Apache和php容器都把本地代码目录挂载到了/var/www/html/,意味着两个站点的代码在php容器内可以直接通过文件系统访问,不需要走HTTP请求加载:
// 直接通过本地文件路径加载,性能远高于HTTP请求,无网络波动、服务重启导致的加载失败问题 include('/var/www/html/path-to-website-A/api/some-file.php');
非必要不推荐用HTTP方式include同环境下的PHP文件,这类请求会走完完整的Web服务处理流程,性能差且稳定性低。
内容的提问来源于stack exchange,提问作者S.Mason
相关产品推荐
相关产品推荐

