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

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
  • 用容器IP172.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:35:59