Docker Compose启动时producer、consumer连接localhost:9042被拒原因
问题原因
你遇到的连接报错本质是不同运行环境下localhost指向的网络范围不同:
- 用IntelliJ本地跑producer、consumer时,程序跑在你电脑主机的网络空间里,此时
localhost指向的是你的主机本身。你在docker-compose中已经把cassandra的9042端口、kafka的29092端口映射到了主机对应端口,所以本地程序可以正常访问。 - 把producer、consumer放到docker-compose中作为容器运行时,每个容器都有独立的网络命名空间,容器内部的
localhost指向的是容器本身,不是你的主机,也不是其他服务的容器。你的producer、consumer容器内部并没有运行cassandra服务,自然会报localhost:9042连接被拒绝的错误。
两种运行方式的核心差异
- 本地运行:程序共享主机网络,所有docker端口映射到主机的服务都可以通过
localhost:映射端口访问 - Docker Compose运行:所有服务默认加入同一个Docker自定义网桥,容器之间可以直接用docker-compose中定义的服务名作为域名互相访问,不需要走主机端口映射;此时每个容器的
localhost仅指向自身,无法访问其他容器的服务。
修复方案
你需要修改producer、consumer的配置适配Docker内部的网络规则,这里提供两种可选方案:
方案1:直接修改application.yml配置
- Cassandra连接配置:添加
contact-points配置为docker-compose中cassandra的服务名cassandra,端口保持9042不变即可(cassandra容器内部默认暴露9042端口)spring: data: cassandra: contact-points: cassandra # 新增这行 port: 9042 # 其余原有配置保持不变 - Kafka连接配置:把
bootstrap-servers从localhost:29092改为kafka-1:9092,走Docker内部网络访问kafka服务,29092是映射给主机用的端口,容器内部访问用9092即可spring: kafka: producer: bootstrap-servers: kafka-1:9092 admin: properties: bootstrap.servers: kafka-1:9092 # 其余原有配置保持不变
方案2:用Docker环境变量覆盖配置(兼顾本地+Docker两种运行场景)
如果不想修改配置文件,同时保留本地运行的兼容性,可以直接在docker-compose的producer、consumer服务中添加环境变量覆盖对应配置即可:
producer: image: spring/producer links: - cassandra depends_on: - cassandra - kafka-1 restart: always # 新增环境变量 environment: SPRING_DATA_CASSANDRA_CONTACT_POINTS: cassandra SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka-1:9092 consumer: image: spring/consumer links: - cassandra depends_on: - cassandra - kafka-1 restart: always # 新增环境变量 environment: SPRING_DATA_CASSANDRA_CONTACT_POINTS: cassandra SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka-1:9092
内容的提问来源于stack exchange,提问作者safa aytan
相关产品推荐
相关产品推荐

