Docker-Compose部署Nginx代理时提示upstream 'frontend:80'主机未找到
Nginx代理容器无法解析frontend上游主机问题排查
问题场景
尝试用Docker Compose搭建Nginx代理容器,指向另一个运行Nginx的frontend前端容器,两者各有独立配置文件,但代理容器启动时出现上游主机找不到的错误。
配置文件
docker-compose.yml
version: '3' services: frontend: restart: always hostname: frontend build: context: ./demo-project healthcheck: test: ["CMD-SHELL", "wget -qO- http://frontend/ping || exit 1"] interval: 1s timeout: 3s retries: 30 networks: demo-net: aliases: - frontend proxy: hostname: proxy build: context: ./nginx dockerfile: Dockerfile depends_on: frontend: condition: service_healthy ports: - "80:80" networks: demo-net: aliases: - proxy networks: demo-net: driver: bridge
Nginx代理容器default.conf
upstream frontend_servers { server frontend:80; } server { listen 80; server_name localhost; location / { proxy_pass frontend_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
Nginx代理容器Dockerfile
FROM nginx:latest COPY ./default.conf /etc/nginx/conf.d/default.conf
错误信息
[emerg] 1#1: host not found in upstream "frontend:80" in /etc/nginx/nginx.conf:26 nginx: [emerg] host not found in upstream "frontend:80" in /etc/nginx/nginx.conf:26
已尝试操作
- 手动创建Nginx容器加入
demo_demo-net网络,进入容器执行ping frontend能成功解析 - 用Docker Compose生成的镜像手动运行,仍出现相同错误
- 已给frontend容器添加健康检查,状态显示为健康
疑问点
是否是代理容器在连接到网络前就尝试解析frontend主机导致的问题?
问题原因及解决方法
核心原因
Nginx启动时会强制解析所有上游服务器的IP,即便frontend容器健康检查通过,若Docker网络的DNS解析未完成、或代理容器自身网络初始化未完成,就会触发该错误。
解决方法
方法1:修改Nginx配置,允许上游解析失败后重试
在upstream块中添加Docker内置DNS地址和超时配置,让Nginx不直接崩溃,后续自动重试解析:
upstream frontend_servers { server frontend:80; resolver 127.0.0.11 valid=30s; # Docker默认内置DNS服务器 fail_timeout 5s; }
方法2:给代理容器添加启动前验证脚本
修改代理容器的Dockerfile,新增启动脚本,先确认frontend可访问再启动Nginx:
FROM nginx:latest COPY ./default.conf /etc/nginx/conf.d/default.conf COPY ./start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh CMD ["/usr/local/bin/start.sh"]
创建start.sh脚本:
#!/bin/bash # 循环等待frontend可访问 until curl -s http://frontend:80/ping; do echo "等待frontend服务就绪..." sleep 2 done # 启动Nginx nginx -g "daemon off;"
方法3:调整Docker Compose网络配置
在proxy服务中添加links配置辅助DNS解析(v3版本仍可生效):
proxy: # 其他配置不变 links: - frontend:frontend
验证要点
- 执行
docker network inspect demo_demo-net,确认两个容器在同一网络内 - 进入frontend容器执行
wget -qO- http://frontend/ping,验证健康检查的有效性
内容的提问来源于stack exchange,提问作者wavor
相关产品推荐
相关产品推荐

