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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Docker Swarm Mode集群和传统的Swarm集群最大的差异是利用引擎内置的集群管理能力,取消了对KVStore依赖,简化了Docker集群的创建和管理。随着商业化产品的步伐加快,Docker企业版也已经支持了Swarm Mode。

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应用可以是如下结构:

springcloud_tiny

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

eureka_screenshot

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

web_screenshot

部署到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商业版的内容可以参考云栖文章:DockerCon2017前瞻 - Docker企业版体验

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

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

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

讨论

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

Docker Swarm运行Spring Cloud(二):Eureka高可用

小结

本文讨论了如何在Docker Swarm Mode集群上部署一个Spring Cloud应用,可以看出Docker Swarm的优雅之处在于集群管理和Docker API一致以及优异的开发者体验。阿里云容器服务除了在共有云上提供了CaaS能力能力也会很快支持Swarm Mode,了解更多阿里云容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关文章
|
6天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
54 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
5天前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
15 5
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
7天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
7天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
7天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。
|
7天前
|
前端开发 开发者 Docker
深入探索Docker Compose:简化多容器应用的部署
深入探索Docker Compose:简化多容器应用的部署
27 0
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
122 1