nacos使用docker容器进行部署,发现nacos地址是docker网卡的地址。导致ip地址无法访问。
docker内ip地址
官方关于配置介绍
源码分析
- com.alibaba.nacos.sys.env.Constants
-
-
-
- String NACOS_SERVER_IP = "nacos.server.ip";
-
- String IP_ADDRESS = "nacos.inetutils.ip-address";
- com.alibaba.nacos.sys.utils.InetUtils
-
-
- /**
- * Get ip address from environment
- * System property nacos.server.ip
- * Spring property nacos.inetutils.ip-address.
- *
- * @return ip address
- */
- private static String getNacosIp() {
- String nacosIp = System.getProperty(NACOS_SERVER_IP);
- if (StringUtils.isBlank(nacosIp)) {
- nacosIp = EnvUtil.getProperty(IP_ADDRESS);
- }
- if (!StringUtils.isBlank(nacosIp)) {
- if (!(InternetAddressUtil.isIP(nacosIp) || InternetAddressUtil.isDomain(nacosIp))) {
- throw new RuntimeException("nacos address " + nacosIp + " is not ip");
- }
- }
-
- return nacosIp;
- }
-
-
-
-
- /**
- * refresh ip address.
- */
- private static void refreshIp() {
-
- String tmpSelfIp = getNacosIp();
-
- if (StringUtils.isBlank(tmpSelfIp)) {
- tmpSelfIp = getPreferHostnameOverIP();
- }
-
- if (StringUtils.isBlank(tmpSelfIp)) {
- tmpSelfIp = Objects.requireNonNull(findFirstNonLoopbackAddress()).getHostAddress();
- }
-
- if (InternetAddressUtil.PREFER_IPV6_ADDRESSES && !tmpSelfIp.startsWith(InternetAddressUtil.IPV6_START_MARK)
- && !tmpSelfIp.endsWith(InternetAddressUtil.IPV6_END_MARK)) {
- tmpSelfIp = InternetAddressUtil.IPV6_START_MARK + tmpSelfIp + InternetAddressUtil.IPV6_END_MARK;
- if (StringUtils.contains(tmpSelfIp, InternetAddressUtil.PERCENT_SIGN_IN_IPV6)) {
- tmpSelfIp = tmpSelfIp.substring(0, tmpSelfIp.indexOf(InternetAddressUtil.PERCENT_SIGN_IN_IPV6))
- + InternetAddressUtil.IPV6_END_MARK;
- }
- }
- if (!Objects.equals(selfIP, tmpSelfIp) && Objects.nonNull(selfIP)) {
- IPChangeEvent event = new IPChangeEvent();
- event.setOldIP(selfIP);
- event.setNewIP(tmpSelfIp);
- NotifyCenter.publishEvent(event);
- }
- selfIP = tmpSelfIp;
- }
代码分析:
1. 首先查看JVM属性是否配置了nacos.server.ip没有 ;如果有ip地址就是它;
可以通过jvm设置环境变量 来设置本节点nacos的ip
例如:JAVA_OPT=“${JAVA_OPT} -Dnacos.server.ip=你的服务器的ip”
当然在docker compose中也有类似配置
2. 如果1没有满足,则看看配置文件application.properties中有没有属性nacos.inetutils.ip-address=IP地址;
可以在application.properties中直接设置该IP
如果有就是它
3.如果还没有,那判断是否优先使用hostname;preferHostnameOverIp 的判断逻辑是;
先判断JVM属性有没有配置nacos.preferHostnameOverIp=true/false;
如果false,再去判断配置文件application.properties中有没有属性 nacos.inetutils.prefer-hostname-over-ip=true/false;
如果有的话 就优先获取hostname; inetAddress.getHostName();
4. 否则的话 就获取所有网卡中第一个非回环地址 selfIp = findFirstNonLoopbackAddress().getHostAddress();
就是不会找到 127.0.0.1这样的回环地址;
官方文档说明:
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
---|---|---|---|---|
db.num | 数据库数目 | 正整数 | 0 | >= 0.1.0 |
db.url.0 | 第一个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.url.1 | 第二个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.user | 数据库连接的用户名 | 字符串 | 空 | >= 0.1.0 |
db.password | 数据库连接的密码 | 字符串 | 空 | >= 0.1.0 |
spring.datasource.platform | 数据库类型 | 字符串 | mysql | >=1.3.0 |
db.pool.config.xxx | 数据库连接池参数,使用的是hikari连接池,参数与hikari连接池相同,如db.pool.config.connectionTimeout 或db.pool.config.maximumPoolSize | 字符串 | 同hikariCp对应默认配置 | >=1.4.1 |
当前数据库配置支持多数据源。通过db.num
来指定数据源个数,db.url.index
为对应的数据库的链接。db.user
以及db.password
没有设置index
时,所有的链接都以db.user
和db.password
用作认证。如果不同数据源的用户名称或者用户密码不一样时,可以通过符号,
来进行切割,或者指定db.user.index
,db.user.password
来设置对应数据库链接的用户或者密码。需要注意的是,当db.user
和db.password
没有指定下标时,因为当前机制会根据,
进行切割。所以当用户名或者密码存在,
时,会把,
切割后前面的值当成最后的值进行认证,会导致认证失败。
Nacos从1.3版本开始使用HikariCP连接池,但在1.4.1版本前,连接池配置由系统默认值定义,无法自定义配置。在1.4.1后,提供了一个方法能够配置HikariCP连接池。 db.pool.config
为配置前缀,xxx
为实际的hikariCP配置,如db.pool.config.connectionTimeout
或db.pool.config.maximumPoolSize
等。更多hikariCP的配置请查看HikariCP 需要注意的是,url,user,password会由db.url.n
,db.user
,db.password
覆盖,driverClassName则是默认的MySQL8 driver(该版本mysql driver支持mysql5.x)
application.properties配置
cluster.conf配置
dockerfile
docker-compose1.yaml
- version : '3.8'
- services:
- xxxxxx-nacos:
- container_name: xxxxx-nacos
- image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
- environment:
- - MODE=cluster
- - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- - NACOS_SERVER_IP=172.19.86.250
- - TZ=Asia/Shanghai
- volumes:
- - /home/xxxx/nacos/logs:/home/nacos/logs
- - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
- hostname: xxxx-host-nacos
- ports:
- - "8848:8848"
- - "9848:9848"
- - "9849:9849"
- networks:
- - xxxxlocalhost
docker-compose2.yaml
- version : '3.8'
- services:
- xxxxxx-nacos:
- container_name: xxxxx-nacos
- image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
- environment:
- - MODE=cluster
- - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- - NACOS_SERVER_IP=172.19.86.257
- - TZ=Asia/Shanghai
- volumes:
- - /home/xxxx/nacos/logs:/home/nacos/logs
- - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
- hostname: xxxx-host-nacos
- ports:
- - "8848:8848"
- - "9848:9848"
- - "9849:9849"
- networks:
- - xxxxlocalhost
docker-compose3.yaml
- version : '3.8'
- services:
- xxxxxx-nacos:
- container_name: xxxxx-nacos
- image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
- environment:
- - MODE=cluster
- - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- - NACOS_SERVER_IP=172.19.86.251
- - TZ=Asia/Shanghai
- volumes:
- - /home/xxxx/nacos/logs:/home/nacos/logs
- - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
- hostname: xxxx-host-nacos
- ports:
- - "8848:8848"
- - "9848:9848"
- - "9849:9849"
- networks:
- - xxxxlocalhost
结果: