Docker-Compose部署Golang应用遇Nginx 502连接拒绝问题求助
问题分析与解决方案
从Nginx错误日志connect() failed (111: Connection refused)可以明确:Nginx能解析到credit_server的容器IP(172.20.0.5),但无法连接到目标端口8080,核心原因是Golang应用在容器内未正确监听可外部访问的地址,或端口配置不匹配。
1. 检查Golang应用的监听地址
本地运行正常但容器内无法访问,大概率是应用代码中监听了127.0.0.1:8080,而非0.0.0.0:8080。127.0.0.1仅允许容器内部localhost访问,Docker网络中的其他服务(如Nginx)无法连接。
修改代码中的监听逻辑:
// 错误写法:仅本地可访问 http.ListenAndServe("127.0.0.1:8080", router) // 正确写法:允许所有网络接口访问 http.ListenAndServe("0.0.0.0:8080", router)
2. 验证容器内应用的端口监听状态
进入credit_server容器,检查应用是否真的在8080端口监听:
# 进入容器 docker-compose exec credit_server sh # 安装netstat(若容器内无此命令) apk add net-tools # 查看端口监听情况 netstat -tulpn | grep 8080
如果没有输出,说明应用未启动成功或未监听8080端口,需检查:
- 启动命令是否正确(Dockerfile中的
CMD参数是否匹配应用要求) - 配置文件
config.yml中的端口是否设置为8080 - 容器内应用日志:执行
docker-compose logs credit_server查看启动日志,排查是否有启动失败或端口配置错误
3. 确认Docker网络连通性
在Nginx容器内测试与credit_server的8080端口连通性:
docker-compose exec nginx sh # 测试TCP连接 nc -zv credit_server 8080
若连接失败,回到前两步排查应用监听问题;若连接成功,检查Nginx配置是否存在其他问题(如路径匹配错误)。
4. 补充Docker-Compose配置(可选)
虽然同一Docker网络内服务无需暴露端口,但为了便于本地调试,可在credit_server服务中添加端口映射:
credit_server: build: context: .. dockerfile: ${PROJECT_DIR}/deployments/Dockerfile args: BUILD_APP_NAME: credit-server depends_on: credit_service_db: condition: service_healthy ports: - "8080:8080" # 本地可直接访问容器内8080端口,便于调试
内容的提问来源于stack exchange,提问作者Evgeniy Michurin
相关产品推荐
相关产品推荐

