1. Docker Compose简介

  在实际的微服务架构中,一般包含很多个微服务,而且每个微服务都会部署多个实例,如果每个微服务都需要手动启停,那么效率会很低下,维护量也会很大。
  Compose是一个用于定义和运行多容器的Docker应用程序的工具,非常适合在开发、测试、构建CI工作流等场景。
  Compose的安装请参考:Docker-compose
安装后验证如下:# docker-compose —version
image.png

2. Docker Compose快速入门示例

首先,我们来了解下使用Compose的3个基本步骤:

  • 使用Dockerfile(或其他方式)定义应用程序环境,以便于在任何地方重现该环境
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
  • 运行docker-compose up -d命令,启动并运行整个应用程序

(1)分别通过maven打成jar包,目录结构如下。
SpringCloud微服务容器编排 - 图2
(2)创建Dockerfile文件,这里可以省略。
(3)创建docker-compose.yml,并添加以下内容。

  1. version: "3.2"
  2. services:
  3. registry: # 指定服务的名称
  4. image: java:latest
  5. volumes:
  6. - ./code/registry.jar:/code/registry.jar
  7. - ./code/registry.file:/code/registry.file
  8. - /etc/localtime:/etc/localtime
  9. ports:
  10. - "8761:8761" # 指定端口映射,类似docker run的-p选项,注意使用字符串形式
  11. restart: always
  12. entrypoint: java -Xms500m -Xmx500m -jar /code/registry.jar > /code/registry.file 2>&1
  13. network_mode: "host"
  14. environment:
  15. TZ: Asia/Shanghai
  16. getway:
  17. image: java:latest
  18. volumes:
  19. - ./code/getway.jar:/code/getway.jar
  20. - ./code/getway.file:/code/getway.file
  21. - /etc/localtime:/etc/localtime
  22. ports:
  23. - "9000:9000"
  24. restart: always
  25. entrypoint: java -Xms500m -Xmx500m -jar /code/getway.jar > /code/getway.file 2>&1
  26. network_mode: "host"
  27. environment:
  28. TZ: Asia/Shanghai
  29. sms:
  30. image: java:latest
  31. volumes:
  32. - ./code/sms.jar:/code/sms.jar
  33. - ./code/sms.file:/code/sms.file
  34. - /etc/localtime:/etc/localtime
  35. ports:
  36. - "8090:8090"
  37. restart: always
  38. entrypoint: java -Xms500m -Xmx500m -jar /code/sms.jar > /code/sms.file 2>&1
  39. network_mode: "host"
  40. environment:
  41. TZ: Asia/Shanghai
  42. oss:
  43. image: java:latest
  44. volumes:
  45. - ./code/oss.jar:/code/oss.jar
  46. - ./code/oss.file:/code/oss.file
  47. - /etc/localtime:/etc/localtime
  48. ports:
  49. - "8100:8100"
  50. restart: always
  51. entrypoint: java -Xms500m -Xmx500m -jar /code/oss.jar > /code/oss.file 2>&1
  52. network_mode: "host"
  53. environment:
  54. TZ: Asia/Shanghai
  55. quality:
  56. image: java:latest
  57. volumes:
  58. - ./code/quality.jar:/code/quality.jar
  59. - ./code/quality.file:/code/quality.file
  60. - /etc/localtime:/etc/localtime
  61. ports:
  62. - "8040:8040"
  63. restart: always
  64. entrypoint: java -Xms500m -Xmx500m -jar /code/quality.jar > /code/quality.file 2>&1
  65. network_mode: "host"
  66. environment:
  67. TZ: Asia/Shanghai
  68. common:
  69. image: java:latest
  70. volumes:
  71. - ./code/common.jar:/code/common.jar
  72. - ./code/common.file:/code/common.file
  73. - /etc/localtime:/etc/localtime
  74. ports:
  75. - "8082:8082"
  76. restart: always
  77. entrypoint: java -Xms500m -Xmx500m -jar /code/common.jar > /code/common.file 2>&1
  78. network_mode: "host"
  79. environment:
  80. TZ: Asia/Shanghai
  81. account:
  82. image: java:latest
  83. volumes:
  84. - ./code/account.jar:/code/account.jar
  85. - ./code/account.file:/code/account.file
  86. - /etc/localtime:/etc/localtime
  87. ports:
  88. - "8010:8010"
  89. restart: always
  90. entrypoint: java -Xms500m -Xmx500m -jar /code/account.jar > /code/account.file 2>&1
  91. network_mode: "host"
  92. environment:
  93. TZ: Asia/Shanghai
  94. citic-pru:
  95. image: java:latest
  96. volumes:
  97. - ./code/citic-pru.jar:/code/citic-pru.jar
  98. - ./code/citic-pru.file:/code/citic-pru.file
  99. - /etc/localtime:/etc/localtime
  100. ports:
  101. - "8011:8011"
  102. restart: always
  103. entrypoint: java -Xms500m -Xmx500m -jar /code/citic-pru.jar > /code/citic-pru.file 2>&1
  104. network_mode: "host"
  105. environment:
  106. TZ: Asia/Shanghai
  107. zipkin:
  108. image: java:latest
  109. volumes:
  110. - ./code/zipkin.jar:/code/zipkin.jar
  111. - ./code/zipkin.file:/code/zipkin.file
  112. - /etc/localtime:/etc/localtime
  113. ports:
  114. - "9100:9100"
  115. restart: always
  116. entrypoint: java -Xms500m -Xmx500m -jar /code/zipkin.jar > /code/zipkin.file
  117. network_mode: "host"
  118. environment:
  119. TZ: Asia/Shanghai

  PS:可以通过使用maven插件来构建docker镜像,需要在pom.xml添加一些内容,这里不阐述。此外,由于Docker默认网络模式是bridge,各个容器的IP都不相同,因此如果在服务提供者的配置文件中设置了http://localhost:8761/eureka/会无法满足要求。这时,有两种办法解决这个问题:方法一:使用Docker的host模式,容器内不再产生虚拟网卡,完全共享宿主机网卡,我这里使用的是这种方法。方法二:我们可以为Eureka Server所在容器配置一个主机名(例如discover),并让各个微服务使用主机名来访问Eureka Server。所以,这里讲所有微服务关于Eureka地址的配置改为如下内容:

  1. registry:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://discovery:8761/eureka/

(4)在这个目录下执行以下命令,启动容器。
  # docker-compose -f docker-compose.yml up -d
image.png

(5)验证容器是否成功启动:访问http://docker宿主机IP:8761/,可以正常显示registry Server首页,并且注册中心可以发现注册的服务。
image.png
Docker Compose将所管理的容器分为三层,分别是工程(Project)、服务(Service)以及容器(Container)。Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可以包含多个服务,每个服务定义了容器运行的镜像、参数和依赖,一个服务可以包括多个容器实例。

(6)查看容器内输出的日志
docker-compose logs -f citic-pru
image.png

3. Docker Compose编排高可用的Eureka Server

  针对Eureka Server,实现高可用的话,也可以通过Compose来编排Eureka Server集群(比如一个2个节点的高可用最小规模集群)。
  首先,需要针对Eureka Service的配置文件进行改造,以便通过同样的配置属性就可以实现两个节点的配置。

4. Docker Compose编排可伸缩的微服务

  这里仍然以3.3中的movie-service为例,执行以下命令来达到微服务节点的扩展(这里从1个节点变为2个节点):
  # docker-compose scale oss-service=2