多Docker Compose部署:前端无法解析后端容器域名求助
解决Docker容器间网络域名解析失败(getaddrinfo EAI_AGAIN)问题
问题原因
你遇到的getaddrinfo EAI_AGAIN my-app-nginx错误,本质是前后端容器不在同一个Docker网络中:
- 你手动创建了
internal-network外部网络,后端docker-compose.yml中声明该网络为external: true,所以后端容器会加入这个预先创建的网络。 - 但前端
docker-compose.yml中重新定义了internal-network(指定driver: bridge和name),这会导致Docker为前端项目创建一个同名但独立的新网络,前后端容器处于隔离网络,自然无法通过容器名互相解析。
解决方案
1. 修改前端docker-compose.yml的网络配置
将前端的网络配置改为和后端一致,声明使用已存在的外部网络,而非重新创建:
version: '3.9' services: nextjs: build: ... container_name: my-app-nextjs restart: always ports: - 3000:3000 networks: - internal-network networks: internal-network: external: true
2. 重新部署前端服务
执行以下步骤确保网络和容器状态正确:
- 进入前端目录,停止并移除当前前端容器:
docker-compose down - 确认外部网络存在(不存在则重新创建):
# 检查网络列表 docker network ls # 若没有internal-network则创建 docker network create internal-network - 重启后端容器(确保后端在目标网络中):
cd ../backend && docker-compose up -d - 启动前端容器:
docker-compose up -d
3. 验证连通性
进入前端容器,尝试ping后端容器名,确认解析正常:
docker exec -it my-app-nextjs ping my-app-nginx
补充说明
- 容器间通信使用容器名/服务名即可,无需映射到主机的端口(比如前端请求用
http://my-app-nginx/wp-json/v1/enpoint即可,若Nginx内部监听80端口,无需指定8080,除非你的Nginx配置将API路由到了8080端口)。 - 多个
docker-compose项目共享同一个外部网络时,所有容器都能通过服务名/容器名互相访问,这是Docker跨项目网络通信的标准方式。
内容的提问来源于stack exchange,提问作者middlelady
相关产品推荐
相关产品推荐

