You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器名称作为访问地址

  1. 确保主应用、Nginx、邮件微服务容器处于同一个Docker网络(默认bridge网络或自定义网络均可)。
  2. 修改Axios的baseURL为Nginx容器的名称(假设Nginx容器名为nginx-service):
    axios.defaults.baseURL = 'http://nginx-service';
    
  3. 修改Nginx配置中的上游服务地址,将localhost:4040替换为邮件微服务的容器名称(假设邮件微服务容器名为email-service):
    upstream microservice_email {
        server email-service:4040;
    }
    

方法2:用宿主机IP地址

  1. 找到宿主机在Docker网络中的IP(可通过docker inspect bridge查看,或直接用宿主机局域网IP)。
  2. 修改Axios的baseURL为宿主机IP:
    axios.defaults.baseURL = 'http://192.168.x.x'; // 替换为你的宿主机实际IP
    
  3. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:32:26