我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker-compose编排微服务顺序启动

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker-compose编排微服务顺序启动

docker-compose可以方便组合多个 docker 容器服务, 但是, 当容器服务之间存在依赖关系时, docker-compose 并不能保证服务的启动顺序。docker-compose 中的 depends_on 配置是容器的启动顺序, 并不是容器中服务的启动顺序。本章将详细叙述如何解决 docker-compose 顺序启动微服务的问题。

 

微服务清单

服务名端口服务说明依赖服务启动优先级
eureka-service8761服务注册与发现---1
auth-service8888认证服务eureka-service2
user-service8763用户服务eureka-service2
gateway-service8081网关服务eureka-service2

 

 

 

 




 

 

说明:eureka需要第一个启动,其他微服务必须等待eureka启动之后,才能启动。否则无法注册服务!

 

针对这个问题,docker-compose官方给的建议是,通过wait-for-it.sh脚本来控制。

简单来说,这个脚本就是探测某个依赖的服务的tcp端口是否开放,否则一直等待,直到端口探测成功,才会启动后面的命令。

关于wait-for-it.sh的使用,请参考链接:

https://blog.csdn.net/wuzhong8809/article/details/82500722

 

环境说明

本文采用一台centos 7.6,通过docker-compose启动java spring cloud

ip地址:192.168.128.130

 

但是我测试了一下,使用wait-for-it.sh探测eureka的8761端口。发现虽然端口探测成功了,但是并不代表eureka完全启动好了。因此此时无法访问eureka的页面!

那么如何判断eureka完全启动好了呢?很简单,只需要访问eureka页面,http状态码为200,就表示启动好了。

curl -I -m 10 -o /dev/null -s -w %{http_code}  http://eureka-server:8761

 

那么问题来了,还是得需要自己写检查脚本才行。

check_eureka.sh

#!/bin/bash

while :
    do
        # 访问eureka注册中心,获取http状态码
        CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}  http://kitedge-eureka-server:8761`
        # 判断状态码为200
        if [[ $CODE -eq 200 ]]; then
            # 输出绿色文字,并跳出循环
            echo -e "\033[42;34m kitedge-eureka-server is ok \033[0m"
            break
        else
            # 暂停1秒
            sleep 1
        fi
    done

# while结束时,也就是eureka启动完成后,执行容器中的run.sh。
bash /run.sh

说明:访问eureka注册中心,获取http状态码。当为200时,跳出循环,执行其他容器中的run.sh。

否则就一直循环,直到eureka页面正常为止。

 

目录结构

/opt/springcloud 目录结构如下:

./
├── auth
│   ├── auth-server.jar
│   ├── dockerfile
│   ├── repositories
│   └── run.sh
├── check_eureka.sh
├── docker-compose.yml
├── eureka
│   ├── dockerfile
│   ├── eureka-server.jar
│   ├── repositories
│   └── run.sh
├── gateway
│   ├── dockerfile
│   ├── gateway-server.jar
│   ├── repositories
│   └── run.sh
└── user
    ├── dockerfile
    ├── repositories
    ├── run.sh
    └── user-service.jar

这里有4个微服务

 

docker-compose.yml

version: '3'
services:
  eureka-server:
    image: eureka-server:1
    container_name: eureka-server
    build: ./eureka
    volumes:
      - ./check_eureka.sh:/check_eureka.sh
      - /data/log/tomcat:/data/log/tomcat
      - /data/file:/data/file
    environment:
      - JVM=128m
    ports:
      - "8761:8761"
    networks:
      test_net:
        aliases:
          - eureka-server
    restart: always
    command: ["bash","/check_eureka.sh"]
    healthcheck:
      test: "/bin/netstat -anpt|grep 8761"
      interval: 30s
      timeout: 3s
      retries: 1

  auth-server:
    image: auth-server:1
    container_name: auth-server
    build: ./auth
    volumes:
      - ./check_eureka.sh:/check_eureka.sh
      - /data/log/tomcat:/data/log/tomcat
      - /data/file:/data/file
    environment:
      - JVM=128m
    ports:
      - "8888:8888"
    networks:
      test_net:
        aliases:
          - auth-server
    restart: always
    depends_on:
      - "eureka-server"
    command: ["bash","/check_eureka.sh"]
    healthcheck:
      test: "/bin/netstat -anpt|grep 8888"
      interval: 30s
      timeout: 3s
      retries: 1

  user-service:
    image: user-service:1
    container_name: user-service
    build: ./user
    volumes:
      - ./check_eureka.sh:/check_eureka.sh
      - /data/log/tomcat:/data/log/tomcat
      - /data/file:/data/file
    environment:
      - JVM=128m
    ports:
      - "8763:8763"
    networks:
      test_net:
        aliases:
          - user-service
    restart: always
    depends_on:
      - "eureka-server"
    command: ["bash","/check_eureka.sh"]
    healthcheck:
      test: "/bin/netstat -anpt|grep 8763"
      interval: 30s
      timeout: 3s
      retries: 1

  gateway-server:
    image: gateway-server:1
    container_name: gateway-server
    build: ./gateway
    volumes:
      - ./check_eureka.sh:/check_eureka.sh
      - /data/log/tomcat:/data/log/tomcat
      - /data/file:/data/file
    environment:
      - JVM=128m
    ports:
      - "8081:8081"
    networks:
      test_net:
        aliases:
          - gateway-server
    restart: always
    depends_on:
      - "eureka-server"
    command: ["bash","/check_eureka.sh"]
    healthcheck:
      test: "/bin/netstat -anpt|grep 8081"
      interval: 30s
      timeout: 3s
      retries: 1

networks:
    test_net:
      external: true

参数解释:

image:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

container_name:容器名称,相当于docker run --name xxx,里面的--name参数。

build:指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。

volumes:挂载一个目录或者一个已存在的数据卷容器,相当于docker run -v xxx:xxx里面的-v参数。

environment:环境变量,相当于docker run -e xxx=xxx里面的-e参数。

ports:映射端口,相当于docker run -p xx:xx里面的-p参数。

networks:网络设置,这里表示连接test_net网桥,aliases表示设置别名。相当于docker run -it --network xx --network-alias xxx

restart:重启方式,相当于docker run --restart里面的--restart参数。

depends_on:指定依赖于哪个服务

command:覆盖容器启动后默认执行的命令,相当于docker run xxx /bin/bash里面最后一段命令。

healthcheck: 判断容器的状态是否正常
设置选项:

  • test:测试命令

  • --interval=DURATION (default: 30s),间隔

  • --timeout=DURATION (default: 30s), 超时时间

  • --start-period=DURATION (default: 0s),初始化时间

  • --retries=N (default: 3),当连续失败指定次数后,容器状态会变成unhealthy

 

 这里主要介绍eureka目录下的几个文件。

dockerfile

FROM mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
ADD eureka-server.jar /
ADD run.sh /
RUN chmod 755 run.sh && mkdir -p /data/log/tomcat /data/file

EXPOSE 8761
ENTRYPOINT [ "/run.sh"]


repositories

#https://mirrors.aliyun.com/alpine/v3.6/main/
#https://mirrors.aliyun.com/alpine/v3.6/community/
#aliyun
https://mirrors.aliyun.com/alpine/v3.6/main/
https://mirrors.aliyun.com/alpine/v3.6/community/

run.sh

#!/bin/sh

java -Xms${JVM} -Xmx${JVM} -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /eureka-server.jar

再来看auth下的几个文件。

dockerfile

FROM mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
ADD auth-server.jar /
ADD repositories /etc/apk/repositories
ADD run.sh /
RUN chmod 755 run.sh && mkdir -p /data/log/tomcat /data/file && apk update && apk add bash curl

EXPOSE 8888
#ENTRYPOINT [ "/run.sh"]

注意:这里注释掉了ENTRYPOINT ,因为它由check_eureka.sh脚本来启动。注意看此脚本的最后一行,它就是来执行run.sh的。

 

repositories

内容同上,这里就不重复贴了

 

run.sh

#!/bin/sh

java -Xms${JVM} -Xmx${JVM} -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /auth-server.jar

另外2个微服务,user和gateway。和auth也是类似的,只不过dockerfile和run.sh里面的jar包名不一样,其他内容都是一样的。

 

启动服务

创建bridge网络

docker network create test_net

一切准备就绪了,先build,再启动。

cd /opt/springcloud
docker-compose build
docker-compose up -d

等待几分钟,查看容器状态

# docker-compose ps
     Name                   Command                 State               Ports         
--------------------------------------------------------------------------------------
auth-server      bash /check_eureka.sh           Up (healthy)   0.0.0.0:8888->8888/tcp
eureka-server    /run.sh bash /check_eureka.sh   Up (healthy)   0.0.0.0:8761->8761/tcp
gateway-server   bash /check_eureka.sh           Up (healthy)   0.0.0.0:8081->8081/tcp
user-service     bash /check_eureka.sh           Up (healthy)   0.0.0.0:8763->8763/tcp

 

访问eureka注册中心

http://192.168.128.130:8761/

 

效果如下:

1.png

 

 

 

 

本文参考连接:

https://blog.csdn.net/wuzhong8809/article/details/82500722

https://www.jianshu.com/p/d2f39703bcb5


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Docker-compose编排微服务顺序启动

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Docker-compose编排微服务顺序启动

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

怎么使用Docker Compose进行服务编排

这篇文章主要为大家展示了“怎么使用Docker Compose进行服务编排”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Docker Compose进行服务编排”这篇文章吧。一、什么是D
2023-06-04

改变Windows服务的启动顺序

要改变Windows服务的启动顺序,只要修改Windows的注册表就可 以了。任何Windows服务的注册信息可以在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
2023-05-24

oracle服务器启动的顺序是什么

Oracle服务器启动的顺序如下:1、确保操作系统已经启动。2、启动监听器(LSNRCTL)。3、启动Oracle数据库实例。4、启动Oracle Enterprise Manager数据库控制台(EMCTL)。在启动Oracle数据库实例
2023-03-22

Linux下如何管理系统服务启动顺序

在Linux下,有多种方法可以管理系统服务的启动顺序使用systemd:Systemd是现代Linux发行版的默认初始化系统,它可以管理服务的启动顺序。要使用systemd管理服务启动顺序,请执行以下操作:创建或编辑服务的systemd单元
Linux下如何管理系统服务启动顺序
2024-09-25

怎么设置CentOS服务的开机启动顺序

本篇内容介绍了“怎么设置CentOS服务的开机启动顺序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!打开/etc/init.d下的脚本,查找
2023-06-10

docker-compose启动redis多机集群的实现(6台服务器3主3从)

目录1. 环境说明2. 集群部署Redis-node-1redis-node-2redis-node-3redis-node-4redis-node-5redis-node-63. 初始化4. 测试1. 环境说明节点IPredis-nod
2022-07-13

shell如何编写nginx服务启动程序

本篇文章为大家展示了shell如何编写nginx服务启动程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/
2023-06-05

如何修改服务器中各种硬盘卡的启动顺序

小编给大家分享一下如何修改服务器中各种硬盘卡的启动顺序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容是:1,复制内核cp /boot/initrd-2.6.9-34.EL.img /boot/initrd-2.6.
2023-06-04

操作系统容器编排与微服务架构:如何实现完美结合,让你的应用程序更加灵活

本文将深入探讨操作系统容器编排与微服务架构的完美结合,并通过演示代码,详细介绍如何在实际应用中实施,从而让应用程序更加灵活、高效。
操作系统容器编排与微服务架构:如何实现完美结合,让你的应用程序更加灵活
2024-02-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录