经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
DockerSwarm 微服务部署
来源:cnblogs  作者:程序员果果  时间:2019/5/16 9:28:05  对本文有异议

一、简介

之前《服务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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.gf</groupId>
  6. <artifactId>eureka-server</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka-server</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>com.gf</groupId>
  13. <artifactId>chapter02</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-maven-plugin</artifactId>
  36. <executions>
  37. <execution>
  38. <goals>
  39. <goal>repackage</goal>
  40. </goals>
  41. </execution>
  42. </executions>
  43. </plugin>
  44. </plugins>
  45. </build>
  46. </project>

application.yml

  1. server:
  2. port: 8761
  3. spring:
  4. application:
  5. name: eureka-server
  6. eureka:
  7. client:
  8. register-with-eureka: false
  9. fetch-registry: false
  10. service-url:
  11. defaultZone: http://eureka-server:8761/eureka/
  12. instance:
  13. prefer-ip-address: true
  14. instance-id: eureka-server:8761

EurekaServerApplication

  1. @EnableEurekaServer
  2. @SpringBootApplication
  3. public class EurekaServerApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaServerApplication.class, args);
  6. }
  7. }

2. service-hi 项目

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.gf</groupId>
  6. <artifactId>service-hi</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>service-hi</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>com.gf</groupId>
  13. <artifactId>chapter02</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-maven-plugin</artifactId>
  36. <executions>
  37. <execution>
  38. <goals>
  39. <goal>repackage</goal>
  40. </goals>
  41. </execution>
  42. </executions>
  43. </plugin>
  44. </plugins>
  45. </build>
  46. </project>

application.yml

  1. server:
  2. port: 8763
  3. spring:
  4. application:
  5. name: service-hi
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://eureka-server:8761/eureka/
  10. instance:
  11. prefer-ip-address: true
  12. instance-id: service-hi:8763

ServiceHiApplication

  1. @EnableEurekaClient
  2. @SpringBootApplication
  3. @RestController
  4. public class ServiceHiApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceHiApplication.class, args);
  7. }
  8. @Value( "${server.port}" )
  9. private String port;
  10. @GetMapping("/hi")
  11. public String hi() {
  12. return "hello , port is " + port;
  13. }
  14. }

3. service-ribbon 项目

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.gf</groupId>
  6. <artifactId>service-ribbon</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>service-ribbon</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>com.gf</groupId>
  13. <artifactId>chapter02</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. </dependencies>
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-maven-plugin</artifactId>
  40. <executions>
  41. <execution>
  42. <goals>
  43. <goal>repackage</goal>
  44. </goals>
  45. </execution>
  46. </executions>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

application.yml

  1. server:
  2. port: 8764
  3. spring:
  4. application:
  5. name: service-ribbon
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://eureka-server:8761/eureka/
  10. instance:
  11. prefer-ip-address: true
  12. instance-id: eureka-server:8764

HelloService

  1. @Service
  2. public class HelloService {
  3. @Autowired
  4. private RestTemplate restTemplate;
  5. public String hiService() {
  6. return restTemplate.getForObject( "http://service-hi:8763/hi" , String.class );
  7. }
  8. }

HelloControler

  1. @RestController
  2. public class HelloControler {
  3. @Autowired
  4. private HelloService helloService;
  5. @GetMapping(value = "/hi")
  6. public String hi() {
  7. return helloService.hiService();
  8. }
  9. }

ServiceRibbonApplication

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableDiscoveryClient
  4. public class ServiceRibbonApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(ServiceRibbonApplication.class, args);
  7. }
  8. @Bean
  9. @LoadBalanced
  10. RestTemplate restTemplate() {
  11. return new RestTemplate();
  12. }
  13. }

三、构建镜像

1. Dockerfile

编写Dockerfile ,把项目构建成镜像,需要把 项目jar包 复制到 镜像中,而且镜像中要有java的运行环境,所以现在给每个项目都创建一个Dockerfile,内容如下:

eureka-server 项目的 Dockerfile

  1. FROM hub.gf.com:9090/jdk/openjdk:8-jre
  2. MAINTAINER gf gf@163.com
  3. COPY target/eureka-server-0.0.1-SNAPSHOT.jar /eureka-server-0.0.1-SNAPSHOT.jar
  4. ENTRYPOINT ["java" , "-jar" , "/eureka-server-0.0.1-SNAPSHOT.jar"]

service-hi 项目的 Dockerfile

  1. FROM hub.gf.com:9090/jdk/openjdk:8-jre
  2. MAINTAINER gf gf@163.com
  3. COPY target/service-hi-0.0.1-SNAPSHOT.jar /service-hi-0.0.1-SNAPSHOT.jar
  4. ENTRYPOINT ["java" , "-jar" , "/service-hi-0.0.1-SNAPSHOT.jar"]

service-ribbon 项目的 Dockerfile

  1. #!/usr/bin/env bash
  2. mvn package -Dmaven.test.skip=true
  3. docker build -t hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest .
  4. docker login -u admin -p Harbor12345 hub.gf.com:9090
  5. docker push hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest

2. 创建 build.sh

为了方便,三个项目根目录下创建 build.sh 脚本,来一键执行项目的打jar包、构建镜像、推送到私有仓库。

eureka-server 项目的 build.sh

  1. #!/usr/bin/env bash
  2. mvn package -Dmaven.test.skip=true
  3. docker build -t hub.gf.com:9090/springboot-ribbon/eureka-server:latest .
  4. docker login -u admin -p Harbor12345 hub.gf.com:9090
  5. docker push hub.gf.com:9090/springboot-ribbon/eureka-server:latest

service-hi 项目的 build.sh

  1. #!/usr/bin/env bash
  2. mvn package -Dmaven.test.skip=true
  3. docker build -t hub.gf.com:9090/springboot-ribbon/service-hi:latest .
  4. docker login -u admin -p Harbor12345 hub.gf.com:9090
  5. docker push hub.gf.com:9090/springboot-ribbon/service-hi:latest

service-ribbon 项目的 build.sh

  1. #!/usr/bin/env bash
  2. mvn package -Dmaven.test.skip=true
  3. docker build -t hub.gf.com:9090/springboot-ribbon/service-ribbon:latest .
  4. docker login -u admin -p Harbor12345 hub.gf.com:9090
  5. docker push hub.gf.com:9090/springboot-ribbon/service-ribbon:latest

分别执行三个 build.sh 脚本,这样私有仓库就有三个项目的镜像了,如图:

三、部署服务

1. 启动集群环境

启动之前搭建好的 docker swarm 集群环境:

  1. docker-machine start myvm-1 myvm-2 myvm-3

要在管理节点下部署服务,所以需要知道哪台是管理节点,随便连接一台机器,通过 docker node 命令查看节点信息:

  1. docker-machine ssh myvm-1
  1. docker node ls
  2. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  3. ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2
  4. vels0fe3eh5s5cxj1s573v9wx myvm-2 Ready Active Reachable 18.09.1-beta2
  5. obxnnqelh4p16wajrwvyn6j8v myvm-3 Ready Active Reachable 18.09.1-beta2

myvm-1 就是管理节点,不需要切换节点了。

2. 编写 services.yml

之后用 docker stack 部署服务,所以需要编写服务编排文件,内容如下:

  1. version: "3.4"
  2. services:
  3. eureka-server:
  4. image: hub.gf.com:9090/springcloud-ribbon/eureka-server:latest
  5. deploy:
  6. endpoint_mode: vip
  7. resources:
  8. limits:
  9. cpus: "0.5"
  10. memory: "1024M"
  11. ports:
  12. - "8761:8761"
  13. service-hi:
  14. image: hub.gf.com:9090/springcloud-ribbon/service-hi:latest
  15. deploy:
  16. endpoint_mode: vip
  17. resources:
  18. limits:
  19. cpus: "0.5"
  20. memory: "1024M"
  21. ports:
  22. - "8763:8763"
  23. depends_on:
  24. - eureka-server
  25. service-ribbon:
  26. image: hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest
  27. deploy:
  28. endpoint_mode: vip
  29. resources:
  30. limits:
  31. cpus: "0.5"
  32. memory: "1024M"
  33. ports:
  34. - "8764:8764"
  35. depends_on:
  36. - eureka-server
  37. - service-hi
  38. networks:
  39. default:
  40. external:
  41. name: my-overlay

文件详细说明,这里就不说了,可以网上查一下。

3. 启动服务

通过 docker stack deploy 命令 启动服务:

  1. docker stack deploy -c services.yml ms

通过 docker service ls 查看服务启动状态:

  1. docker service ls
  2. ID NAME MODE REPLICAS IMAGE PORTS
  3. q99gd5rquv3f ms_eureka-server replicated 1/1 hub.gf.com:9090/springcloud-ribbon/eureka-server:latest *:8761->8761/tcp
  4. wjsv5s6fce6k ms_service-hi replicated 1/1 hub.gf.com:9090/springcloud-ribbon/service-hi:latest *:8763->8763/tcp
  5. 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 ,都可以正常访问,说明已经部署成功了。

原文链接:http://www.cnblogs.com/huanchupkblog/p/10870844.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号