本文仅对单注册中心起作用,多注册中心会出现只有一个服务注册成功的问题
目前:
非容器化部署:
微服务注册到eureka,实例id是默认是 “主机名称:服务名称:服务端口号”,
如果配置eureka.instance.prefer-ip-address=true则实例id为 “主机Ip:服务名称:服务端口号”
容器化部署:
containerId:服务名:端口号
当使用dockerfile重新部署时,将会删除旧容器,生成新容器,containerId变化,同名的服务就多一个实例如d1deb75f7aed:test:8080,并且被删除的容器实例d2b59f32b427:test:8080不下线
期望:
1:单注册中心时,注册为{主机名称:服务名称:服务端口号}或{主机Ip:服务名称:服务端口号}
多注册中心时,注册为{主机Ip:服务名称:服务端口号}
解决方法:
指定容器网络模式为host(使用主机的网络)
docker run -d --name rms --net host cm/rms:latest
- –net=bridge— 默认选项,用网桥的方式来连接docker容器。
- –net=host— docker跳过配置容器的独立网络栈。
- –net=container:NAME_or_ID— 告诉docker让这个新建的容器使用已有容器的网络配置。
- –net=none— 告诉docker为新建的容器建立一个网络栈,但不对这个网络栈进行任何配置,所以只能访问本地网络,没有外网。
出现问题:docker ps的时候看不到端口号
2.让停掉的容器服务下线
方法一:通过api强制下线
方法二:自定义实例id,后启动的实例覆盖掉先启动的同名实例
spring.application.name=rms
server.port=8080
eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true
实例的Id相同,就不会因为containerId变化导致的实例id不同,让实例一直增加。