docker项目切换、重启脚本

  • 背景
  • 具体操作
    • nginx配置
      • 配置文件1
      • 配置文件2
  • 编写nginx替换脚本(用来执行端口替换)
  • 编写启动脚本
  • dockerfile文件正常编写
  • 给脚本授权
  • 执行./start脚本

背景

项目部署docker中,更新项目时,需要将原原来的容器停止,再启动新的容器,这样会有一个空窗期,导致不可用
解决方案: 映射不同的端口并启动新的容器,将nginx转发到新容器,停止旧容器

具体操作

说明

  1. nginx配置文件不能放默认nginx.conf中
  2. 启动脚本start.sh中project_name不能有包含关系(在同一台服务器,如果有包含关系,将会停止掉包含的容器)
  3. 项目启动时输入的端口必须存在于nginx配置文件upstream-app.conf中

nginx配置

配置文件1

名称任意,示例app.conf

server {listen       80;# 修改为你自己的域名server_name xx.venny.cn;location / {proxy_set_header Host $host;root /app/html/;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;try_files $uri $uri/ /index.html;index /index.html;}location /api/ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;add_header Access-Control-Allow-Methods *;add_header Access-Control-Allow-Origin $http_origin;# 与自定义的保持一致proxy_pass http://stream-app/;}
}

配置文件2

名称任意,示例:upstream-app.conf

# 自定义upstream名
upstream stream-app {
# server 127.0.0.1:8000 weight=10;
# server 127.0.0.1:8001 weight=10;
# server 127.0.0.1:8002 weight=10;
# server 127.0.0.1:8003 weight=10;
# server 127.0.0.1:8004 weight=10;
# server 127.0.0.1:8005 weight=10;
# server 127.0.0.1:8006 weight=10;
# server 127.0.0.1:8007 weight=10;
# server 127.0.0.1:8008 weight=10;
# server 127.0.0.1:8009 weight=10;
}

编写nginx替换脚本(用来执行端口替换)

名称为replace.sh

#!/bin/bash
port=$1
conf_name=$2
cat $conf_name | while read l
doif [[ $l =~ "127.0.0.1:$port" ]];then#去除#号echo ${l##*#}elif  [[ $l =~ "server" ]];then#添加#号if [[ !($l =~ '#') ]];thenecho '# '$lelseecho $lfielseecho $lfi
done

编写启动脚本

start.sh


#/bin/bashcheck_y(){if [ -n "$1" ] && [ "$1" = 'y' ];thenecho 1elseecho 0fi
}
# 指定项目nginx配置文件位置,根据实际位置填写
ng_path=/etc/nginx/
# 指定项目upstream配置文件名称
ng_conf_name=upstream-qin.conf
# 指定项目名称
project_name=app
# 版本默认取当前日期
version=$(date +%Y%m%d%H%M%S)
echo '当前版本号:'$versionread -rp "请输入启动端口号:" portecho '当前启动端口:'$portecho "开始构建容器"
docker build -t $project_name:$version .
echo "容器构建成功!"
sleep 5echo "容器启动中...."
# 健康检查(接口/health必须存在,否则健康检查失败)、及启动项目,容器启动端口固定8080
container_full_id=$(docker run \
--health-cmd="curl --fail localhost:8080/health || exit 1" \
--health-interval=5s \
--health-retries=15 \
--health-timeout=10s \
-itd -p $port:8080 --name=$project_name$version -v /app/logs:/logs -v /etc/localtime:/etc/localtime $project_name:$version)echo "容器启动完毕...."container_id=$(echo $container_full_id|cut -b 1-12)echo "容器id为$container_id"echo '开始健康检查'health=1while [[ -z "$(docker ps -a -f id=${container_id} -f health=healthy | awk 'NR>1 {print $1}')" ]]
doecho '执行中....'if [[ "$(docker ps -a -f id=${container_id} -f health=unhealthy | awk 'NR>1 {print $1}')" == $container_id ]];thenecho '健康检查失败'health=2breakfisleep 5;
doneif [[ $health != 1 ]];thenexit
fiecho '健康检查成功'sleep 3echo "开始修改nginx配置"sleep 1
# 替换nginx upstream文件
./replace.sh $port ${ng_path}${ng_conf_name} > ${project_name}.ng.conf.tempcat ${project_name}.ng.conf.temp > ${ng_path}${ng_conf_name}rm -f ${project_name}.ng.conf.tempecho 'nginx配置修改成功'echo '当前配置:'cat ${ng_path}${ng_conf_name}sleep 2read -rp '是否重启nginx  y/n:' reload_ngxif [ "$(check_y $reload_ngx)" = "1" ];thennginx -s reloadecho '重启nginx'
elseexit
fisleep 1
echo "开始关闭旧容器"sleep 10if [ -n "$container_id" ];then
close_containers=$(docker ps |grep $project_name|grep -v $container_id|awk '{print "docker rm -f "$1}'|/bin/bash)echo $close_containersfor cc in $close_containers
doecho "关闭容器$cc"
donefiread -rp '是否删除旧镜像y/n:' del_imgsif [ "$(check_y $del_imgs)" = "1" ];thenecho "开始删除原镜像"sleep 1docker images|grep -v $version|grep $project_name|awk '{print "docker rmi -f "$1":"$2}'|/bin/bash
fi

dockerfile文件正常编写

省略

给脚本授权

chmod +x start.sh

执行./start脚本

./start

根据提示输入端口号(端口号upstream-app中必须存在),依次输入y,y即可

docker项目切换(nginx)、重启shell 脚本相关推荐

  1. pomelo php,Nginx 502 Bad Gateway 自动重启shell脚本

    星期三, 2013-08-14 | Author: LeeAuthor: Lee Name: lee Email: service@i5a6.com Site: https://www.pomelol ...

  2. Spring Boot 项目部署方案 /打包 + Shell 脚本部署详解,稳的一批

    本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assemb ...

  3. 使用redis4.0.1和redis-cluster搭建集群并编写重启shell脚本

    1.删除机器上原有的redis2.8 关闭redis-server killall -9 redis-server 查找redis文件所在目录 which redis 删除相关文件 rm -rf re ...

  4. mysql命令面板数据更改_宝塔面板数据库自动停止解决办法,宝塔面板MySQL数据库自动重启shell脚本...

    宝塔的数据库经常性自动停止,是因为网站频繁的请求数据库,而服务器内存又不足,为了保证服务器不彻底卡死,保护性的自动停止数据库,特别是有些程序比如wordpress的数据库查询次数尤为突出,wordpr ...

  5. shell root切换oracle_细说Shell脚本(一)

    作为一个开发者,我们会经常用到shell脚本来解决问题,无论是后端开发工程师还是运维人员,都离不开shell的使用.但是我们对shell脚本大部分都是应用阶段,下面我们来详细地介绍一下shell脚本的 ...

  6. bt面板mysql经常停止_宝塔面板数据库经常自动停止解决办法,自动重启shell脚本...

    宝塔的数据库经常性自动停止,是因为网站频繁的请求数据库,而服务器内存又不足,为了保证服务器不彻底卡死,保护性的自动停止数据库,特别是有些程序比如wordpress的数据库查询次数尤为突出,wordpr ...

  7. Jenkins(6) jenkins.war(运行/停止/重启) shell脚本

    前言 本文主要编写一个shell脚本来实现jenkins.war的运行/停止/重启 实现 jenkins.sh 可查看:https://gitee.com/zhengqingya/shell 温馨小提 ...

  8. html5执行shell,利用nginx执行Shell 脚本

    通过远程url调用 首先自行安装openresty,不做介绍了就. 假如我们安装路径为:/southtv/openresty 1 首先安装sockprocgit clone https://githu ...

  9. Linux下安装Redis php-redis扩展 redis重启shell脚本 超详细!

    前言 前面刚写过nosql其中三款热门产品的对比,这次主要写关于Redis的一些事情,Redis的介绍.安装以及扩展(php-redis,因为我是phper)安装等等.同时是写给我的朋友(cccjjj ...

最新文章

  1. hdu5185 dp:和为n且满足后一项是前一项或者+1的数列个数
  2. 读取pandas修改单列数据类型
  3. HD 1213 How Many Tables(裸 并查集)
  4. android bitmap上传服务器,Android 上传图片到服务器时将bitmap转换为byte[]最后转换为String...
  5. 清爽登录界面html,基于css3实现扁平简洁清爽的登录注册页面代码
  6. 文字在div中的垂直居中问题 div在页面中的水平垂直居中问题 vertical-align ??????
  7. sklearn实战之决策树
  8. 《Excel高手捷径:一招鲜,吃遍天》一第18招 怎样在Excel中插入方框内打勾符号(√)和方框内打叉符号(×)...
  9. MongoDB 网页可视化管理(adminMongo 的安装、配置)
  10. AtCoder Beginner Contest 061(CD)
  11. S5P6818 芯片手册 DMA 章节 理论篇 重排
  12. 塔防三国志服务器维护时间,塔防三国志中期玩家教程攻略详解
  13. app是计算机软件,‎App Store 上的“计算器-新版计算机”
  14. 微信小程序实现下拉框功能
  15. av_dump_format函数使用说明
  16. 专属海报小程序_轻松生成小程序分享海报
  17. android版本的微信更新,安卓微信8.0版本在哪里更新?安卓微信8.0下载更新教程...
  18. Java如何获取ISO8601时间格式
  19. 三维数字矿山综合管理平台
  20. 【头歌】——抓取 ARP 命令的包(计算机网络)

热门文章

  1. 【经典算法】·二分法
  2. 记忆化搜索 (蒟蒻练习生)
  3. iphone有什么软件测试信号,iphone12信号测试-iphone12信号实测
  4. 【LINUX】系统安全
  5. 1、张龙netty学习 第一个netty服务端
  6. php只取时间的下士_PHP获取各种起止时间
  7. Android sharesdk 集成Google登陆,报错Success,{isSigin:false}
  8. Resolve error: unable to load resolver node src\main.js:1:1
  9. KD树详解及KD树最近邻算法
  10. linux之database(数据库)一