[alibaba/nacos]用docker compose部署时,无法使用服务名连接nacos

2024-07-18 384 views
9

你好, 我的nacos是用docker compose部署的,命名为dkc-nacos,文件局部内容如下: version: '3.0' services: dkc-nacos: image: nacos/nacos-server:2.0.3 ports: - "8848:8848"

我期望的bootstrap 如下(局部): spring.cloud.nacos.config.server-addr=dkc-nacos:8848

但实际上这样无法连接nacos,报错信息如下: com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused) at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187)

只有写死ip才能正常连接: spring.cloud.nacos.config.server-addr=192.168.11.22:8848

请问,这个问题如何解决呢?


回答

1

@onewe 你好, 假如我的nacos部署在192.168.11.22上的, 这台机器的hostname是aaa, 我需要在bootstrap中添加一个kv, hostname=aaa, 请问是这个意思吗?

我详细查看了这个链接,里面没有提及, 麻烦您帮我确认一下呢 https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

2

@welldo2017 example: docker-compose.yaml

version: '3'
services:
  nacos:
    hostname: nacos
    image: nacos/nacos:${NACOS_VERSION}
    environment:
      - MODE=standalone
      - PREFER_HOST_MODE=hostname
  web:
    image: app:${APP_VERSION}
    depends_on:
      - nacos

bootstrap.yaml

spring:
  application:
    name: test
  cloud:
    nacos:
      server-addr: nacos:8848
6

Hi @welldo2017

我不知道理解得对不对,你在应用中想用机器主机名称或者容器名称来代替ip,如果应用与nacos服务器不在同部主机的话应该是不行的,要域名才行。如果应用是部署在同部主机的docker下面,我不知道在docker-compose文件中设置hostname是不是就可以。

3

@william-xu @onewe 你好。 是的,我想用“容器名:port”替代 “ip:port”, 因为我的环境比较多,所以,如果用ip:port方式去连接nacos,那么每去一个新环境,就会修改bootstrap文件, 所以我想用“容器名:port”, 并且compose也支持这么做。

详见链接中 https://docs.docker.com/compose/gettingstarted/ step1的cache = redis.Redis(host='redis', port=6379) 和step3的

version: "3.9"
services:
  redis:
    image: "redis:alpine"

我的其他服务之间相互访问,也是在application文件中使用上述的方式“容器名:port”,一切正常。 当链接nacos时,需要写在bootstrap中,就无法连接了,困扰了我好几天。

我今天突然反应过来,nacos支持的hostname,是硬件机器的hostname, 而不是容器名这种仅仅dockerCompose支持的“假hostname”。 所以,我应该在bootstrap中写“hostname:port”