Docker-Compose部署Laravel多服务容器通信及代理报错排查
Laravel多服务Docker部署问题排查方案
1. 容器间IP访问超时(cURL error 28)
- 确认容器归属的Docker网络:执行
docker inspect <容器名> | grep Networks,三个容器必须在同一Compose默认网络(通常是<项目目录名>_default),否则无法互通。 - 检查服务器防火墙/安全组:云服务器安全组、本地iptables或ufw可能默认拦截了Docker内部网段的流量,需要放行容器所在子网的入出站规则。
- 替换容器IP为服务名访问:Docker Compose自带DNS解析,在容器内用
curl http://menu_service/api/xxx替代IP访问,避免IP变动或网络策略限制。 - 查看网络配置细节:执行
docker network inspect <网络名>,确认子网、网关无冲突,容器都已正确加入网络。
2. localhost:9001/api/xxx返回403 Forbidden
- 检查Laravel目录权限:容器内执行
chown -R www-data:www-data /var/www/html,确保storage、bootstrap/cache目录归Web服务器用户所有,权限不足会触发403。 - 核对Apache配置规则:查看
apis.conf和httpd.conf,确认/api路径没有Require all denied这类限制规则,同时确保mod_authz_core模块已启用。 - 查看Apache错误日志:容器内查看
/var/log/apache2/error.log,日志会明确指出403的触发原因(比如目录索引禁用、.htaccess限制、文件权限不足)。 - 验证端口映射:执行
docker ps确认menu_service的端口映射是0.0.0.0:9001->80/tcp,避免端口冲突或映射配置错误。
3. 域名访问出现Proxy Error
- 检查反向代理配置:域名对应的Nginx/Apache虚拟主机配置中,代理目标必须正确指向
localhost:9000(apis容器的映射端口),不能写错端口或地址。 - 测试代理服务器到本地端口的连通性:在代理服务器上执行
curl localhost:9000/api/xxx,如果请求失败,说明端口不通或容器未正常启动。 - 查看代理服务器错误日志:比如Nginx的
/var/log/nginx/error.log或Apache的proxy_error.log,日志会给出具体错误(如连接被拒绝、超时、目标地址不可达)。 - 确认容器内Web服务器监听地址:检查Dockerfile或
httpd.conf,确保Apache监听0.0.0.0:80而非127.0.0.1,否则容器外部无法访问服务。
额外优化建议
- 容器间通信优先用服务名而非IP,避免容器重启后IP变化导致的连接问题。
- 服务器环境中,针对Docker默认网段(通常是172.17.0.0/16或自定义子网)开放防火墙规则,确保内部流量正常。
- 对比本地与服务器的配置文件,确认部署时没有遗漏或修改关键配置项(如虚拟主机规则、代理路径)。
内容的提问来源于stack exchange,提问作者Mikko
相关产品推荐
相关产品推荐

