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

Docker环境下Zipkin连接失败:请求localhost:9411被拒绝

问题:Docker容器中Zipkin无法正常工作,本地运行正常

Zipkin在本地运行正常,但部署到Docker容器后无法正常工作。所有微服务已成功注册到Eureka且通信正常,仅Zipkin出现问题,报错信息如下:

org.springframework.web.client.ResourceAccessException: I/O error on
POST request for "http://localhost:9411/api/v2/spans": Connect to
http://localhost:9411 [localhost/127.0.0.1] failed: Connection refused

我的docker-compose.yaml配置如下:

version: '3.8'

services:
  currency-exchange:
    image: samankt/springboot-udemy-currency-exchange:0.0.1-SNAPSHOT
    mem_limit: 512m
    ports:
      - '8000:8000'
    networks:
      - saman-network  
    environment:
      EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka
      EUREKA.INSTANCE.PREFERIPADDRESS: true  
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      SPRING_RABBITMQ_HOST: rabbitmq
      SPRING_ZIPKIN_SENDER_TYPE: rabbit
    depends_on:
      - naming-server
      - rabbitmq
      
  api-gateway:
    image: samankt/springboot-udemy-currency-api-gateway:0.0.1-snapshot
    mem_limit: 512m
    ports:
      - '8765:8765'
    networks:
      - saman-network  
    environment:
      EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka
      EUREKA.INSTANCE.PREFERIPADDRESS: true  
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      SPRING_RABBITMQ_HOST: rabbitmq
      SPRING_ZIPKIN_SENDER_TYPE: rabbit 
    depends_on:
      - naming-server
      - rabbitmq
      
  currency-converter:
    image: samankt/currency-conversion:0.0.1-SNAPSHOT
    mem_limit: 700m
    ports:
      - '8100:8100'
    networks:
      - saman-network  
    environment:
      EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka
      EUREKA.INSTANCE.PREFERIPADDRESS: true  
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/
      SPRING.ZIPKIN.DISCOVERYCLIENTENABLED: true 
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      SPRING_RABBITMQ_HOST: rabbitmq
      SPRING_ZIPKIN_SENDER_TYPE: rabbit     
    depends_on:
      - naming-server
      - rabbitmq
      
  naming-server:
    image: samankt/naming-server:0.0.1-SNAPSHOT
    mem_limit: 512m
    ports:
      - '8761:8761'
    environment:
      SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/    
    networks:
      - saman-network
      
  zipkin-server:
    image: openzipkin/zipkin:latest
    mem_limit: 400m
    ports:
      - '9411:9411'
    networks:
      - saman-network   
    environment:
      RABBIT_URI: amqp://guest:guest@rabbitmq:5672
    depends_on:
      - rabbitmq
    restart: always
      
      
  rabbitmq:
    image: rabbitmq:3.8.12-management
    ports:
      - '5672:5672'
      - '15672:15672'
    networks:
      - saman-network
    
networks: 
  saman-network:
解决方案

问题根源

报错显示微服务尝试连接http://localhost:9411,但在Docker容器环境中,每个容器都是独立的网络命名空间,localhost指向容器自身而非宿主机的Zipkin服务。尽管你在docker-compose中配置了SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/,但可能存在以下问题:

  • 微服务镜像内部的配置文件硬编码了localhost:9411,覆盖了环境变量的配置
  • currency-converter服务设置了SPRING.ZIPKIN.DISCOVERYCLIENTENABLED: true,可能导致服务发现逻辑优先于指定的base-url,引发连接错误

修复步骤

  1. 清理硬编码配置:检查所有微服务的application.properties或application.yml,删除任何硬编码的spring.zipkin.base-url=http://localhost:9411配置,确保环境变量能正常覆盖。
  2. 调整发现客户端配置:将currency-converter服务的SPRING.ZIPKIN.DISCOVERYCLIENTENABLED改为false,因为已经通过环境变量指定了明确的Zipkin地址,无需通过Eureka发现。
  3. 重启服务集群:修改配置后,若配置是打包在镜像内,需重新构建镜像;然后执行docker-compose down && docker-compose up -d重启所有服务。
  4. 验证网络连通性:进入任意微服务容器,执行curl http://zipkin-server:9411/health,确认能正常访问Zipkin的健康检查接口,验证网络连通性。

额外优化建议

  • 添加服务依赖:在每个服务的depends_on中加入zipkin-server,确保启动顺序合理(注意:depends_on不保证服务就绪,仅保证启动顺序)。
  • 配置Zipkin健康检查:为zipkin-server添加健康检查,确保服务完全就绪后再启动依赖服务,修改后的配置如下:
    zipkin-server:
      image: openzipkin/zipkin:latest
      mem_limit: 400m
      ports:
        - '9411:9411'
      networks:
        - saman-network   
      environment:
        RABBIT_URI: amqp://guest:guest@rabbitmq:5672
      depends_on:
        - rabbitmq
      restart: always
      healthcheck:
        test: ["CMD", "curl", "-f", "http://localhost:9411/health"]
        interval: 10s
        timeout: 5s
        retries: 5
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:45:40