故障总结
这次不是业务代码故障,核心是本地 Docker 容器的"网络端点状态异常"。
具体表现:
aigc-php-local容器配置里写着加入网络docker-compose-local-aigc_host- 但实际
docker inspect看到NetworkSettings.Networks是空的{},说明容器对象没有真正挂到 Docker 网络 - 因此 PHP 启动时解析不到
redis,在 QueueHelper.php 连接 Redis 直接报错退出 aigc-nginx-local和aigc-node-local也出现了同类问题,所以nginx又解析不到aigc-php-local/aigc-node-local
本质上是:
- 容器"看起来存在"
docker compose ps里也可能显示正常或重启中- 但容器实际没有拿到 compose 网络的 DNS 能力,导致服务名解析失败
这次看到的直接报错
- PHP:
RedisException: php_network_getaddresses: getaddrinfo failed - Nginx:
host not found in upstream "aigc-php-local"
host not found in upstream "aigc-node-local"
快速判断方法
先看容器状态:
powershell
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml ps
再看失败日志:
powershell
docker logs --tail 100 aigc-php-local
docker logs --tail 100 aigc-nginx-local
docker logs --tail 100 aigc-node-local
再看是不是网络端点丢了:
powershell
docker inspect --format '{{json .NetworkSettings.Networks}}' aigc-php-local
docker inspect --format '{{json .NetworkSettings.Networks}}' aigc-nginx-local
docker inspect --format '{{json .NetworkSettings.Networks}}' aigc-node-local
如果输出是 {},基本就可以确定是这类问题。
下次怎么快速修复
优先用最小修复,直接强制重建异常容器:
powershell
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml up -d --force-recreate php
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml up -d --force-recreate node
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml up -d --force-recreate nginx
如果你想一步到位,也可以:
powershell
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml up -d --force-recreate
推荐的排查顺序
- 先看
php日志 - 如果报
redis/mysql/host not found,立刻检查NetworkSettings.Networks - 如果是
{},不要先改代码,先--force-recreate - 然后再看
nginx是否还报 upstream 解析失败 - 最后用接口实测一次
一套最快恢复命令
powershell
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml up -d --force-recreate php node nginx
docker compose -f D:\phpstudy_pro\WWW\zhilin\aigc\docker-compose-local\docker-compose.yaml ps
docker logs --tail 50 aigc-php-local
docker logs --tail 50 aigc-nginx-local
怎么确认已经恢复
看这几个点:
docker compose ps里php/node/nginx都是Updocker inspect --format '{``{json .NetworkSettings.Networks}}' 容器名不再是 `{}``php日志里没有getaddrinfo failednginx日志里没有host not found in upstream- 本地接口能返回
HTTP 200或至少返回业务层错误,而不是容器层错误
一句话记忆
下次如果看到:
getaddrinfo failedhost not found in upstream
先别怀疑代码,先查容器是不是"名义上在网络里,实际上没挂上网络端点";如果是,直接 docker compose up -d --force-recreate 重建对应容器。