文章目录

  • Docker Compose快速人门
    • 入门示例
  • 使用Docker Comose编排Spring Cloud微服务
    • 使用Maven插件读取Dockerfile进行构建
    • 使用Maven插件构建Docker镜像
  • 参考
  • 源代码

Docker Compose快速人门

Docker-Compose是Docker的一种编排服务,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。

通过Docker-Compose用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose解决了容器与容器之间如何管理编排的问题。

使用Compose大致有3个步骤:

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

入门示例

下面以cloud-eureka 为例讲解Compose的基本步骤。

  1. 使用mvn clean package命令打包项目,获得 jar 包cloud-eureka-1.0.jar。

  1. 在cloud-eureka-1.0.jar所在路径(默认是项目的target目录)创建Dockerfile文件,并在其中添加如下内容。
FROM java:8
VOLUME /tmp
ADD cloud-eureka-1.0.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8888
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  1. 在cloud-eureka-1.0.jar所在路径创建文件docker-compose.yml,在其中添加如下内容
version: '2' #表示该docker-compose.yml文件使用的是Version 2 file format
services:cloud-eureka: #指定服务名称build: . #指定Dockerfile所在路径ports:- "8888:8888" #指定端口映射,类似docker run的-p选项,注意使用字符串形式
  1. 在docker-compose.yml所在路径执行以下命令
docker-compose up
C:\Users\c\Desktop\spring-cloud-demo\cloud-eureka\target>docker-compose up
Building cloud-eureka
Step 1/6 : FROM java:8---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp---> Running in dd4c4cd3ed21
Removing intermediate container dd4c4cd3ed21---> 5958683417bd
Step 3/6 : ADD cloud-eureka-1.0.jar app.jar---> 6d5eeb172ef0
Step 4/6 : RUN bash -c 'touch /app.jar'---> Running in 83fb6d9236a3
Removing intermediate container 83fb6d9236a3---> 951cf2bc0e3c
Step 5/6 : EXPOSE 8888---> Running in 0f5e1c0e51d9
Removing intermediate container 0f5e1c0e51d9---> f239f83036c3
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]---> Running in fdf1f5ca9c1c
Removing intermediate container fdf1f5ca9c1c---> 0b1191090ef1
Successfully built 0b1191090ef1
Successfully tagged target_cloud-eureka:latest
WARNING: Image for service cloud-eureka was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --bu
ild`.
Creating target_cloud-eureka_1 ... done
Attaching to target_cloud-eureka_1
cloud-eureka_1  | 2019-10-21 12:28:14.223  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.Configu
rationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$412
c03e1] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
cloud-eureka_1  |
cloud-eureka_1  |   .   ____          _            __ _ _
cloud-eureka_1  |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
cloud-eureka_1  | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
cloud-eureka_1  |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
cloud-eureka_1  |   '  |____| .__|_| |_|_| |_\__, | / / / /
cloud-eureka_1  |  =========|_|==============|___/=/_/_/_/
cloud-eureka_1  |  :: Spring Boot ::        (v2.1.1.RELEASE)
cloud-eureka_1  |
cloud-eureka_1  | 2019-10-21 12:28:15.149  INFO 1 --- [           main] com.cc.cloud.eureka.EurekaApp            : No active profile set, falling back to default profil
es: default
cloud-eureka_1  | 2019-10-21 12:28:18.531  WARN 1 --- [           main] o.s.boot.actuate.endpoint.EndpointId     : Endpoint ID 'service-registry' contains invalid chara
cters, please migrate to a valid format.
cloud-eureka_1  | 2019-10-21 12:28:19.746  INFO 1 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=18263b77-2811-368f-bf5d-788d928dd71a
cloud-eureka_1  | 2019-10-21 12:28:20.197  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.Configu
rationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$412
c03e1] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
cloud-eureka_1  | 2019-10-21 12:28:21.636  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8888 (http)
cloud-eureka_1  | 2019-10-21 12:28:21.798  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
cloud-eureka_1  | 2019-10-21 12:28:21.803  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/9.0.13

执行完命令之后,Compose就会自动构建镜像并使用镜像启动容器。也可使用docker-compose up -d后台启动并运行这些容器。

我们通过docker images 可以看到,我们会产生一个target_cloud-eureka的镜像

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
target_cloud-eureka   latest              0b1191090ef1        46 minutes ago      731MB
  1. 访问http://宿主机IP:8888/,即访问http://192.168.99.100:8888/,即可访问到Eureka Server首页。

使用Docker Comose编排Spring Cloud微服务

接下来我们需要把我们的微服务通过Docker Comose去编排。

使用Maven插件读取Dockerfile进行构建

我们首先介绍使用Maven插件读取Dockerfile进行构建。

  1. maven插件的配置如下
<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>cloud-demo/${project.artifactId}:${project.version}</imageName><dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>
  1. 我们需要在我们${project.basedir}/src/main/docker目录下都创建Dockerfile

内容基本如下一致:

FROM java:8
VOLUME /tmp
ADD cloud-service-member-1.0.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8762
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  1. 编写docker-compose.yml文件
version: '3'
services:rabbitmq:image: rabbitmq:managementhostname: rabbitmqports:- "15672:15672"- "5672:5672"restart: alwayscloud-eureka:image: cloud-demo/cloud-eureka:1.0hostname: cloud-eurekaports:- "8888:8888"restart: alwayscloud-config-server:image: cloud-demo/cloud-config-server:1.0hostname: cloud-config-serverports:- "8090:8090"links:- cloud-eureka- rabbitmqdepends_on:- cloud-eureka- rabbitmqrestart: alwayscloud-zuul:image: cloud-demo/cloud-zuul:1.0hostname: cloud-zuullinks:- cloud-eureka- rabbitmq- cloud-zipkinports:- "8769:8769"depends_on:- cloud-eureka- rabbitmq- cloud-config-server- cloud-zipkinrestart: alwayscloud-service-member:image: cloud-demo/cloud-service-member:1.0links:- cloud-eureka- rabbitmq- cloud-zipkinhostname: cloud-service-memberports:- "8762:8762"depends_on:- cloud-eureka- rabbitmq- cloud-config-server- cloud-zipkinrestart: alwayscloud-service-order:image: cloud-demo/cloud-service-order:1.0links:- cloud-eureka- rabbitmq- cloud-zipkinhostname: cloud-service-orderports:- "8765:8765"depends_on:- cloud-eureka- rabbitmq- cloud-config-server- cloud-zipkinrestart: alwayscloud-admin-server:image: cloud-demo/admin-server:1.0links:- cloud-eurekahostname: cloud-admin-serverports:- "8098:8098"depends_on:- cloud-eurekarestart: alwayscloud-hystrix-dashboard:image: cloud-demo/cloud-hystrix-dashboard:1.0hostname: cloud-hystrix-dashboardports:- "8766:8766"restart: alwayscloud-turbine:image: cloud-demo/cloud-turbine:1.0hostname: cloud-turbineports:- "6100:6100"links:- cloud-eurekadepends_on:- cloud-eurekarestart: alwayscloud-zipkin:image: cloud-demo/cloud-zipkin:1.0hostname: cloud-zipkinports:- "9411:9411"restart: always

这里介绍一下为什么需要配置restart: always

docker-compose可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序。docker-compose 中的 depends_on 配置是容器的启动顺序, 并不是容器中服务的启动顺序。

也就是说容器的就绪顺序是不能保证的,也就是不能保证先把一个服务启动完毕之后再启动另一个服务。比如我们的config client需要连接config server,但是可以config server还没完全启动完毕,config client已经在启动了,并且config server还没有就绪,所以导致config client端连接失败,导致启动失败。

所以我暂时的解决方法是使用足够的容错和重试机制,比如从配置中心获取配置文件,服务消费者可以不断的重试直到连上为止,这里就用到了docker-compose 中的restart配置

  1. 修改连接的IP地址

默认情况下,Compose会为应用创建一个网络,服务的每个容器都会加入该网络中。
这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。

所以我们需要把之前用IP地址的配置都改成服务名,比如:

eureka:client:serviceUrl:defaultZone: http://cloud-eureka:8888/eureka/

还有如下:

spring:zipkin:enabled: truebase-url: http://cloud-zipkin:9411sender:type: websleuth:sampler:#收集追踪信息的比率,如果是0.1则表示只记录10%的追踪数据,如果要全部追踪,设置为1(实际场景不推荐,因为会造成不小的性能消耗)probability: 1rabbitmq:host: rabbitmqport: 5672username: guestpassword: guest
  1. 构建镜像

执行如下命令:

mvn clean install -pl cloud-eureka,cloud-config-server,cloud-zipkin,admin-server,cloud-zuul,cloud-hystrix-dashboard,cloud-turbine,cloud-service-member,cloud-service-order docker:build

我直接使用mvn clean install docker:build好像会把parent目录都构建了,所以失败了,所以我这里只能指定需要构建的子模块。

执行完毕之后就可以使用docker images查看,可以看到我们的镜像都构建出来了。

$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
cloud-demo/cloud-config-server       1.0                 237c8f8e725d        15 minutes ago      746MB
cloud-demo/admin-server              1.0                 dde41e011b46        16 minutes ago      743MB
cloud-demo/cloud-zipkin              1.0                 71246b3ccc2b        16 minutes ago      685MB
cloud-demo/cloud-zuul                1.0                 680a2ae0246b        16 minutes ago      739MB
cloud-demo/cloud-turbine             1.0                 c440eb63223c        16 minutes ago      728MB
cloud-demo/cloud-hystrix-dashboard   1.0                 9be879668dc6        16 minutes ago      709MB
cloud-demo/cloud-service-order       1.0                 c39a9362da20        16 minutes ago      742MB
cloud-demo/cloud-service-member      1.0                 54750b8f66e9        16 minutes ago      742MB
cloud-demo/cloud-eureka              1.0                 d1d25421ff11        16 minutes ago      731MB
rabbitmq                             management          4b23cfb64730        4 days ago          180MB
java                                 8                   d23bdf5b1b1b        2 years ago         643MB
  1. 执行docker-compose up命令

可以使用docker ps进行查看,可以看到我们的服务都启动起来了。

$ docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
ec8799529e40        cloud-demo/cloud-service-order:1.0       "java -Djava.securit…"   15 minutes ago      Up 13 minutes       0.0.0.0:8765->8765/tcp                                                                       spring-cloud-demo_ cloud-service-order_1
0861fb0178e3        cloud-demo/cloud-service-member:1.0      "java -Djava.securit…"   15 minutes ago      Up 13 minutes       0.0.0.0:8762->8762/tcp                                                                       spring-cloud-demo_ cloud-service-member_1
88e7b4c1548f        cloud-demo/cloud-zuul:1.0                "java -Djava.securit…"   15 minutes ago      Up 13 minutes       0.0.0.0:8769->8769/tcp                                                                       spring-cloud-demo_ cloud-zuul_1
bb8021f768b5        cloud-demo/cloud-config-server:1.0       "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:8090->8090/tcp                                                                       spring-cloud-demo_ cloud-config-server_1
534de73c2550        cloud-demo/cloud-turbine:1.0             "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:6100->6100/tcp                                                                       spring-cloud-demo_ cloud-turbine_1
2a741813c006        cloud-demo/admin-server:1.0              "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:8098->8098/tcp                                                                       spring-cloud-demo_ cloud-admin-server_1
5e509ee8e669        rabbitmq:management                      "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   spring-cloud-demo_ rabbitmq_1
c5622fac19bc        cloud-demo/cloud-zipkin:1.0              "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:9411->9411/tcp                                                                       spring-cloud-demo_ cloud-zipkin_1
5d09ecb673e7        cloud-demo/cloud-eureka:1.0              "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:8888->8888/tcp                                                                       spring-cloud-demo_ cloud-eureka_1
1bd620439bab        cloud-demo/cloud-hystrix-dashboard:1.0   "java -Djava.securit…"   15 minutes ago      Up 15 minutes       0.0.0.0:8766->8766/tcp                                                                       spring-cloud-demo_ cloud-hystrix-dashboard_1
  1. 测试
  • 查看eureka

  • 查看rabbitmq

  • 查看Admin Server Console

  • 分别访问我们的order还有member服务。

  • 查看zipkin

  • 查看Turbine

  • 测试refresh config server配置

这里可能会遇到一个问题,就是如果你的docker虚机设置的内存和CPU的配置如果太低的话,当启动多个容器的时候,可能会导致服务挂掉。所以先把docker的配置调高一点。可以通过docker info命令查看到配置信息。

还有就是在构建镜像的过程中如果报了如下的错误:

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.13:build (default-cli) on project cloud-eureka: Exception caught: Get https://registry-1.docker.io/v2
/: net/http: TLS handshake timeout -> [Help 1]
[ERROR]

原因是我们的镜像拉不下来,这个时候我们就需要去修改一下我们docker的拉取镜像地址,最好改成国内的镜像源,比如阿里云的镜像加速器地址。

我们可以使用docker info命令查看当前的镜像源地址

接下来我们介绍怎么修改我们的镜像源地址

  1. 首先使用如下命令进入docker machine
docker-machine ssh default
  1. 执行如下命令修改
sudo  sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=这里是你的镜像加速地址 |g" /var/lib/boot2docker/profile
  1. 然后使用exit命令退出docker machine
  2. 最后使用docker-machine restart default命令重启docker machine
  3. 使用docker info查看信息


源码:https://gitee.com/cckevincyh/spring-cloud-demo/tree/release-docker-compose-dockerfile

使用Maven插件构建Docker镜像

其实跟之前都是类似的,只是我们不需要使用Dokcerfile去构建镜像了,我们只需要修改maven插件的配置即可。

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><forceTags>true</forceTags><imageName>cloud-demo/${project.artifactId}:${project.version}</imageName><baseImage>java</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

然后执行如下命令就可以构建镜像了。

mvn clean install -pl cloud-eureka,cloud-config-server,cloud-zipkin,admin-server,cloud-zuul,cloud-hystrix-dashboard,cloud-turbine,cloud-service-member,cloud-service-order docker:build

然后最后就是执行docker-compose up命令。

源码:https://gitee.com/cckevincyh/spring-cloud-demo/tree/release-docker-compose/

参考

SpringCloud与Docker微服务架构实战-完整版.pdf

使用 Docker-Compose 编排容器

Docker Compose编排微服务

Docker | 第七章:Docker Compose服务编排介绍及使用

使用 Docker Compose 编排容器集群

如何写docker-compose.yml,Docker compose file 参考文档

Docker-compose编排微服务顺序启动解决方案

docker 镜像太多会导致无法成功启动容器

Maven多模块项目单独编译子模块项目时报错:Failed to execute goal on project/Could not resolve dependencies for project

Maven的-pl -am -amd参数学习

解决 docker: Error response from daemon: … : net/http: TLS handshake timeout.

源代码

https://gitee.com/cckevincyh/spring-cloud-demo/tree/release-docker-compose-dockerfile

https://gitee.com/cckevincyh/spring-cloud-demo/tree/release-docker-compose/

【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 使用Docker Compose编排Spring Cloud微服务相关推荐

  1. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 将微服务运行在Docker上

    文章目录 将微服务运行在Docker上 使用Maven插件构建Docker镜像 使用Maven插件读取Dockerfile进行构建 将插件绑定在某个phase执行 参考 源代码 将微服务运行在Dock ...

  2. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Spring Cloud Config Client 失败快速响应与超时重试

    文章目录 Spring Cloud Config Client 失败快速响应与重试 测试 参考 源代码 Spring Cloud Config Client 失败快速响应与重试 Spring Clou ...

  3. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 Spring Boot Test集成测试环境搭建

    文章目录 集成测试 @SpringBootTest的集成测试 Spring Boot Test集成测试环境搭建 参考 源代码 集成测试 集成测试(Integration Testing,缩写为INT) ...

  4. JAVA Cloud微服务项目实战课程 SpringBoot 2.x +SpringCloud 微服务课程

    课程目录 第1章 课程介绍 课程导学和学习建议 1-1 SpringCloud导学 1-2 获取源码说明 1-3 提问建议 1-4 点餐项目演示说明 第2章 微服务介绍 什么是微服务, 单体架构优缺点 ...

  5. Spring Boot与Docker(一):微服务架构和容器化概述

    本文讲的是Spring Boot与Docker(一):微服务架构和容器化概述,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列四部曲的第一篇,本篇将会对我们 ...

  6. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  7. 带有PostgreSQL的Docker Compose for Spring Boot应用程序

    在此博客文章中,您将学习如何使用PostgreSQL配置Spring Boot应用程序以与Docker Compose一起运行. 这篇博客文章涵盖: Spring Boot应用程序Dockerfile ...

  8. 从零开始学习docker(十)搭建WordPress+Mysql,为什么要用Docker Compose

    我们从这一节开始介绍一个非常非常重要的工具--Docker Compose,这个工具会经常使用. 先从一个案例介绍一下我们为什么要用Docker Compose. 案例:如何通过容器部署一个WordP ...

  9. Java微服务之Spring Boot on Docker,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. 机器学习模型 知乎_机器学习:模型评估之评估方法
  2. 智能,万亿维空间中的求解
  3. Linux下压力测试工具Webbench介绍
  4. android scrollview 底部控件,Android ScrollView和屏幕底部的按钮
  5. How to make a difference
  6. 47 MM配置-采购-条件-定价过程-定义方案确认
  7. 高级语言中的关键字:const用法分析
  8. mybatis 高级映射 - 一对多查询 - collection
  9. 将h.264视频流封装成flv格式文件(二.开始动手)
  10. 2021年安全生产模拟考试(全国特种作业操作证电工作业-继电保护模拟考试题库一)安考星
  11. C语言_循环队列具体实现
  12. 从零开始学习idea开发vue
  13. HHUOJ 1012 欧洲杯(水题)
  14. 【首次起用黑人模特的Prada】
  15. java基于微信小程序的投票系统 uniapp 小程序
  16. [JavaWeb实训Day3]__button_框架布局点击事件
  17. ZZULIOJ 1800: 少水群多刷题
  18. Linux花开五洲,争奇斗艳
  19. 计算机毕业设计ssm智创员工管理系统
  20. 基于arduino及PS2的麦克纳姆轮遥控小车

热门文章

  1. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)
  2. 【前端UI框架推荐】六个前端[web端]精致UI框架
  3. s6和thinkpad x1音频对比 (APX 音频分析仪)
  4. Fidder教程-数据介绍
  5. 计算机网络VLAN划分实验报告
  6. 快速将webp格式转换成jpg
  7. mooc作业怎么上传附件_适合团队协作的工作便签软件怎么在团队便签中上传附件文件?_纳图电脑维修...
  8. android studio 光标 输入法,解决IDEA2018.1.5或者Android Studio 3.0版本的输入法不跟随光标问题...
  9. socket的read和available()方法
  10. 《MySQL高级篇》数据库建模工具---PowderDesigner的使用教程