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

Docker容器间请求出现ERR_ADDRESS_UNREACHABLE错误的排查与解决

Docker前端容器无法访问后端容器:问题分析与解决方案

问题描述

在VPS上部署了三个Docker容器:Spring后端、Angular前端和Postgres数据库,采用Docker内部IP网络实现容器间通信。Spring后端访问Postgres数据库(IPv4地址:172.24.0.4/16)一切正常,但前端向Spring后端(IPv4地址:172.24.0.2/16)发起请求时返回错误:

GET https://172.24.0.2:8080/api/v1/ net::ERR_ADDRESS_UNREACHABLE

Docker网络信息

[
    {
        "Name": "custom_network",
        "Id": "3baf05ce8f75a01362969f91e78c57d0cfa79722d7072575202e12375a7b9174",
        "Created": "2023-04-25T09:13:50.877460737+03:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.24.0.0/16",
                    "Gateway": "172.24.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "397c9c4e3a0db97d01f6a1caec7badfd5c9d4c9bb41d12a11db3c4959ea9154d": {
                "Name": "backend",
                "EndpointID": "0b61ce825a240de60606be6abf0f8be4f943b9f8b0e7a2834c0ee72b0281c842",
                "MacAddress": "02:42:ac:18:00:02",
                "IPv4Address": "172.24.0.2/16",
                "IPv6Address": ""
            },
            "c35305b9272d42332475964c6556c7236290b8c05cce67185b74cdca6012a412": {
                "Name": "postgres",
                "EndpointID": "7baf108af5f4e8ebf437a3365de8c5a75235b184d627159138cfbdba560d4793",
                "MacAddress": "02:42:ac:18:00:04",
                "IPv4Address": "172.24.0.4/16",
                "IPv6Address": ""
            },
            "fe3d07eb78c02717b9b816852a13280652eca0bc593d48746292fe6d0fb11c22": {
                "Name": "frontend",
                "EndpointID": "f702828c1ceede8585fd4f33feaac544da2f706734dd88c5543c9a5cb291fd4c",
                "MacAddress": "02:42:ac:18:00:03",
                "IPv4Address": "172.24.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "custom",
            "com.docker.compose.version": "2.15.1"
        }
    }
]

容器列表

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                       NAMES
556baf78f70a   angular    "nginx -g 'daemon of…"   14 minutes ago   Up 14 minutes   0.0.0.0:443->80/tcp, :::443->80/tcp         info-pet-angular_app-1
a2d516c5ec0d   backend   "java -jar backend.j…"   43 minutes ago   Up 43 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   info-pet-app-1
55b067ff2ad2   postgres              "docker-entrypoint.s…"   6 hours ago      Up 6 hours      5432/tcp                                    infopet-postgres

核心问题原因

  • 请求发起方误解:前端的HTTP请求是从用户本地浏览器发起的,而非前端容器内部。Docker的172.24.0.0/16子网是VPS内部的私有网络,用户浏览器无法直接访问该子网内的IP。
  • 协议不匹配:请求使用https协议,但后端容器暴露的8080端口默认是HTTP服务,即使能访问也会出现协议兼容错误。

解决方案

方案一:通过VPS公网IP/域名访问后端

  • 修改前端代码中的请求地址为https://<VPS公网IP>:8080/api/v1/(若后端未配置HTTPS,需改为http)。
  • 确保VPS的防火墙/安全组已开放8080端口的入站规则。

方案二:使用Docker容器名称通信(仅容器内部场景适用)

如果是前端容器内部的服务(如SSR渲染)需要调用后端,可直接用容器名称代替IP:

  • 将请求地址改为http://backend:8080/api/v1/,Docker自定义网络会自动解析容器名称到对应内部IP。

方案三:配置Nginx反向代理(生产环境推荐)

  1. 在前端容器的Nginx配置中添加反向代理规则,将/api路径转发到后端容器:
location /api {
    proxy_pass http://backend:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
  1. 前端代码中使用相对路径发起请求,如/api/v1/,浏览器会将请求发送到前端的443端口,由Nginx自动转发到后端。
  2. 确认所有容器已加入同一个自定义Docker网络(当前已满足,三个容器均在custom_network中)。

内容的提问来源于stack exchange,提问作者Kirill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:48:23