Docker容器中Axios请求出现ECONNREFUSED 127.0.0.1:80错误排查
Docker容器内Axios请求同主机其他容器API失败问题
我在本地机器的Docker容器中运行搭配Nginx的Node.js应用,使用Axios向同主机不同容器内的API发送POST请求。非容器化开发环境下一切正常,但容器化后Axios报错:
AxiosError: connect ECONNREFUSED 127.0.0.1:80 port: 80, address: '127.0.0.1', syscall: 'connect', code: 'ECONNREFUSED', baseURL: 'http://localhost', method: 'post', url: '/microservice/email/api/send', data: {some data here}
尝试访问另一个独立容器的API端点(Nginx通过proxy_pass转发到localhost:4040)时也出现相同错误。我的Nginx配置大致如下:
upstream microservice_email { server localhost:4040; } server { gzip on; gzip_static on; gunzip on; gzip_types .... (为简洁已移除,包含所有MIME类型); client_max_body_size 5000M; listen [::]:80; server_name localhost; location / { proxy_pass http://localhost:8080; # 主应用运行在8080端口,Docker已暴露该端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location /microservice/email/ { proxy_pass http://microservice_email/; proxy_set_header content-type "application/json"; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
使用Postman等REST客户端通过相同Nginx配置发送POST请求可正常发送邮件,但从主应用容器内用Axios请求时,因上述错误无法建立连接。直接用IP 127.0.0.1发送请求也失败,返回:
org.apache.http.conn.HttpHostConnectException: 连接到127.0.0.1:80失败:Connection refused: 无更多信息
问题原因
容器内的localhost和127.0.0.1指向容器自身,而非宿主机或其他容器。主应用容器里请求localhost:80其实是访问自己容器的80端口,而该端口未运行对应服务,导致连接被拒绝。
解决方法
方法1:用Docker容器名称作为访问地址
- 确保主应用、Nginx、邮件微服务容器处于同一个Docker网络(默认bridge网络或自定义网络均可)。
- 修改Axios的baseURL为Nginx容器的名称(假设Nginx容器名为
nginx-service):axios.defaults.baseURL = 'http://nginx-service'; - 修改Nginx配置中的上游服务地址,将
localhost:4040替换为邮件微服务的容器名称(假设邮件微服务容器名为email-service):upstream microservice_email { server email-service:4040; }
方法2:用宿主机IP地址
- 找到宿主机在Docker网络中的IP(可通过
docker inspect bridge查看,或直接用宿主机局域网IP)。 - 修改Axios的baseURL为宿主机IP:
axios.defaults.baseURL = 'http://192.168.x.x'; // 替换为你的宿主机实际IP - 确保Docker容器端口已正确映射到宿主机,且防火墙允许容器访问宿主机对应端口。
方法3:用Docker主机内部DNS(仅Linux环境)
Linux下Docker提供特殊DNS名称host.docker.internal指向宿主机,修改Axios的baseURL:
axios.defaults.baseURL = 'http://host.docker.internal';
同时Nginx配置中的上游服务地址可替换为host.docker.internal:4040(适用于邮件微服务运行在宿主机或已映射端口到宿主机的场景)。
内容的提问来源于stack exchange,提问作者volume one
相关产品推荐
相关产品推荐

