离线版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
推荐这些文章:
一、本地镜像发布到阿里云流程
二、镜像生成方法
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设置镜像源
1、镜像源介绍
当运行容器时,使用的镜像如果在本地中不存在,就会自动从docker镜像仓库中下载,默认从Docker Hub(https://hub.docker.com/ )公共镜像源下载;
为加快拉取镜像速度,建议设置docker国内镜像源;
2、修改docker下载的镜像源
①. 修改文件(没有则新增)
touch /etc/docker/daemon.json
vim /etc/docker/daemon.json
②. 添加或修改如下内容
{
&nb...
一、是什么
先来看看Docker的理念:
*将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
*容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。|
一句话:有点类似我们Redis里面的rdb和aof文件
二、能干嘛
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union FileSystem提供一些用 于持续存储或共享数...
一、是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的有内容,包括代码、运行时、库、环境变量和配置文件。
1、UnionFS(联合文件系统)
UnionFS (状节又件示统)
UnionFS (联合文件系统) : Union文件系统(UnionFS)是一一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修作为一 次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a singlevirtualfilesystem)。Union文件系统是Dock...
Docker容器运行原理
Docker目前采用了标准的C/S架构,即客户端和服务端架构。当Docker客户端下发请求构建、运行容器时,Docker客户端和Docker服务端的守护进程Docker Daemon通过Sockets或RESTful API进行沟通交互,完成客户端相应的请求。其中Docker Daemon是运行在Docker服务端的守护进程,负责完成非常重要的工作,包括构建、运行和分发Docker容器。Docker客户端和Docker服务端的守护进程可以运行在同一个系统上,也可以连接一个Docker客户端到远程Docker守护进程中。例如,当执行docker run -it ubu...
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.给脚本文件加执行权限
...
1.杀死运行的容器: # docker kill $(docker ps -a -q)
2.删除所有容器: # docker rm $(docker ps -a -q)
3.强制删除所有镜像: # docker rmi -f $(docker images -q)
...
问题
这是怎么回事?
最佳回答
估计出现了错误,在反复重启吧
可以docker logs查看下日志,或进入后台看看
...
文章链接:https://www.dianjilingqu.com/312.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。