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反向代理(生产环境推荐)
- 在前端容器的Nginx配置中添加反向代理规则,将
/api路径转发到后端容器:
location /api { proxy_pass http://backend:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
- 前端代码中使用相对路径发起请求,如
/api/v1/,浏览器会将请求发送到前端的443端口,由Nginx自动转发到后端。 - 确认所有容器已加入同一个自定义Docker网络(当前已满足,三个容器均在
custom_network中)。
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

