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 微服务部署相关推荐

  1. 微服务实战(六):选择微服务部署策略

    http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...

  2. 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

    介绍 本文的目的是:通过使用 DockerHub 和 Azure Kubernetes Service (AKS) 将之前 使用 .NET 和 Docker 构建的微服务 部署到微软 Azure 云上 ...

  3. 基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  4. 微服务开发及部署_基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  5. 阿里云Kuberneters微服务部署案例

    3. 如何安装Docker Desktop for Mac 如何安装Docker Desktop for Mac 4. SpringCloud微服务应用 SpringCloud微服务应用 5. Kub ...

  6. k8s平台微服务部署

    涉及的微服务 涉及三个微服务的demo: 服务注册与发现:eureka-server 管理服务:admin-service 用户服务:user-service 管理服务和用户服务会注册到eureka上 ...

  7. SpringCloud(5)— 微服务部署(Docker)

    SpringCloud(5)- 微服务部署(Docker) 一 初识Docker 1.项目部署问题 大型项目组件较多,运行环境较为复杂,部署和维护困难 依赖关系复杂,容易出现兼容性问题 开发,测试,生 ...

  8. 微服务实践(六):选择微服务部署策略

    [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理.这篇文章 ...

  9. 华为云服务-微服务部署后的WEB服务日常如何运维

    文章目录 前言 华为云平台下WEB服务日常如何运维 一.主机监控-Agent 步骤一 .AOM控制台 步骤二.Agent管理 步骤三 .安装Agent 步骤四 .Agent管理-查看虚拟机 步骤五.应 ...

最新文章

  1. java 修改wav文件头_使用Java聲音API從WAV文件中修剪開頭和結尾
  2. 动画代码Android动画学习笔记动画代码
  3. OS存储器管理(一)
  4. nanopi如何与虚拟机连接起来
  5. leetcode 593. Valid Square | 593. 有效的正方形(Java)
  6. 惊呼!JavaScript基本数据类型和引用数据类型详解
  7. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(NumPy科学计算库<2>python)
  8. 1.2编程基础之变量定义、赋值及转换 10 Hello, World 的大小
  9. (51)FPGA条件选择(case)
  10. 方舟编译器开源技术沙龙北京站首秀:让开源激活软件开发的潜力
  11. JAVA语言基础-反射、特性
  12. CS224n自然语言处理(四)——单词表示及预训练,transformer和BERT
  13. 子网地址和广播地址的计算
  14. 计算机中堆栈指针的作用,堆栈指针是什么_有什么作用
  15. linux0.11主存管理程序阅读注释笔记
  16. android流光字体实现,CSS实现字体流光/高光滑动
  17. 网速dns怎么调快_手机dns怎么设置网速快
  18. php错误排查 写入文档,php error_log 错误信息写入文件
  19. 关于AntMotion动画使用
  20. vue elementui table 复选框

热门文章

  1. truffle (ETH以太坊智能合约集成开发工具) 入门教程
  2. React-Native 使用真机和指定模拟器调试
  3. CentOS 7下载
  4. python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析
  5. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
  6. 布尔类型和三目运算符
  7. 2018-08-19-Python全栈开发day43-正反选练习
  8. 【Linux】时间同步设置+防火墙设置+SELinux设置
  9. UIBezierPath画圆弧的记录
  10. linux :故障提示:Error:No suitable device found: no device found for connection System eth0