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

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

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

1.    背景说明

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

2.    基础镜像迁移

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

2.1拷贝nginx镜像

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

 

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

 

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

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

2.2服务器镜像还原

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

1
2
3
4
5
6
7
8
9
10
11
# 进入到镜像所在文件夹
cd /home/installpack
# 还原镜像
docker load < nginx.zip
# 查看镜像
docker images

 

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

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

3.    业务API部署

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/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 /宿主机目录:/容器目录 文件挂载不能少,将配置文件、日志文件、数据文件、静态资源文件最好挂载映射到物理主机,避免容器销毁到不回来数据,具体要挂载那一些文件,根据具体的服务自己定义。

文件执行示例说明:

1
2
3
4
5
6
7
8
9
10
11
# 初始化部署全部服务
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,将该服务对应的所有服务监控写在此文件中,具体文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/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任务设置界面

 

1
2
3
4
5
6
7
8
9
10
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.    几个注意点

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

 

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

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

 

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

 

6.    结束

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

END

推荐这些文章:

尚硅谷Docker笔记(8)-- 本地镜像发布到阿里云

一、本地镜像发布到阿里云流程

二、镜像生成方法
1、前面的Dockerfile
2、从容器中创建一个新的镜像
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

OPTIONS说明:
-a :提交的镜像作者;
-m :提交时的说明文字;

三、将本地镜像推送到阿里云
1、本地镜像素材原型

2、阿里云开发者平台
https://promotion.aliyun.com/ntms/act/kubernetes.html
https://dev.aliyun.com/search.html

3、创建镜像仓库

命名空间
仓库名称
4、将镜像推...

Docker学习笔记二:Docker设置镜像源

 Docker设置镜像源
1、镜像源介绍

当运行容器时,使用的镜像如果在本地中不存在,就会自动从docker镜像仓库中下载,默认从Docker Hub(https://hub.docker.com/ )公共镜像源下载;

为加快拉取镜像速度,建议设置docker国内镜像源;

2、修改docker下载的镜像源

①. 修改文件(没有则新增)

touch  /etc/docker/daemon.json
vim /etc/docker/daemon.json

②. 添加或修改如下内容

    {
   &nb...

尚硅谷Docker笔记(5)-- Docker容器数据卷

一、是什么
先来看看Docker的理念:
*将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
*容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。|
一句话:有点类似我们Redis里面的rdb和aof文件
二、能干嘛
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union FileSystem提供一些用 于持续存储或共享数...

尚硅谷Docker笔记(4)-- Docker 镜像

一、是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的有内容,包括代码、运行时、库、环境变量和配置文件。
1、UnionFS(联合文件系统)
UnionFS (状节又件示统)
UnionFS (联合文件系统) : Union文件系统(UnionFS)是一一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修作为一 次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a singlevirtualfilesystem)。Union文件系统是Dock...

Docker(3) 容器的操作

Docker容器运行原理
Docker目前采用了标准的C/S架构,即客户端和服务端架构。当Docker客户端下发请求构建、运行容器时,Docker客户端和Docker服务端的守护进程Docker Daemon通过Sockets或RESTful API进行沟通交互,完成客户端相应的请求。其中Docker Daemon是运行在Docker服务端的守护进程,负责完成非常重要的工作,包括构建、运行和分发Docker容器。Docker客户端和Docker服务端的守护进程可以运行在同一个系统上,也可以连接一个Docker客户端到远程Docker守护进程中。例如,当执行docker run -it ubu...

清理docker容器日志

1.新建文件
touch docker_log_size.sh

2.编辑文件
vi docker_log_size.sh

3.输入 i 编辑拷贝脚本
#!/bin/sh

echo "======== docker containers logs file size ========"

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
do
ls -lh $log
done

4.给脚本文件加执行权限
...

docker删除所有镜像容器命令

1.杀死运行的容器: # docker kill $(docker ps -a -q)
2.删除所有容器: # docker rm $(docker ps -a -q)
3.强制删除所有镜像: # docker rmi -f $(docker images -q)

...

容器部署商城

问题

这是怎么回事?

最佳回答
估计出现了错误,在反复重启吧
可以docker logs查看下日志,或进入后台看看

...

文章标题:离线版centos8环境部署迁移监控操作笔记
文章链接:https://www.dianjilingqu.com/312.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>