前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 Docker 部署的微服务在 Nacos 里注册成内网地址 导致无法微服务间互相调用的解决方案

使用 Docker 部署的微服务在 Nacos 里注册成内网地址 导致无法微服务间互相调用的解决方案

作者头像
张云飞Vir
发布2022-03-24 08:43:34
3.3K0
发布2022-03-24 08:43:34
举报
文章被收录于专栏:写代码和思考写代码和思考

使用 Docker 部署的微服务在 Nacos 里注册成内网地址 导致无法微服务间互相调用的解决方案

遇到问题:

一般情况下,微服务采用docker部署,通常默认采用 bridge 桥接的网络模式,docker 会自动分配一个 172.x.x.x 这样的私有内网地址,存在这样的难题:

  • 由于是 172开头的内部网络地址, 在本机的docker 内是可以访问,而 跨主机 就无法访问。
  • 在使用了nacos 后,nacos 里注册的服务地址是 172 开头的,导致 微服务间调用失败。

解决方法:

1. 采用 host 模式

创建出来的容器没有独立ip,无法产生网络隔离的效果,它占用宿主机的IP。

注意:docker 在 linux 系统 下才支持 host 模式。mac 无法使用,我在这里坑半天。

2. 采用 bridge模式,做端口映射

将 容器的端口号 映射到 宿主机的端口号,在被访问时通过宿主机的IP和端口来访问。

在 使用 springcloud微服务时,单个服务在向注册中心注册的时候可以指定注册ip,这样就不会自动注册成 docker 容器的私有ip。

在 Nacos 下配置: 使用的是nacos注册中心,指定 spring.cloud.nacos.discovery.ip = 宿主机的IP,这样注册到 Nacos 的微服务ip就是这里指定的宿主机IP 了,在Nacos里显示是宿主机的IP, 进行服务间访问的时候也是用这个ip,就不会出现无法访问了。

关键是:

spring.cloud.nacos.discovery.ip = 宿主机的IP

扩展知识

在使用docker run创建Docker容器时,可以用--network标志 选项指定容器的网络模式,Docker有以下4种网络模式:

  • host模式:使用 --net=host 指定。
  • bridge模式:使用 --net=bridge 指定,默认设置。
  • none模式:使用 --net=none 指定。

host模式

host模式类似于Vmware的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022.02.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遇到问题:
  • 解决方法:
    • 1. 采用 host 模式
      • 2. 采用 bridge模式,做端口映射
      • 扩展知识
        • host模式
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档