1.搭建eureka docker集群
eureka微服务搭建方法可百度(例如 https://www.cnblogs.com/gudi/p/8645869.html)。这里给出一些eureka在docker 中部署的重要配置。
(1)创建eureka容器
参考如下指令,在不同的服务器上创建eureka容器。(提前在docker hup 上下载好java:8的镜像)
docker run -d --name registry1 -p 8762:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/registry:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always java:8 sh start.sh
docker run -d --name registry1 -p 8762:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/registry:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always java:8 sh start.sh
注意:
-p 8762:8080:该docker 容器网络默认采用桥接方式。对外暴露8762端口。docker 会为容器虚拟一个网卡,在容器内部使用该虚拟IP以及对应端口(8080).若配置 --net=host则使用宿主机的IP及端口。
-w /usr/src/myapp :docker运行各种指令的默认路径
-v /etc/localtime:/etc/localtime:ro :同步系统时间到容器
(2)在jar包挂载点的目录(/usr/local/project/docker/registry)下放一个启动脚本,例如 start.sh 。原因是启动时可以配置各种参数,如堆内存,这两灵活一些。
start.sh
#!/bin/sh
java -Xms128m -Xmx150m -Duser.timezone=GMT+8 -jar app.jar --server.port=8080 --spring.profiles.active=test
--server.port=8080:对应 -p 里的8080端口
-Duser.timezone=GMT+8 :修改jvm的运行时间。因为有时候发现系统时间已同步到容器,容器内部用date命令查时间也对,但是程序内部取时间总是不对,经常是查8个小时。
(2)eureka重要配置参数
之前在将eureka服务放入docker 时遇到一些问题,主要是因为进入容器后环境变了,一些参数需要做出调整。贴出排至参数以供参考。
#eureka服务名称(DS Replicas)
eureka.instance.hostname=registry1
#要注册的集群服务地址
eureka.client.service-url.defaultZone=http://192.168.1.102:8762/eureka/
#重要:注册服务时 指定IP地址
eureka.instance.ip-address=192.168.1.101
#重要:注册服务时手动指定该服务的IP地址
eureka.instance.prefer-ip-address= true
#如下两个参数要配置成ture否则不会被注册
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
#服务名称(Instances currently registered with Eureka)
spring.application.name=spring-cloud-eureka
#指定该eureka注册时对方访问自己时使用的端口号
eureka.instance.nonSecurePort=9001
其他配置参数参考:https://www.jianshu.com/p/e2bebfb0d075 https://www.cnblogs.com/fangfuhai/p/7070325.html
(3)启动服务
成功注册到另一个eureka
获取要注册的目标eureka服务中的微服务注册信息。
2.添加微服务容器并注册到对应eureka
(1)创建docker 容器
这里提供两个创建容器命令,一个是java环境的,提供运行微服务jar包的环境,如安装的了指定版本的jdk。另一个是创建tomcat容器的。
java
docker pull java:8 #下载java8的docker镜像
docker run -d --name member -p 9000:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/member:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always java:8 sh start.sh
注意:
tomcat
docker pull tomcat:8.0.53-jre8 #下载内置jre 8的tomcat运行环境(如果是 tomcat:8的话里面的jre版本是7!!从启动log里可以看出,如果你的程序是居于更高版本的,则你的war包只解压不启动,似乎也没什么提示。。)。
docker run -d -p 9111:8080 --restart=always -v /usr/local/project/docker/tomcat/cms/webapps:/usr/local/tomcat/webapps -v /usr/local/project/docker/tomcat/cms/logs:/usr/local/tomcat/logs -v /etc/localtime:/etc/localtime:ro -e JAVA_OPTS='-Dsome.property=value' -e Xmx=256m --name=cms tomcat:8.0.53-jre8
-e JAVA_OPTS='-Dsome.property=value' -e Xmx=256m :据说这个命令可以限制堆内存。
-v /usr/local/project/docker/tomcat/cms/webapps:/usr/local/tomcat/webapps:设置war包的挂载点。
(2)配置微服务注册eureka参数
eureka.client.service-url.defaultZone=http://192.168.1.101:8762/eureka/
eureka.instance.instance-id=192.168.1.101:9001
eureka.instance.ip-address=192.168.1.101
eureka.instance.prefer-ip-address= true
eureka.instance.nonSecurePort=9001
这里还是要手动指定 通过eureka访问本微服务时使用的IP和端口号。因为咱们的容器使用的是桥接方式,默认情况下,容器里的微服务会自动获取容器内部的ip和端口,而取出来的是docker 容器的虚拟网卡的IP和用户定义的内部端口号,到时别的服务找不到自己。
到此就实现的eureka集群搭建以及spring boot 微服务的容器化管理。这样做确实不够优雅,但是在需要管理的服务不是特别多,且服务的位置环境相对固定的情况下还是能用的。
一些参考
https://blog.csdn.net/tianyaleixiaowu/article/details/78184793