Rancher+Docker实现SpringCloud容器部署

Rancher+Docker实现SpringCloud容器部署

  • 运行第一个Docker容器
  • Rancher
  • 部署eureka
    • 构建镜像仓库
    • 在rancher上添加eureka服务
    • 构建高可用的eureka服务
  • 部署config
  • 部署product项目
  • 部署order项目项目
  • 构建api-gateway并实现负载均衡

运行第一个Docker容器

首先要在电脑上安装docker,在windows上运行docker可能出现的常见问题解决方法:解决点击Docker出现windows 正在查找bash.exe。下面以windows操作系统为例,以docker方式运行eureka项目。
1.在项目根目录创建Dockerfile文件

FROM  hub.c.163.com/library/java:8-alpine     从网易云镜像中心获取java镜像

ADD target/*.jar app.jar                      添加target目录下生成的项目jar包到容器中并且重命名为app.jar

EXPOSE 8761                                   声明端口 8761

ENTRYPOINT ["java","-jar","/app.jar"]         以java -jar的方式运行

2.创建docker镜像
(1)构建java应用:mvn clean package -Dmaven.test.skip=true
(2)构建docker镜像:docker build -t springcloud/eureka .(这里的点表示当前路径)
(3)启动:docker run -p 8761:8761 -d springcloud/eureka
3.访问项目

Rancher+Docker实现SpringCloud容器部署_第1张图片
如果想要运行多个eureka实例,可以在docker里面执行
docker run -p (想要运行的端口):8761 -d springcloud/eureka
就可以通过ip:端口的方式来访问项目。

注:如果想要别人使用你的镜像,就可以将本地镜像推送到镜像中心,网易云、腾讯云等都有提供相应的镜像仓库服务,并有详细的如何推送镜像的教程,并且要将镜像设置为公开。
Rancher+Docker实现SpringCloud容器部署_第2张图片
Rancher+Docker实现SpringCloud容器部署_第3张图片

Rancher

rancher官网
rancher中文站点
Rancher是一个开源的企业级全栈化容器部署及管理平台,简单的说就是为了更加方便的管理docker。官网上说明了使用rancher的要求和步骤,在这里我使用的腾讯云的云服务器CentOS 7.4 64位 (记为服务器A)。
Rancher+Docker实现SpringCloud容器部署_第4张图片
1.在服务器A上安装docker

在centos服务器上安装docker:yum install docker
启动docker:systemctl start docker
查看docker信息 : docker info
查看docker版本: docker version

Rancher+Docker实现SpringCloud容器部署_第5张图片
2.安装rancher
rancher-server非常大(1GB左右),如果直接执行安装语句的话,在服务器A上下载会非常慢,可以先配置一个加速地址。

修改文件vim /etc/docker/daemon.json
添加如下内容:{"registry-mirrors": ["https://fy707np5.mirror.aliyuncs.com"]}
保存之后执行
systemctl daemon-reload
systemctl restart docker

在这里插入图片描述
然后执行安装命令
sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:stable
执行成功之后就可以通服务器A的ip:8080 来访问(注意要开启对应端口的防火墙和安全组)
访问的界面如图所示,需要添加主机:
Rancher+Docker实现SpringCloud容器部署_第6张图片

3.添加主机
保存当前站点
Rancher+Docker实现SpringCloud容器部署_第7张图片
添加主机,这里使用了同学的腾讯云服务器(记为服务器B)。

Rancher+Docker实现SpringCloud容器部署_第8张图片
在服务器B上安装docker,启动docker之后执行第5点里面的脚本在主机上注册rancher,会在服务器B上安装rancher-agent,在服务器B上成功安装rancher-agent之后显示如下信息:
Rancher+Docker实现SpringCloud容器部署_第9张图片
安装成功之后点击第6点的关闭按钮。在主机界面显示如下:
Rancher+Docker实现SpringCloud容器部署_第10张图片
这些应用也是正常启动
Rancher+Docker实现SpringCloud容器部署_第11张图片

部署eureka

构建镜像仓库

这里使用腾讯云作为镜像仓库,推送镜像到镜像仓库,对于每个服务的部署都是一样的操作,因此可以在项目目录下写一个脚本。

Rancher+Docker实现SpringCloud容器部署_第12张图片
根据以上操作,对应的脚本build.shell 如下。

#!/usr/bin/env bash

mvn clean package -Dmaven.test.skip=true -U                 构建java项目

docker build -t ccr.ccs.tencentyun.com/wuqiong/eureka .     构建docker镜像()

docker push ccr.ccs.tencentyun.com/wuqiong/eureka           将镜像推送到镜像仓库

在git命令行中进入eureka项目根目录,执行bash build.shell运行脚本,上传镜像。

推送成功之后可以看到推送的镜像,注意一定要将镜像改成公开,否则rancher上拉取不到
在这里插入图片描述

在rancher上添加eureka服务

(1)添加应用springcloud

Rancher+Docker实现SpringCloud容器部署_第13张图片
(2)在springcloud应用里面添加eureka服务
Rancher+Docker实现SpringCloud容器部署_第14张图片(3)成功添加之后可以查看启动日志,也可以在日志中排查问题。通过主机ip:端口号来访问eureka项目。
Rancher+Docker实现SpringCloud容器部署_第15张图片

构建高可用的eureka服务

服务注册中心eureka要实现高可用,多个服务之间应该两两注册。可以利用springboot的配置文件来实现,springboot可以针对不同环境,读取相应的的配置文件来启动项目。在eureka项目下创建多个配置文件application-eureka1.yml和application-eureka2.yml。相应的内容如下:

#application.yml的内容,默认读取application-eureka1.yml的配置文件
spring:
  profiles:
    active: eureka1


#application-eureka1.yml的配置文件
eureka:
  client:
    service-url:
     #在rancher中可以直接通过服务名称eureka2找到eureka2服务,将eureka1注册到eureka2上
     defaultZone: http://eureka2:8762/eureka/ 
    #这个注解的意思就是不会出现在注册应用的列表里面
    register-with-eureka: false
  server:
    #不使用自我保护模式
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8761


#application-eureka2.yml的配置文件
eureka:
  client:
    service-url:
     #将eureka2注册到eureka1上
     defaultZone: http://eureka1:8761/eureka/
     register-with-eureka: false
  server:
    #不使用自我保护模式
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8762

在本地的启动方式为:
java -jar -Dspring.profiles.active=eureka1 target/*.jar
可以通过相应的配置文件来进行启动

在rancher中进行添加服务的时候与最开始不同的是需要在最下面添加环境变量。
Rancher+Docker实现SpringCloud容器部署_第16张图片
就可以在rancher上构建eureka的高可用
在这里插入图片描述

部署config

(1)在config项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。

#Dockerfile文件内容
FROM  hub.c.163.com/library/java:8-alpine
MAINTAINER xxx [email protected]
ADD target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

#build.shell脚本内容
#!/usr/bin/env bash
mvn clean package -Dmaven.test.skip=true -U
docker build -t ccr.ccs.tencentyun.com/wuqiong/config .
docker push ccr.ccs.tencentyun.com/wuqiong/config

(2)修改config项目的配置文件,有两点需要注意。一是要修改config的注册中心的url,第二点是需要添加一个配置,否则docker容器内部的服务之间是不能通信的,这个问题在在后面部署product项目的时候演示!
Rancher+Docker实现SpringCloud容器部署_第17张图片
config具体配置如下,根据实际自己的实际情况来:

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: git地址
          username: 用户名
          password: 密码
  #在本地不需要写rabbitmq的配置就可以发送消息
  rabbitmq:
    host: rabbitmq主机ip
    port: 5672
    username: 用户名
    password: 密码
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
  instance:
    prefer-ip-address: true
management:
  endpoints:
    web:
      exposure:
        include: "*"

(3)在git命令行中进入config项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。

(4)在speingcloud应用中添加config服务。
公开主机端口可以不写,rancher会帮我们创建一个端口,供我们来访问测试。
Rancher+Docker实现SpringCloud容器部署_第18张图片创建成功之后我们可以通过主机ip(服务器B的ip):端口号来访问对应的配置文件,看config项目是否正常运行。对应的端口号是53851,注意一定要在安全组里面添加该端口的访问权限。
在这里插入图片描述成功访问order-test.yml的配置文件。
Rancher+Docker实现SpringCloud容器部署_第19张图片

部署product项目

(1)在product项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。需要注意的是product项目构建成了多模块,Dockerfile文件要进行一定的修改,否则会出错。

#product项目的Dockerfile
FROM  hub.c.163.com/library/java:8-alpine
ADD server/target/*.jar app.jar(路径要进行修改)
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

(2)修改配置文件,修改注册中心以及添加eureka.instance.prefer-ip-address:true的配置,使注册到Eureka Server上的是IP,否则order服务不能通过fegin与product项目进行通信。还需要在配置文件里面修改mysql、rabbitmq以及redis的主机ip,我在自己的服务器上安装了这些服务,将配置改成了是我自己服务器上地址以及相应的用户名和密码。rancher只进行容器的管理,想mysql、rabbitmq等基础服务不会变化和重新部署,使用自己本机上的服务即可。

下面对eureka.instance.prefer-ip-address:true这个配置进行演示和说明:
rancher在创建服务的时候,会生成一个ip地址供服务之间调用
Rancher+Docker实现SpringCloud容器部署_第20张图片

  • 当在config项目里面没有配置这个属性时,product项目不能正常拉取配置,原因是注册到Eureka Server上的不是ip,而是一串字符,这串字符在服务之间是不能相互通信的
    Rancher+Docker实现SpringCloud容器部署_第21张图片
    在product服务的命令行里面ping 这一串字符看能不能ping通:
    Rancher+Docker实现SpringCloud容器部署_第22张图片
    无法ping通这个地址,是无法拉取配置文件的!

  • 当在config项目里面配置这个属性时,product项目可以正常拉取配置,注册到Eureka Server上的是ip,可以正常拉取配置
    Rancher+Docker实现SpringCloud容器部署_第23张图片
    Rancher+Docker实现SpringCloud容器部署_第24张图片
    由此可以看出eureka.instance.prefer-ip-address:true配置的重要性。

(3)在git进入product项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。
(4)在speingcloud应用中添加product服务。
公开主机端口可以不写,rancher会帮我们创建一个端口,供我们来访问测试。
在这里插入图片描述
访问product项目的list接口:
Rancher+Docker实现SpringCloud容器部署_第25张图片

部署order项目项目

(1)在order项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。运行脚本创建镜像。
(2)修改配置文件,修改注册中心以及添加eureka.instance.prefer-ip-address:true的配置
(3)在git命令行中进入order项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。
(4)在springcloud应用中添加order服务。
在这里插入图片描述
测试创建订单的接口,使用Restlet Client来进行测试:
Rancher+Docker实现SpringCloud容器部署_第26张图片

构建api-gateway并实现负载均衡

按照以上操作同样部署api-gateway,在添加服务时不写端口映射。
Rancher+Docker实现SpringCloud容器部署_第27张图片
给api-gateway添加负载均衡
Rancher+Docker实现SpringCloud容器部署_第28张图片
Rancher+Docker实现SpringCloud容器部署_第29张图片
负载均衡创建成功
在这里插入图片描述
查看端口和负载均衡的规则可知:对外暴露的端口是主机(服务器B)的80端口,访问主机的80端口其实就是将请求转发到springcloud/api-gateway服务中。
Rancher+Docker实现SpringCloud容器部署_第30张图片
Rancher+Docker实现SpringCloud容器部署_第31张图片

总结:在rancher里面不将api-gateway的接口暴露出来,这样做的好处就是可以很方便的实现扩容(经过测试如果在添加服务的时候填写端口映射,添加服务数量的时候会出错),实现负载均衡的话,对外暴露的就是主机的80端口,会做一个负载均衡,把流量分发到多个api-gateway服务上去,从而实现api-gateway的高可用。

其他服务不需要添加负载均衡器,其他服务已经注册到eureka上面,服务调用的时候通过fegin(内置ribbon)自动的做到负载均衡,因此其他的服务在rancher这边是不需要配置负载均衡器的。

你可能感兴趣的:(springcloud)