Docker网络服务无法访问问题咨询及原因排查
多服务Docker部署问题分析与解决方案
问题场景
项目包含2个后端服务、2个MongoDB实例和1个前端服务,通过Docker Compose部署,配置如下:
version: '3.8' services: service1-mongo: image: mongo:4.4 container_name: service1-mongo ports: - "27001:27017" volumes: - service1-mongo-data:/data/db networks: default: ipv4_address: 172.20.1.2 service2-mongo: image: mongo:4.4 container_name: service2-mongo ports: - "27002:27017" volumes: - service2-mongo-data:/data/db networks: default: ipv4_address: 172.20.1.3 service1: image: service1:latest container_name: service1 ports: - "8083:8083" environment: SPRING_DATA_MONGODB_URI: mongodb://service1-mongo:27017/db02 depends_on: - service1-mongo networks: default: ipv4_address: 172.20.1.4 service2: image: service2:latest container_name: service2 ports: - "8082:8082" environment: SPRING_DATA_MONGODB_URI: mongodb://service2-mongo:27017/iAutoService01 depends_on: - service2-mongo networks: default: ipv4_address: 172.20.1.5 app_frontend: image: app_frontend:latest container_name: app_frontend ports: - "3001:80" # Map port 3001 on host to port 80 on container networks: default: ipv4_address: 172.20.1.6 volumes: service1-mongo-data: service2-mongo-data: networks: default: external: name: dev-network
运行后遇到以下问题:
- 用
service1:8083/api/v1/auth访问时出现Error: getaddrinfo ENOTFOUND service1 - 用容器IP
172.20.1.4:8083/api/v1/auth访问超时 localhost:8083/api/v1/auth可正常访问- 前端容器请求后端仅
localhost可用,但触发CORS错误
原因分析
- 容器名称仅内部DNS可解析:Docker的内置DNS服务只在容器所属的Docker网络(这里是
dev-network)内生效,宿主机、浏览器等外部环境无法识别service1这类容器服务名称,导致解析失败。 - 后端服务监听范围限制:如果Spring Boot应用默认配置了
server.address=localhost,服务只会监听容器内部的127.0.0.1接口,外部(包括宿主机和同网络的其他容器)无法通过容器IP访问,进而出现超时。 - 浏览器同源策略触发CORS:前端运行在
localhost:3001,后端在localhost:8083,端口不同属于不同源,浏览器的同源策略会拦截跨源请求,触发CORS错误。
解决方法
1. 修复容器名称解析与IP访问问题
- 修改后端监听地址:在Spring Boot的配置文件(如
application.properties或application.yml)中添加server.address=0.0.0.0,让服务监听容器的所有网络接口,确保外部能通过容器IP或端口映射访问。 - 容器内部用服务名称访问:前端容器内部请求后端时,直接使用
service1:8083或service2:8082,因为同属一个Docker网络,内置DNS可以正常解析这些服务名称。 - 外部访问用端口映射地址:宿主机或浏览器访问后端时,统一使用
localhost:8083(对应service1)或localhost:8082(对应service2),这是Docker端口映射提供的合法外部访问路径。
2. 解决CORS错误
- 后端配置CORS规则:在Spring Boot服务中添加CORS配置,允许前端来源的请求。示例代码如下:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:3001") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true); } }
- 反向代理统一同源(可选):使用Nginx做反向代理,将前端和后端映射到同一个域名的不同路径,比如
http://localhost/api指向后端,http://localhost/指向前端,避免跨源问题。
3. 优化Docker Compose配置(可选)
- 移除手动指定的
ipv4_address,Docker会自动分配网络IP,手动指定易引发网络冲突,增加维护成本。 - 确认
dev-network已创建,可通过docker network ls查看,若不存在则执行docker network create dev-network创建。
内容的提问来源于stack exchange,提问作者Sam Fisher
相关产品推荐
相关产品推荐

