今天将一个项目中的部分子系统部署,部署到虚拟机的docker里运行,结果外部无法访问。查看nacos,显示服务已经成功注册。
后来发现,该服务的IP地址外部无法访问:
估计172.17.0.0是docker自身的网段,在上面跑的程序,注册到nacos,直接就用到了docker里的地址。因为对于应用程序来说,docker是容器,就是一个操作系统。解决办法是,在虚拟机的宿主机上添加对该地址的路由。我的虚拟机装在windows下,即在windows里添加路由。
操作步骤:
一、查看虚拟机的ip情况
运行命令:ip addr,得到
二、宿主机上添加路由
C:\Users\cq>route add -p 172.17.0.0/16 192.168.144.128
操作完成!
注意地址来自于虚拟机的ip信息。172.17.0.0/16,说明该IP的子网掩码为16位,172.17.0.0是子网地址,172.17.0.255是该子网的广播地址。192.168.144.128是虚拟机对外地址。见步骤一。
如果要删掉该路由,就是
route delete 172.17.0.0
如此,搞定矣。
参考文章:
Windows访问Linux虚拟机里面的Docker容器
2023.04.23
三、一劳永逸的做法
创建docker容器的时候,指定用主机网络模式
--network=host
例如:
docker run -d --network=host --name app-demo registry.cn-hangzhou.aliyuncs.com/zhengqing/app-demo
这样注册到nacos,用的就是主机的地址,而不是docker地址。
参考文章:
运维(10) 解决Nacos服务注册使用Docker容器内网ip问题(指定注册ip或–network=host)
2023.05.10
但是方案三是有问题的,不一定能成功。因为使用host模式,意味着docker容器直接居于宿主机网络,完全暴露于宿主机,安全性和区隔性都被削弱;更重要的是,应用程序需要使用的端口有可能已经被占用,从而导致无法运行。最好的办法,还是添加路由,或者需要注册到nacos的其他容器,与nacos共享网络配置,即–net=container:nacos;如果nacos不在同一台机器,可以看看overlay模式。详见拙作:
采用docker部署时kafka共享zookeeper的网络配置