zoukankan      html  css  js  c++  java
  • docker容器化单机应用

    环境准备

         

         

      Dockerfile所在的目录不能包含其它不要的文件 否则会连不要的文件一起打包的docker镜像中

    FROM 192.168.30.113/laboratory/c7-systemd-ssh-3322:7.8.2003
    RUN yum -y install net-tools libaio-devel.x86_64 numactl ntpdate openssl tar zip;yum clean all
    RUN ntpdate time1.aliyun.com
    WORKDIR /opt
    ADD taishi-deploy-docker.tar.gz .
    WORKDIR /opt/taishi-deploy-docker
    RUN sh ./setfile.sh script
    WORKDIR /opt/taishi-deploy-docker/script
    CMD ./setup.sh
    Dockerfile
    sudo docker build -t 192.168.20.113/taishiganzhi/siem .
    sudo docker push 192.168.20.113/taishiganzhi/siem
    build.sh

     1.把目录压缩成包

         tar -zcvf taishi-deploy-docker.tar.gz ./taishi-deploy-docker/

     2.把压缩包打成镜像并推送到仓库

        sh build.sh

    容器启动问题

         在dockerfile中指定了CMD  CMD执行的是自己的install脚本  install.sh在执行完成后容器默认就会自动停止掉

         WORKDIR /opt/taishi-deploy-docker/script
         CMD ./install.sh

         造成的现象就是容器会被不断的重启

         docker和supervisor一样都只能管理前台进程

        要解决这个问题就必须要使install.sh一直处于执行状态并且日志一直要输出到前台终端中

        容器处于running状态并不代表已经执行完CMD脚本 running的时候可以查看安装日志

        

       这些标准输出都是可以通过docker logs来查看的

    容器启动方案

          1.接收启动环境变量

           function UpdateIp()
           {
               sed -i 's/IP=__ip__/IP='$host_ip'/' ../../conf/install_config.ini
           }

          2.启动容器时候传递环境变量

           

            3.把前台进程变成后台进程

    #执行总入口函数
    function Install()
    {
        echo -e "33[32m=========================================================================33[0m"
        echo -e "33[32m	        Start to install 态势感知项目  33[0m"
    
     
    
        os_version=`cat /etc/redhat-release | grep -oE '[0-9]+.[0-9.]+'`
        os_major_version=${os_version:0:1}
    
        MemTotal=`free -m | grep Mem | awk '{print $2}'`
        let MemTotal_G=$MemTotal/1024
    
        echo -e "System: CentOS $os_version"
        echo -e "Memory is: $MemTotal_G GB "
    
        Check_OS_Version
        Check_Python_Version
        Handler_Config
        
    
        #如果以root用户启动并且当前机器安装es,则声明es用户,用于安装es
        if [[ ${USER} == "root" ]]  && [[ ${MODULES} =~ .*elasticsearch.* ]]; then
            export ES_USER="elasticsearch"
        fi
    
        Check_user
    
        if [[ ${MODULES} =~ .*system_tools_config.* ]];then
            Install_System_Tools_Config
        fi
    
        Install_Module
        echo "Success taish" > ${INSTALL_DIR}/result
        echo -e "33[32m	       Congratulation, Installation completed!!!!!  33[0m"
        echo -e "33[32m=========================================================================33[0m"
        
    }
    install.sh

           4.在增加一个前台进程

    #!/bin/bash
    
    source ./utils.sh
    __ReadINI ../conf/install_config.ini
    
    nohup ./install.sh 1>./install.log 2>&1 & echo $! > command.pid
    resFile=${INSTALL_DIR}/result
    echo $resFile
    while ((i<=20))
     do
     if [ ! -f "$resFile" ]; then
       echo "starting........."
     else
       echo "start up siem"
       ps -ef | grep elastic | awk '{print $2}' | xargs kill -9
       servicectl start taishi
       tail -f ./install.log
       break
     fi
     sleep 30
     ((i++))
    done
    setup.sh

      此方案适合容器自启动 但是部署在虚拟主机上的时候却不能正常

    虚拟机服务自启动方案

          由于虚拟机运行效率比较快 需要在执行的的时候设置一段时间的睡眠

    #!/bin/bash
    
    source ./utils.sh
    __ReadINI ../conf/install_config.ini
    
    nohup ./install.sh 1>./install.log 2>&1 & echo $! > command.pid
    resFile=${INSTALL_DIR}/result
    echo $resFile
    while ((i<=20))
     do
     if [ ! -f "$resFile" ]; then
       echo "starting........."
     else
       echo "start up siem"
       ps -ef | grep elastic | awk '{print $2}' | xargs kill -9
       servicectl start taishi
       tail -f ./install.log
       break
     fi
     sleep 30
     ((i++))
    done
    原脚本
    #!/bin/bash
    
    source ./utils.sh
    __ReadINI ../conf/install_config.ini
    
    nohup ./install.sh 1>./install.log 2>&1 & echo $! > command.pid
    resFile=${INSTALL_DIR}/result
    echo $resFile
    while ((i<=20))
     do
     if [ ! -f "$resFile" ]; then
       echo "starting........."
     else
       kill -9 `cat command.pid`
       sleep 60
       echo "start up siem"
       ps -ef | grep elastic | awk '{print $2}' | xargs kill -9
       sleep 60
       systemctl start taishi
       sleep 30
       break
     fi
     sleep 30
     ((i++))
    done
    新脚本

     成功登录

        

       在同一个进程中kill其它进程的时候需要sleep一段时间 否则会由于执行速度太快导致kill的时机太超前造成一些异常问题

  • 相关阅读:
    Ajax 学习笔记
    StringBulider简单用法
    asp.net 发送邮件
    log4net日志组件
    Web.Config文件详解
    关闭discuzX3.2注册页面的注册邮箱验证
    Oracle 序列(sequence)的创建、修改及删除
    MySQL 和 Oracle 主键自增长
    EL(表达式)语言的几种运算符
    SQL:select case when 的用法
  • 原文地址:https://www.cnblogs.com/yxh168/p/13600072.html
Copyright © 2011-2022 走看看