文章目录一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序四、思路分析1.各走各路1.docker-compose -f指定不同配置文件2.docker-compose up -d service-name指定服务名3.两种方式比较2. 等等我1.脚本2.如何使用3.执行结果五、关于depends_on一、Docker概述Docker 是一个开源的应用容器引擎基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中然后发布到任何流行的 Linux 机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口类似 iPhone 的 app,更重要的是容器性能开销极低。Docker的应用场景Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。二、Docker三剑客compose、machine 和 swarm是docker 原生提供的三大编排工具。1. Compose在实际生产环境中一个应用往往由许多服务构成而 docker 的最佳实践是一个容器只运行一个进程因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们定义这些容器如何相互关联。compose 应运而生。compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑起来。2. MachineDocker Machine 是一个简化Docker 安装的命令行工具。通过一个简单的命令行即可在相应的平台上安装 Docker为用户提供了灵活的功能使得用户可以在任一主机上运行 Docker 容器。简单说一个 Docker Machine 就是一个 Docker host 主机和经过配置的 Docker client 的结合体。3. SwarmSwarm 是 Docker 社区提供的原生支持 Docker 集群的工具。 它可以把多个 Docker 主机组成的系统转换成为单一的虚拟 Docker 主机。Swarm 对外提供两种 API。一种是标准的 Docker API例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等另一种是 Swarm 的集群管理 API用于集群的管理。Swarm工具本身不是很成熟不建议用在生产环境。而 Google 开源的Kubernetes是目前容器生态圈中最受欢迎的编排部署工具。三、简要需求1. 样例工程https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-servicegitclone https://gitee.com/00fly/microservice-all-in-one.git2. 代码模块模块功能说明microservice-eureka注册中心-microservice-front前端工程后台访问网关接口microservice-gateway网关路由、聚合接口文档microservice-movie微服务1-microservice-user微服务2-3. 调用方向前端工程front服务网关gateway微服务movie微服务user服务注册中心1服务注册中心24. 期望启动顺序① eureka -- ②user -- ③ movie -- ④ gateway -- ⑤front四、思路分析1.各走各路简单来说就是分组启动必须保证服务在同一网络内1.docker-compose -f指定不同配置文件springboot有一核心原则约定大于配置在compose也类似我们知道docker-compose中默认的配置文件为docker-compose.yml,这并不意味着我们只能使用此配置文件实际上我们可以通过类似docker-compose -f xxx.yml来指定。具体文件见https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service/docker/compose-network-step-by-step将此目录上传到安装了docker的lunix服务器目录依次执行0-4 sh镜像已经上传到阿里发现容器启动成功。2.docker-compose up -d service-name指定服务名具体文件见https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service/docker/compose-step-by-step全部的服务均在docker-compose.yml中指定服务均位于同一网络内。3.两种方式比较指定不同配置文件优点步骤清晰服务划分一目了然缺点需要提前指定网络后期调整服务启动顺序需要修改yml文件稍显麻烦维护不便。指定服务名优点统一使用默认compose配置文件后期调整服务启动顺序方便。2. 等等我借助wait-for.sh实现需要注意的是此脚本需要提前打包到镜像内。1.脚本wait-for.sh#!/bin/shTIMEOUT15QUIET0echoerr(){if[$QUIET-ne1];thenprintf%s\n$*12;fi}usage(){exitcode$1catUSAGE2Usage:$cmdnamehost:port [-t timeout] [-- command args] -q | --quiet Do not output any status messages -t TIMEOUT | --timeouttimeout Timeout in seconds, zero for no timeout -- COMMAND ARGS Execute command with args after the test finishes USAGEexit$exitcode}wait_for(){foriinseq$TIMEOUT;donc-z$HOST$PORT/dev/null21result$?if[$result-eq0];thenif[$#-gt0];thenexec$fiexit0fisleep1doneechoOperation timed out2exit1}while[$#-gt0]docase$1in*:*)HOST$(printf%s\n$1|cut-d:-f1)PORT$(printf%s\n$1|cut-d:-f2)shift1;;-q|--quiet)QUIET1shift1;;-t)TIMEOUT$2if[$TIMEOUT];thenbreak;fishift2;;--timeout*)TIMEOUT${1#*}shift1;;--)shiftbreak;;--help)usage0;;*)echoerrUnknown argument:$1usage1;;esacdoneif[$HOST-o$PORT];thenechoerrError: you need to provide a host and port to test.usage2fiwait_for$2.如何使用用法sh wait-for.sh {检测地址}:{检测端口} -- {检测成功后执行脚本}·举例如下shwait-for.sh www.baidu.com:80 --echobaidu is up具体文件见https://gitee.com/00fly/microservice-all-in-one/blob/master/micro-service/docker/compose-wait/docker-compose.yml执行restart.sh#!/bin/bashdocker-composedowndocker-compose--compatibilityup-ddockerstats3.执行结果启动eureka启动user启动movie启动gateway启动front我们也可以查看日志Operation timed out就是wait-for.sh打印的等待日志信息。五、关于depends_on有同学已经注意到在docker-compose.yml中 可以使用depends_on以下是一些关于 depends_on 的详解启动顺序通过在服务的配置中使用 depends_on您可以告诉 Docker Compose 在启动容器时按照指定的顺序启动服务。例如如果服务 A 依赖于服务 B 和服务 C则在启动时Docker Compose 会先启动服务 B 和服务 C然后才会启动服务 A。仅表示依赖关系depends_on 只表示依赖关系而不会等待依赖的服务完全可用。它只确保在依赖的服务启动后再启动当前服务。因此依赖的服务可能仍在进行初始化或准备阶段而不一定已经完全可用。如果需要等待服务完全可用可以结合使用其他工具或技术例如健康检查或等待脚本。无法保证健康状态depends_on 并不能保证依赖的服务在启动后处于健康状态。它只负责在启动时按照指定顺序启动服务但并不检查服务的健康状态或等待服务变为可用状态。对于检查服务健康状态可以使用其他机制例如使用健康检查命令或工具。并行启动默认情况下Docker Compose 会尽可能并行启动服务而不是完全按照 depends_on 指定的依赖关系顺序启动。这是因为 Docker Compose 会尝试最大化容器的并发启动以提高启动效率。如果需要强制按照依赖关系顺序启动请使用 depends_on 结合 restart 关键字的 condition: [“service_started”] 选项。综上所述depends_on 关键字允许您定义 Docker Compose 服务之间的依赖关系但它并不能保证服务的可用性或健康状态。有任何问题和建议都可以向我提问讨论,大家一起进步谢谢!-over-