• 离线版centos8环境部署迁移监控操作笔记


      嗨咯,前两天总结记录了离线版centos8下docker的部署笔记,今天正好是2021年的最后一天,今天正好坐在本次出差回家的列车上,车上没有上面事做,索性不如把本次离线版centos8环境安装的其他过程做一次总结记录,岂不美哉。

           Haha,文笔有限,技术更是有限,就当一次操作总结,如有说的不妥之处,欢迎指教,多多海涵。

    1.    背景说明

      开始之前,还是简单说明一下环境背景,不然看了一头雾水,不知所云,本次环境部署是基于离线centos8操作系统,以docker为容器,部署前端网站+业务API应用。关于离线版centos8 的docker部署在前一篇文章中已经做了总结,本次主要记录centos下的相关应用部署,包括:基础镜像迁移、业务API部署、服务监控。

    2.    基础镜像迁移

      本次环境部署涉及到的基础镜像包括:nginx、.netcore相关环境,基础镜像的迁移思路:找一台部署好的在线服务器环境,然后将镜像拷贝到离线环境即可,下面以nginx的迁移为例子,其他的都是依葫芦画瓢即可。

    2.1拷贝nginx镜像

      登录到部署了nginx的服务环境,通过执行以下命令即可拷贝nginx镜像

      

    docker save -o /home/installpack/nginx.zip nginx
    

      

      参数说明:docker save -o 【生成的镜像的存放路径】 【镜像名称】

      将生成好的镜像文件nginx.zip拷贝到离线服务器上,我一般还是放在/home/ installpack目录下。

    2.2服务器镜像还原

      多的不说少的不唠,直接执行以下命令即可:

    # 进入到镜像所在文件夹
    
    cd /home/installpack
    
    # 还原镜像
    
    docker load < nginx.zip
    
    # 查看镜像
    
    docker images
    

      

      看到下面的镜像列表有nginx,大功告成

     

      nginx的具体配置就不写了,根据自己实际需要配置即可

    3.    业务API部署

      其实API部署就简单了,直接将发布文件拷贝到服务器指定目录,生成镜像+运行镜像即可。

      我一般会写一个services.sh文件,并将其放在/home/sh/services.sh,把该服务器上涉及的所有服务都写成批处理命令,这样方便快速安装部署,具体文件内容如下:

    #!/bin/bash
    
    # 该命令分两部分:第一部分,全部重新部署安装;第二部分:指定服务部署安装
    
    restartContainers="$1" 
    
    if [ ! $restartContainers ]; then
    
        #重启全部服务
    
        #部署安装用户服务
    
        echo "用户服务启动中 ..."
    
        docker rm -f usermic && docker rmi user
    
        docker build -t user /home/project/user && docker run -d -m 1024M --memory-swap -1 --restart=always --name usermic -p 8081:8081 -v /home/app/user/Log:/app/Log -v /home/app/user/wwwroot:/app/wwwroot user
    
        echo "日志服务启动中 ..."
    
        docker rm -f logmic && docker rmi log
    
        docker build -t log /home/project/log && docker run -d -m 1024M --memory-swap -1 --restart=always --name logmic -p 8086:8086 -v /home/app/log/Log:/app/Log -v /home/app/log/wwwroot:/app/wwwroot log
       
        # 依葫芦画瓢部署其他服务
    
     else
    
           #启动指定的服务,不同服务间通过,链接
    
            #对IFS变量 进行替换处理
    
            OLD_IFS="$IFS"
    
            IFS=","
    
            restartContainersArray=($restartContainers)
    
            IFS="$OLD_IFS"
    
            for var in ${restartContainersArray[@]}
    
            do
    
               case $var in
    
                "usermic")
    
                            echo "用户服务启动中 ..."
    
                            docker rm -f usermic && docker rmi user
    
                            docker build -t user /home/project/user && docker run -d -m 1024M --memory-swap -1 --restart=always –name usermic -p 8081:8081 -v /home/app/user/Log:/app/Log -v /home/app/user/wwwroot:/app/wwwroot user
    
                            ;;             
    
                    "logmic")
    
                            echo "日志服务启动中 ..."
    
                            docker rm -f logmic && docker rmi log
    
                            docker build -t log /home/project/log && docker run -d -m 1024M --memory-swap -1 --restart=always --name logmic -p 8086:8086  -v /home/app/log/Log:/app/Log -v /home/app/log/prologs:/app/prologs -v /home/app/log/wwwroot:/app/wwwroot log
    
                            ;;
    
                    # 依葫芦画瓢部署其他服务
    
                    esac
    
            done
    
    fi
    
     # 查看服务容器是否正常运行
    
    docker ps -a
    

      

      服务启动命令说明:其实run命令相信您一点都不陌生,只是有三点个需要注意:

    • --restart=always不要漏掉,他会帮助您重启docker时自动启动服务
    • -m 1024M 最好配置,他是设置容器的最大消耗内存,当内存消耗达到设定砸值,服务会自动重启,具体值根据自身服务器环境配置。
    • -v /宿主机目录:/容器目录 文件挂载不能少,将配置文件、日志文件、数据文件、静态资源文件最好挂载映射到物理主机,避免容器销毁到不回来数据,具体要挂载那一些文件,根据具体的服务自己定义。

    文件执行示例说明:

    # 初始化部署全部服务
    
    sh /home/sh/services.sh
    
    # 部署安装某一个服务,如用户服务:
    
    sh /home/sh/services.sh usermic
    
    # 部署安装多个服务,如用户服务、日志服务:
    
    sh /home/sh/services.sh usermic, logmic
    

      

    业务部署方式说明:有很多大佬在部署的时候,直接将整个API服务挂载的物理机,除第一次初始化创建的容器服务需要用到上述命令外,其他升级只需要将更新包上传到指定挂载的物理机,重启对应的容器即可,这是一个很好的方法。

    4.    服务监控

    服务监控,其实有很多可视化的第三方工具来完成,我还是用的最原始的方式来监控,那就是通过centos crontab的定时任务来监控容器和服务响应来实现。
    具体监控思路分两个方面的服务监控:基础服务监控、业务服务监控
    基础服务监控:通过监听容器状态是否正常,如果不正常直接重启一次服务,如:nginx等
    业务服务监控:业务服务没有直接通过监控容器状态来实现,因为有遇到过,容器正常运行,但是服务不能提供对外服务,这样监控也是徒劳的,所以业务服务直接调用服务的健康检查接口,如果不能调通,那么说已经不能正常提供服务,直接执行services.sh来初始化对应的服务。

    4.1监控命令文件准备

    监控命令文件我一般也会在每一个服务上写一个/home/sh/serviceGuard.sh,将该服务对应的所有服务监控写在此文件中,具体文件内容如下:
    #!/bin/sh
    # 先定义实现检查的方法
    # 检查一个镜像是否存在
    function checkContainerStats
    {
               exist=`docker inspect --format '{{.State.Running}}' $1`
               if [ "${exist}" != "true" ]
               then
                     return 0 
               else
                      return 1 
               fi
    }
     
    # 检查一个服务是否正常提供服务(通过健康检查地址来判断是否正常提供服务)
    function checkContainerHealthStats
    {
       webUrl="$1"
       serviceCode=$(curl -I -m 10 -X GET -o  -s -w %{http_code} $webUrl)     
               if [ $serviceCode -eq 200 ]
               then
                      return 1
               else
                      return 0
               fi
    }
     
    # 根据名称检查容器的运行状态,如果不存在,并重启
    function checkContainer
    {
        #容器名称
               containerName="$1"
               echo ""
               echo "开始检查${containerName}的运行状态"
     
               # 查看进程是否存在
               # 判断服务是否存在,如果不存在,那么直接重启一次
               if checkContainerStats ${containerName}
               then
                     echo "服务断开,开始重启服务"
                     docker start ${containerName}
                     echo "重启完成"
               else
                     echo "正常服务中..." 
               fi
    }
     
    # 通过检查检查地址,检查服务是否正常提供服务,并做自动修复
    function checkContainerHealth
    {
               #容器名称
               containerName="$1"
               echo ""
               echo "开始检查${containerName}的运行状态"
     
               # 判断服务是否存在,如果不存在,那么先直接重启一次,重启后,在检查一次,如果还是不存在,那么直接删除掉容器重新创建容器
               if checkContainerHealthStats $2; then
                     echo "服务断开,开始重启服务" 
                     docker start ${containerName}
                     # 在通过进程检查一次是否重启成功,如果失败,那么直接删掉,镜像,容器,重启创建
                     if checkContainerStats ${containerName}; then
                          echo "重启失败,直接全新部署" 
                          sh /home/sh/services_22.sh ${containerName}
                          echo "全新部署完成" 
                       else
                          echo "重启完成"
                    fi
                    else
                          echo "正常服务中..." 
                   fi
              }
     
     
      #检查分两部分检查,服务检查+基础容器检查
     
      now=`date +"%Y-%m-%d %H:%M:%S"`
      echo
      echo "${now} 开始检查docker中各个容器的对应的进程是否存在"
      #检查基础服务
      checkContainer nginx
     
      #检查每一个业务服务的运行情况
      # 检查用户服务
      checkContainerHealth usermic http://localhost:8081/api/Consul/heathle
      # 检查日志服务
      checkContainerHealth logmic http://localhost:8086/api/Consul/heathle
      #其他服务
    

      

    4.2启动监控定时任务

    多的不说少的不唠,直接执行以下命令即可:

    进入到 centos任务设置界面

                  

    crontab -e
    
     #所有任务检查都是每一分钟检查一次
    
     * * * * * sh /home/sh/ serviceGuard.sh >> /var/log/cron_log_$(date +\%Y-\%m-\%d).log 2>&1
    
    / 退出保存后 重启centos
    
    # 重新加载crond 重启crond 设置crond为开机启动
    /sbin/service crond reload && /sbin/service crond restart && chkconfig crond on
    

      

    5.    几个注意点

    • 容器不能和外部服务通讯:如果数据库连接等,此时最简单粗暴的方式就是:直接关闭宿主机的防火墙,具体命令如下:
    # 关闭防火墙
    
    systemctl stop firewalld.service
    
    # 设置开机禁止启动防火墙,这一句不能忽视,不然重启服务器又开启了
    
    systemctl disable firewalld.service
    

      

    • 容器连接orcel数据库问题,需要配置时区,不然orcle连接会报时区错误,时区设置直接在Dockerfile文件中加上如下配置即可:

    # 设置时区,是为了能够访问orcel数据库

    ENV TZ=Asia/Shanghai
    
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    

      

    6.    结束

    好了,时间刚刚好,也快要到站了,收拾收拾准备下车,写的不好,希望有帮助就好。

    END
    为了更高的交流,欢迎大家关注我的公众号,扫描下面二维码即可关注,谢谢:

  • 相关阅读:
    RASP | 远程Java应用的RASP调试教程
    软考题目
    软考 错题
    rds下载备份集在ECS上恢复(解压到mysql data目录)
    mongodb常用查询
    rds下载备份集在ECS上恢复(解压目录与mysql data目录不同)
    C#调用webservice接口
    org.springframework.web.client.HttpClientErrorException: 429 Too Many Requests
    Jackson: java.util.LinkedHashMap cannot be cast to X
    使用EasyExcel导入excel中的日期格式数据时获取到的却是一个数字
  • 原文地址:https://www.cnblogs.com/xiaoXuZhi/p/15752631.html
Copyright © 2020-2023  润新知