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

【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 使用Docker Compose编排Spring Cloud微服务文章目录 DockerCompos 快速人门入门示例使用 DockerComose 编排 SpringCloud 微服务使用 Maven 插件读取 Dockerfile 进行构建使用 Maven 插件构建 Docker 镜像参考源代码 Docke

大家好,欢迎来到IT知识分享网。

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 ---> bd 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 ---> 0bef1 Successfully built 0bef1 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 0bef1 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:management hostname: rabbitmq ports: - "15672:15672" - "5672:5672" restart: always cloud-eureka: image: cloud-demo/cloud-eureka:1.0 hostname: cloud-eureka ports: - "8888:8888" restart: always cloud-config-server: image: cloud-demo/cloud-config-server:1.0 hostname: cloud-config-server ports: - "8090:8090" links: - cloud-eureka - rabbitmq depends_on: - cloud-eureka - rabbitmq restart: always cloud-zuul: image: cloud-demo/cloud-zuul:1.0 hostname: cloud-zuul links: - cloud-eureka - rabbitmq - cloud-zipkin ports: - "8769:8769" depends_on: - cloud-eureka - rabbitmq - cloud-config-server - cloud-zipkin restart: always cloud-service-member: image: cloud-demo/cloud-service-member:1.0 links: - cloud-eureka - rabbitmq - cloud-zipkin hostname: cloud-service-member ports: - "8762:8762" depends_on: - cloud-eureka - rabbitmq - cloud-config-server - cloud-zipkin restart: always cloud-service-order: image: cloud-demo/cloud-service-order:1.0 links: - cloud-eureka - rabbitmq - cloud-zipkin hostname: cloud-service-order ports: - "8765:8765" depends_on: - cloud-eureka - rabbitmq - cloud-config-server - cloud-zipkin restart: always cloud-admin-server: image: cloud-demo/admin-server:1.0 links: - cloud-eureka hostname: cloud-admin-server ports: - "8098:8098" depends_on: - cloud-eureka restart: always cloud-hystrix-dashboard: image: cloud-demo/cloud-hystrix-dashboard:1.0 hostname: cloud-hystrix-dashboard ports: - "8766:8766" restart: always cloud-turbine: image: cloud-demo/cloud-turbine:1.0 hostname: cloud-turbine ports: - "6100:6100" links: - cloud-eureka depends_on: - cloud-eureka restart: always cloud-zipkin: image: cloud-demo/cloud-zipkin:1.0 hostname: cloud-zipkin ports: - "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地址

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

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

还有如下:

spring: zipkin: enabled: true base-url: http://cloud-zipkin:9411 sender: type: web sleuth: sampler: #收集追踪信息的比率,如果是0.1则表示只记录10%的追踪数据,如果要全部追踪,设置为1(实际场景不推荐,因为会造成不小的性能消耗) probability: 1 rabbitmq: host: rabbitmq port: 5672 username: guest password: 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 9bedc6 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 ece40 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 2ac006 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 1bdbab 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/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128954.html

(0)
上一篇 2025-08-27 20:10
下一篇 2025-08-27 20:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信