DockerSwarm 微服务部署
文章首发于公众号《程序员果果》
地址: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: false fetch-registry: false service-url: defaultZone: http://eureka-server:8761/eureka/ instance: prefer-ip-address: true instance-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: true instance-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: true instance-id: eureka-server:8764
HelloService
@Service public class HelloService { @Autowired private RestTemplate restTemplate; public String hiService() { return restTemplate.getForObject( "http://service-hi:8763/hi" , String.class ); } }
HelloControler
@RestController public class HelloControler { @Autowired private 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 @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
三、构建镜像
1. Dockerfile
编写Dockerfile ,把项目构建成镜像,需要把 项目jar包 复制到 镜像中,而且镜像中要有java的运行环境,所以现在给每个项目都创建一个Dockerfile,内容如下:
eureka-server 项目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jre MAINTAINER gf gf@163.com COPY target/eureka-server-0.0.1-SNAPSHOT.jar /eureka-server-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java" , "-jar" , "/eureka-server-0.0.1-SNAPSHOT.jar"]
service-hi 项目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jre MAINTAINER gf gf@163.com COPY target/service-hi-0.0.1-SNAPSHOT.jar /service-hi-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java" , "-jar" , "/service-hi-0.0.1-SNAPSHOT.jar"]
service-ribbon 项目的 Dockerfile
#!/usr/bin/env bash mvn package -Dmaven.test.skip=true docker build -t hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest . docker login -u admin -p Harbor12345 hub.gf.com:9090 docker push hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest
2. 创建 build.sh
为了方便,三个项目根目录下创建 build.sh 脚本,来一键执行项目的打jar包、构建镜像、推送到私有仓库。
eureka-server 项目的 build.sh
#!/usr/bin/env bash mvn package -Dmaven.test.skip=true docker build -t hub.gf.com:9090/springboot-ribbon/eureka-server:latest . docker login -u admin -p Harbor12345 hub.gf.com:9090 docker push hub.gf.com:9090/springboot-ribbon/eureka-server:latest
service-hi 项目的 build.sh
#!/usr/bin/env bash mvn package -Dmaven.test.skip=true docker build -t hub.gf.com:9090/springboot-ribbon/service-hi:latest . docker login -u admin -p Harbor12345 hub.gf.com:9090 docker push hub.gf.com:9090/springboot-ribbon/service-hi:latest
service-ribbon 项目的 build.sh
#!/usr/bin/env bash mvn package -Dmaven.test.skip=true docker build -t hub.gf.com:9090/springboot-ribbon/service-ribbon:latest . docker login -u admin -p Harbor12345 hub.gf.com:9090 docker 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:latest deploy: endpoint_mode: vip resources: limits: cpus: "0.5" memory: "1024M" ports: - "8761:8761" service-hi: image: hub.gf.com:9090/springcloud-ribbon/service-hi:latest deploy: endpoint_mode: vip resources: limits: cpus: "0.5" memory: "1024M" ports: - "8763:8763" depends_on: - eureka-server service-ribbon: image: hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest deploy: endpoint_mode: vip resources: limits: cpus: "0.5" memory: "1024M" ports: - "8764:8764" depends_on: - eureka-server - service-hi networks: 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 ,都可以正常访问,说明已经部署成功了。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
DockerSwarm 集群环境搭建
文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/RSNL-V4jLE8YVMSWZlJ_Vw 一、简介 1. 什么是docker swarm? Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。 Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。 Swarm的基本架构如下图所示:  交流群(微信) 今天小编为大家推荐一款阿里云热门的开发者工具,花 3 分钟时间,来了解下这个新工具:Alibaba Cloud Toolkit 阿里云 Toolkit (Alibaba Cloud Toolkit) 是一个面向 IDE(如 Eclipse 或 IntelliJ IDEA )的插件,帮助开发者更高效的开发、测试、诊断并部署适合云端运行的应用。 核心:提升开发部署效率 亮点1:本地应用一键部署 Deploy to ECS开发者本地编写的应用程序,在图形化界面上进行配置,即可持续便利的部署到云端的 ECS 服务器上;在 Eclipse 中完成编码后,无须在 Maven 、Git 以及其他运维脚本和工具的之间切换,借助 Cloud Toolkit fo
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器