Docker Swarm运行Spring Cloud应用(一):部署

摘要: 本文章为楼主本人需要时查找方便故转载云栖大神文章并加以修改留存,原文地址

Docker Swarm Mode集群和传统的Swarm集群最大的差异是利用引擎内置的集群管理能力,取消了对KV Store依赖,简化了Docker集群的创建和管理。随着商业化产品的步伐加快,Docker企业版也已经支持了Swarm Mode。今天,我们就和大家一起看一下如何利用这些最新特性在Swarm Mode集群中部署Spring Cloud应用。

极简版Spring Cloud应用

云应用(Cloud Native Application)的一个重要特点是动态。运行在云上的应用,其实例可能随时生灭,随着负载的变化,数目也会增减。为适应这个变化,应用需要借助于服务发现来相互定位。开源的微服务框架Spring Cloud中封装了Netflix的服务发现Eureka,一个极简的Spring Cloud应用可以是如下结构:

Web应用在访问时会调用BookService,宣布两个服务都正常。

curl http://web:8080/
Web+BOOK Service Available.

Web对BookService服务调用参见ApplicationController.java代码。

@RequestMapping("/")
    public String getIndex(){
        String message = restTemplate.getForObject("http://bookservice/",String.class);
        return "Web+" + message;
    }

可以看到restTemplate访问"http://bookservice/",从Eureka服务中检索到名为bookservice服务的所有实例地址和端口号,利用客户端负载机制选择其中一个实例进行访问。

BookService服务在启动的时候会自动向Eureka注册。Eureka Server的地址配置在application.properties文件中:

server.port=0
eureka.client.serviceUrl.defaultZone=http://${EUREKA_SERVER_ADDRESS}:8761/eureka/

bootstrap.properties文件中声明服务名:

spring.application.name=bookservice

如果大家查看Web服务的相应文件,也会看到类似的配置,只不过声明自己的服务名不同。

Spring Cloud对Eureka Server和Eureka Client做了很好的封装,一个应用只需通过如下标注即可成为Eureka Server:

...
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
   ...
}

Eureka Client的声明如下:

...
@SpringBootApplication
@EnableDiscoveryClient
public class BookserviceApplication {
   ...
}

构建镜像

构建镜像分两个步骤,Gradle编译生成Spring Boot JAR;然后利用Dockerfile创建Docker镜像。

./gradlew build
docker build -t <镜像名>:<标签> .

示例Dockerfile是针对Gradle编译出来的目录结构的。如果使用Maven编译,请更改JAR目录位置。

FROM java:8-jre-alpine
VOLUME /tmp
ADD build/libs/*.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

全部构建完成后查看新生成的Docker镜像:

$ docker image ls
REPOSITORY         TAG         IMAGE ID       CREATED      SIZE
demo-web           latest      281e25e4c72c   2 days ago   180 MB
demo-bookservice   latest      249a93dfe3c6   2 days ago   180 MB
demo-eurekaserver  latest      2cfeb50cf373   2 days ago   204 MB

在本地运行

在compose目录下有一个V3版本的部署描述文件springcloud-demo.yml。如果你的计算机上有docker-compose,可以运行如下命令启动全部服务:

$ cd compose
$ docker-compose -f springcloud-demo.yml up -d

找到Eureka和Web的所对应的端口。

$ docker-compose -f springcloud-demo.yaml ps
        Name                       Command               State            Ports
----------------------------------------------------------------------------------------
compose_bookservice_1   java -Djava.security.egd=f ...   Up
compose_eureka_1        java -Djava.security.egd=f ...   Up      0.0.0.0:8761->8761/tcp
compose_web_1           java -Djava.security.egd=f ...   Up      0.0.0.0:32771->8080/tcp

访问Eureka Server

从上面的输出可以看到Web和BookService服务各有一个实例注册上了。下面访问Web服务:

部署到Swarm Mode集群

Docker 1.12开始Swarm Mode集群模式,相关的文章可以参考云栖文章。读者登录到任意Swarm管理节点,执行部署命令。

docker stack deploy -f all-in-one.yml springcloud-demo

示例springcloud-demo.yml采用Compose V3格式,新格式和V2的差别讨论间云栖文章。我们在这里没有使用V3特有的内容,贴在这里供大家参考:

version: '3'
services:
  eureka:
    image: XXX/demo-eurekaserver
    ports:
      - "8761:8761"
  web:
    image: XXX/demo-web
    environment:
      - EUREKA_SERVER_ADDRESS=eureka
    ports:
      - "8080"
  bookservice:
    image: XXX/demo-bookservice
    environment:
      - EUREKA_SERVER_ADDRESS=eureka

部署到Docker Datacenter

Docker公司的商业版集群管理软件Docker Datacenter支持了Swarm Mode模式集群。

最新的Docker Datacenter 2.1上用户可以通过界面上的Compose编辑器输入Compose模版完成部署,效果和上面用docker stack命令一样。

在2.0版上没有Compose模版编辑界面,读者可以登录进入任何一个管理节点,通过命令行执行同样命令部署:

docker stack deploy -f all-in-one.yml springcloud-demo

讨论

本文的示例代码在github上。在生产环境中部署SpringCloud应用还要涉及到高可用,日志、监控等配置在以后的系列文章中会依据云栖大神相关文章追踪修改更新介绍相应内容,敬请关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种强大的容器化技术,可以帮助开发人员更轻松地部署、管理和扩展应用程序。Spring Cloud是一套用于快速构建微服务架构的框架,其提供了一系列的组件,包括服务发现、负载均衡、断路器、配置中心等等。下面我们来介绍如何使用Docker部署Spring Cloud应用程序: 1. 创建Spring Cloud应用程序 首先我们需要创建一个Spring Cloud应用程序,可以使用Spring Initializr来快速创建。在创建项目时,需要选择使用的Spring Cloud组件,如Eureka、Zuul、Feign等等。 2. 构建Docker镜像 接下来,我们需要将Spring Cloud应用程序打包成Docker镜像。我们可以使用Dockerfile来定义镜像的构建流程。Dockerfile中包含了一系列指令,可以用来安装依赖、复制文件、执行命令等等。例如,下面是一个简单的Dockerfile示例: FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] 该Dockerfile使用了openjdk:8-jdk-alpine作为基础镜像,添加了一个卷和一个环境变量,将打包好的jar文件复制到镜像中,并设置了启动命令。 3. 启动Docker容器 构建好Docker镜像之后,我们需要将其启动为Docker容器。可以使用docker run命令来启动容器。例如: docker run -p 8080:8080 my-spring-cloud-app 该命令会启动一个名为my-spring-cloud-app的Docker容器,并将容器的8080端口映射到主机的8080端口。 4. 配置Docker Swarm 如果你需要在多个Docker主机上部署Spring Cloud应用程序,则可以使用Docker Swarm来管理容器集群。Docker Swarm是一个内置在Docker中的集群管理工具,可以帮助我们快速构建、部署和管理容器集群。 要启用Docker Swarm,我们需要在主机上运行以下命令: docker swarm init 该命令会初始化一个新的Swarm集群,并返回一个join token,用于将其他主机加入集群。 5. 部署Spring Cloud应用程序 使用Docker Swarm可以轻松地部署Spring Cloud应用程序。我们可以使用docker stack deploy命令来启动一个新的服务栈。例如: docker stack deploy -c docker-compose.yml my-spring-cloud-stack 该命令会启动一个名为my-spring-cloud-stack的服务栈,其中包含了多个Spring Cloud应用程序。docker-compose.yml文件包含了服务栈的配置信息,例如服务的名称、镜像名称、端口号等等。 总结 使用Docker部署Spring Cloud应用程序可以帮助我们更轻松地管理应用程序,提高了应用程序的可移植性和可伸缩性。希望本文能够帮助你快速上手DockerSpring Cloud的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值