DockerSwarm 微服务部署
2019独角兽企业重金招聘Python工程师标准>>>
文章首发于公众号《程序员果果》
地址:https://mp.weixin.qq.com/s/nWpbqAheuTh45dWsgszieA
一、简介
之前《服务Docker化》中,使用 docker-compose.yml 来一次配置启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。
在《DockerSwarm集群环境搭建》中,我们使用docker service create 来部署服务时,一次只能部署一个服务,这一节就讲解 DockerSwarm 集群环境中, 使用 docker-compose.yml 一次启动多个关联的服务。
二、创建 SpringCloud 项目
创建一个springcloud项目 ,包含eureka-server、service-hi、service-ribbon。
1. eureka-server 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gf</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>eureka-server</name><description>Demo project for Spring Boot</description><parent><groupId>com.gf</groupId><artifactId>chapter02</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
application.yml
server:port: 8761
spring:application:name: eureka-server
eureka:client:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://eureka-server:8761/eureka/instance:prefer-ip-address: trueinstance-id: eureka-server:8761
EurekaServerApplication
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}
2. service-hi 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gf</groupId><artifactId>service-hi</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>service-hi</name><description>Demo project for Spring Boot</description><parent><groupId>com.gf</groupId><artifactId>chapter02</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
application.yml
server:port: 8763
spring:application:name: service-hi
eureka:client:serviceUrl:defaultZone: http://eureka-server:8761/eureka/instance:prefer-ip-address: trueinstance-id: service-hi:8763
ServiceHiApplication
@EnableEurekaClient
@SpringBootApplication
@RestController
public class ServiceHiApplication {public static void main(String[] args) {SpringApplication.run(ServiceHiApplication.class, args);}@Value( "${server.port}" )private String port;@GetMapping("/hi")public String hi() {return "hello , port is " + port;}}
3. service-ribbon 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gf</groupId><artifactId>service-ribbon</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>service-ribbon</name><description>Demo project for Spring Boot</description><parent><groupId>com.gf</groupId><artifactId>chapter02</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
application.yml
server:port: 8764
spring:application:name: service-ribbon
eureka:client:serviceUrl:defaultZone: http://eureka-server:8761/eureka/instance:prefer-ip-address: trueinstance-id: eureka-server:8764
HelloService
@Service
public class HelloService {@Autowiredprivate RestTemplate restTemplate;public String hiService() {return restTemplate.getForObject( "http://service-hi:8763/hi" , String.class );}}
HelloControler
@RestController
public class HelloControler {@Autowiredprivate HelloService helloService;@GetMapping(value = "/hi")public String hi() {return helloService.hiService();}}
ServiceRibbonApplication
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class ServiceRibbonApplication {public static void main(String[] args) {SpringApplication.run(ServiceRibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}
}
三、构建镜像
1. Dockerfile
编写Dockerfile ,把项目构建成镜像,需要把 项目jar包 复制到 镜像中,而且镜像中要有java的运行环境,所以现在给每个项目都创建一个Dockerfile,内容如下:
eureka-server 项目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jreMAINTAINER gf gf@163.comCOPY target/eureka-server-0.0.1-SNAPSHOT.jar /eureka-server-0.0.1-SNAPSHOT.jarENTRYPOINT ["java" , "-jar" , "/eureka-server-0.0.1-SNAPSHOT.jar"]
service-hi 项目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jreMAINTAINER gf gf@163.comCOPY target/service-hi-0.0.1-SNAPSHOT.jar /service-hi-0.0.1-SNAPSHOT.jarENTRYPOINT ["java" , "-jar" , "/service-hi-0.0.1-SNAPSHOT.jar"]
service-ribbon 项目的 Dockerfile
#!/usr/bin/env bashmvn package -Dmaven.test.skip=truedocker build -t hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest .docker login -u admin -p Harbor12345 hub.gf.com:9090docker push hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest
2. 创建 build.sh
为了方便,三个项目根目录下创建 build.sh 脚本,来一键执行项目的打jar包、构建镜像、推送到私有仓库。
eureka-server 项目的 build.sh
#!/usr/bin/env bashmvn package -Dmaven.test.skip=truedocker build -t hub.gf.com:9090/springboot-ribbon/eureka-server:latest .docker login -u admin -p Harbor12345 hub.gf.com:9090docker push hub.gf.com:9090/springboot-ribbon/eureka-server:latest
service-hi 项目的 build.sh
#!/usr/bin/env bashmvn package -Dmaven.test.skip=truedocker build -t hub.gf.com:9090/springboot-ribbon/service-hi:latest .docker login -u admin -p Harbor12345 hub.gf.com:9090docker push hub.gf.com:9090/springboot-ribbon/service-hi:latest
service-ribbon 项目的 build.sh
#!/usr/bin/env bashmvn package -Dmaven.test.skip=truedocker build -t hub.gf.com:9090/springboot-ribbon/service-ribbon:latest .docker login -u admin -p Harbor12345 hub.gf.com:9090docker push hub.gf.com:9090/springboot-ribbon/service-ribbon:latest
分别执行三个 build.sh 脚本,这样私有仓库就有三个项目的镜像了,如图:
三、部署服务
1. 启动集群环境
启动之前搭建好的 docker swarm 集群环境:
docker-machine start myvm-1 myvm-2 myvm-3
要在管理节点下部署服务,所以需要知道哪台是管理节点,随便连接一台机器,通过 docker node 命令查看节点信息:
docker-machine ssh myvm-1
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2
vels0fe3eh5s5cxj1s573v9wx myvm-2 Ready Active Reachable 18.09.1-beta2
obxnnqelh4p16wajrwvyn6j8v myvm-3 Ready Active Reachable 18.09.1-beta2
myvm-1 就是管理节点,不需要切换节点了。
2. 编写 services.yml
之后用 docker stack 部署服务,所以需要编写服务编排文件,内容如下:
version: "3.4"
services:eureka-server:image: hub.gf.com:9090/springcloud-ribbon/eureka-server:latestdeploy:endpoint_mode: vipresources:limits:cpus: "0.5"memory: "1024M"ports:- "8761:8761"service-hi:image: hub.gf.com:9090/springcloud-ribbon/service-hi:latestdeploy:endpoint_mode: vipresources:limits:cpus: "0.5"memory: "1024M"ports:- "8763:8763"depends_on:- eureka-serverservice-ribbon:image: hub.gf.com:9090/springcloud-ribbon/service-ribbon:latestdeploy:endpoint_mode: vipresources:limits:cpus: "0.5"memory: "1024M"ports:- "8764:8764"depends_on:- eureka-server- service-hinetworks:default:external:name: my-overlay
文件详细说明,这里就不说了,可以网上查一下。
3. 启动服务
通过 docker stack deploy 命令 启动服务:
docker stack deploy -c services.yml ms
通过 docker service ls 查看服务启动状态:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
q99gd5rquv3f ms_eureka-server replicated 1/1 hub.gf.com:9090/springcloud-ribbon/eureka-server:latest *:8761->8761/tcp
wjsv5s6fce6k ms_service-hi replicated 1/1 hub.gf.com:9090/springcloud-ribbon/service-hi:latest *:8763->8763/tcp
zjwe7cnpn42y ms_service-ribbon replicated 1/1 hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest *:8764->8764/tcp
服务启动后 ,访问 192.168.99.100:8761 , 192.168.99.100:8763/hi , 192.168.99.100:8764/hi ,都可以正常访问,说明已经部署成功了。
关注我
欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~
转载于:https://my.oschina.net/u/2367201/blog/3056340
DockerSwarm 微服务部署相关推荐
- 微服务实战(六):选择微服务部署策略
http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...
- 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践
介绍 本文的目的是:通过使用 DockerHub 和 Azure Kubernetes Service (AKS) 将之前 使用 .NET 和 Docker 构建的微服务 部署到微软 Azure 云上 ...
- 基于 Kubernetes 的微服务部署即代码
在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...
- 微服务开发及部署_基于 Kubernetes 的微服务部署即代码
在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...
- 阿里云Kuberneters微服务部署案例
3. 如何安装Docker Desktop for Mac 如何安装Docker Desktop for Mac 4. SpringCloud微服务应用 SpringCloud微服务应用 5. Kub ...
- k8s平台微服务部署
涉及的微服务 涉及三个微服务的demo: 服务注册与发现:eureka-server 管理服务:admin-service 用户服务:user-service 管理服务和用户服务会注册到eureka上 ...
- SpringCloud(5)— 微服务部署(Docker)
SpringCloud(5)- 微服务部署(Docker) 一 初识Docker 1.项目部署问题 大型项目组件较多,运行环境较为复杂,部署和维护困难 依赖关系复杂,容易出现兼容性问题 开发,测试,生 ...
- 微服务实践(六):选择微服务部署策略
[编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理.这篇文章 ...
- 华为云服务-微服务部署后的WEB服务日常如何运维
文章目录 前言 华为云平台下WEB服务日常如何运维 一.主机监控-Agent 步骤一 .AOM控制台 步骤二.Agent管理 步骤三 .安装Agent 步骤四 .Agent管理-查看虚拟机 步骤五.应 ...
最新文章
- java 修改wav文件头_使用Java聲音API從WAV文件中修剪開頭和結尾
- 动画代码Android动画学习笔记动画代码
- OS存储器管理(一)
- nanopi如何与虚拟机连接起来
- leetcode 593. Valid Square | 593. 有效的正方形(Java)
- 惊呼!JavaScript基本数据类型和引用数据类型详解
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<2>python)
- 1.2编程基础之变量定义、赋值及转换 10 Hello, World 的大小
- (51)FPGA条件选择(case)
- 方舟编译器开源技术沙龙北京站首秀:让开源激活软件开发的潜力
- JAVA语言基础-反射、特性
- CS224n自然语言处理(四)——单词表示及预训练,transformer和BERT
- 子网地址和广播地址的计算
- 计算机中堆栈指针的作用,堆栈指针是什么_有什么作用
- linux0.11主存管理程序阅读注释笔记
- android流光字体实现,CSS实现字体流光/高光滑动
- 网速dns怎么调快_手机dns怎么设置网速快
- php错误排查 写入文档,php error_log 错误信息写入文件
- 关于AntMotion动画使用
- vue elementui table 复选框
热门文章
- truffle (ETH以太坊智能合约集成开发工具) 入门教程
- React-Native 使用真机和指定模拟器调试
- CentOS 7下载
- python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析
- 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
- 布尔类型和三目运算符
- 2018-08-19-Python全栈开发day43-正反选练习
- 【Linux】时间同步设置+防火墙设置+SELinux设置
- UIBezierPath画圆弧的记录
- linux :故障提示:Error:No suitable device found: no device found for connection System eth0