Docker容器管理之FAQ

news2024/11/15 16:02:26

一、前言

在这里插入图片描述

某次,某容器服务发现无法使用了,查看状态为restaring状态,后看是云主机重启了,导致本地的nfs-server未自动启动,导致关联的集群主机,远程挂载点无法使用,影响容器服务运行。故此,本文列举了当出现docker容器宕机后排查的思路,以供参考;另外应养成定期备份容器数据和镜像的习惯。

二、FAQ及处理

2.1、Docker容器异常宕机排查处理

1、查看Docker的日志文件:

关联资源:shim reaped exception、Docker 容器常见故障排查

journacl -x -n 100 -u docker  #-f 实时滚动显示最新日志,-k查看内核的,-n 默认尾部的最新10行,--r 查看最新的日志
journalctl -b -0  #查看本次启动的
journalctl -b -1  #查看上一次启动的日志
journalctl --since=“2024-08-01 00:22:02”
journalctl --since “30 min ago”
journalctl --since yesterday
journalctl --since “2024-08-01” --until “2024-08-13 13:40”
journalctl --since 08:30 --until “2 hour ago”
journalctl -u docker.service --since today  #查看docker unit服务的日志,-u可多次使用显示多个unit日志

tail -1000 /var/log/messages |grep -Ei ' "out of memory"|"Kill process"|score|sacrifice'
grep "reboot|grep shutdown"  /var/log/messages  #确认是否Linux系统宕机了
dmesg | grep "error"
cat /var/log/kern.log | grep "error"
last reboot  #查看系统最后重启的时间和原因
last -F |grep crash
dmesg | tail -N
dmesg | egrep -i -B100 'killed process' #查看'killed process’之前的100行内容
sar -u -f /var/log/sa/sa27 |more  #利用sa文件查看宕机时CPU情况,-r查看内存
ulimit -c unlimited  #修改对core文件大小的限制,0为不允许生成core文件
sysctl -w "kernel.core_name_format=/coredump/%n.core"  #将core文件放在/coredump目录下,文件名是进程名+.core,便于下次系统崩溃时查看崩溃转储dump文件

检查系统资源:CPU、内存、磁盘等资源是否达到了限制,当资源不足或负载长期过高触发内核异常会导致Docker挂掉,或内存跑满引起OOM。相关经验表明,Docker长期运行会导致Linux内存buff/caches占用过高,可按如下手动释放缓存。

# 表示清除pagecache (执行后问题得以解决)
echo 1 > /proc/sys/vm/drop_caches
# 表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)
# slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache
echo 2 > /proc/sys/vm/drop_caches
# 表示清除pagecache和slab分配器中的缓存对象 (这个可以的)
echo 3 > /proc/sys/vm/drop_caches

2、查看容器的状态

docker inspect --format '{{.State}}' <container_id_or_name>
docker inspect --format '{{.State.Health}}' <container_id_or_name>

从docker 1.12 版本之后,Docker 实现了原生的健康检查实现。对于容器而言,最简单的健康检查是进程级的健康检查,即检验进程是否存活。Docker Daemon 会自动监控容器中的 PID1 进程,如果 docker run 命令中指明了 restart policy,可以根据重启策略自动重启已结束的容器。但是在很多实际应用中,仅使用进程级健康检查方式还远远不够。比如,容器中进程虽然还在运行却由于其他种种原因无法继续响应用户请求(如应用死锁)。容器启动之后,初始状态会为 starting (启动中)。Docker Engine 会等待 interval 时间,开始执行健康检查命令,并周期性执行。如果单次检查返回值非 0 或者运行需要比指定 timeout 时间还长,则本次检查被认为失败;如果健康检查连续失败超过了 retries 重试次数,状态就会变为 unhealthy (不健康),有一次健康检查成功,Docker 会将容器标记为healthy (健康)状态。

#容器启用监控检查
docker run  -d --name=nginx --health-cmd="curl http://localhost:8080/ || exit 1" --health-interval=5s --health-retries=6  --health-timeout=3s nginx
#参数说明
– health-cmd string 运行检查健康状况的命令
–health-interval duration 运行间隔时间(ms|s|m|h)(缺省为 0s)
–health-retries int 需要报告不健康的连续失败次数
–health-start-period duration 容器在开始健康之前初始化的起始周期(ms|s|m|h)(默认 0)
–health-timeout duration 允许一次检查运行的最大时间(ms|s|m|h)(默认为 0s)
–no-healthcheck 禁用任何容器指定的HEALTHCHECK,会使 Dockerfile 构建设置的HEALTHCHECK
功能失效

#Dockerfile 方式:Dockerfile 中HEALTHCHECK只可以出现一次,如果写了多个,只有最后一个生效。HEALTHCHECK 返回值,决定了该次健康检查的成功与否:0:成功;1:失败;2:保留
#使用包含HEALTHCHECK指令的 Dockerfile 构建出来的镜像,在实例化 Docker 容器的时候,就具备了健康状态检查的功能。启动容器后会自动进行健康检查
#格式:HEALTHCHECK [选项] CMD <命令>;--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认3次;--start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒,需要一定启动时间的服务最好设置;
vim Dockerfile  #;类似如下
FROM nginx
HEALTHCHECK --interval=5s --timeout=3s  CMD curl  http://localhost/ || exit 1  #设置了每 5 秒检查一次,如果健康检查命令超过 3 秒没响应,并且重试 3 次都没响应就视为失败,并且使用curl http://localhost/ || exit 1,其中,exit 1只能让容器的状态为 unhealthy
EALTHCHECK NONE #禁用从基本镜像继承的任何健康检查
HEALTHCHECK --interval=5s --timeout=3s --retries=3 CMD curl --fail http://localhost:$EXPORTER_PORT || bash -c 'kill -s 15 -1 && (sleep 10; kill -s 9 -1)'  #检测监控异常后配合--restart=always能让容器重启


#启动后
docker inspect --format '{{json .State.Health}}' web | python -m json.tool


# docker-composer 方式,配置yml文件
version: '3'
services:
  myapp:
    image: nginx
    container_name: healthcheck
    healthcheck:
      test: ["CMD", "curl", "-fs", "http://localhost/"]
      interval: 6s
      timeout: 3s
      retries: 3
#验证,在 docker ps 的 STATUS 栏显示 healthy/unhealthy
docker ps -l  #如下所示
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                            PORTS     NAMES
43e1f11e2131   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds (health: starting)   80/tcp    healthcheck

3、查看异常状态容器的日志和报错处理

docker ps
docker logs --tail=1000 容器ID/名称     #检查容器日志,当容器卡死时可能没有任何日志输出
docker top <container-id>|<contianer-name>  #也能确认docker容器是否运行正常,尤其是up状态的容器
docker stats <container-id>|<contianer-name>  #查看容器的性能监控信息
#如果无法查看,尝试手动start
docker start containerName  #这时一般会给出报错,比如:
can't create unix socket /var/run/docker.sock: is a directory
#如果提示docker.sock不能创建:可
rm -rf /var/run/docker.sock,然后重新启动docker

#报错
docker: Error response from daemon:/var/lib/docker/overlay/XXXXXXXXXXXXXXXXXXXXXXX: no such file or directory.
//原因:docker没有指定目录或文件,或nfs远程挂载异常导致的找不到指定目录或文件
systemctl stop docker
rm -rf /var/lib/docker/*
systemctl start docker
或检查恢复nfs-server后,重启容器

4、如果容器停止的原因是容器本身被限制了资源,可以尝试去除这些限制来解决问题

docker inspect|grep ^Limits
ps auxw | sort -rn -k3 | head -10
ps auxw | head -1;ps auxw|sort -rn -k4|head -10  #内存消耗最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k5|head -10  #虚拟内存使用最多的前10个进程
#调整资源限制
docker update --cpus=<cpu_num> --memory=<mem_size> <container_id>

5、或者是容器的重启策略总是always,导致未解决问题前容器频繁重启

更多Docker容器的重启策略如下:

no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

6、网络经验

在centos7中,内核跟docker版本之间的一个bug,过于频繁create/destory container、
pull/push image的时候,当thin pool满时,DeviceMapper后端默认文件系统xfs会不断retry
失败的IO,导致进程挂起。重启docker,那些挂起的进程也会不断地跑,导致docker进程卡死,这是需要在启动参数上面增加dm.xfs_nospace_max_retries=0。另有时ptables卡住也会导致docker卡住;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt编译错误: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

方法一&#xff1a;清空构建目录 清空当前目录的多余文件即可&#xff0c;具体操作如下 一个正常的Qt项目刚被创建且没有编译时是这样的 一个main文件&#xff0c;一个pro文件&#xff0c;一个user文件&#xff0c;一个头文件(.h)&#xff0c;和一个源文件(.cpp)&#xff0c;一…

springsecurity的学习(四):实现授权

简介 springsecurity的授权&#xff0c;自定义授权失败的处理&#xff0c;跨域的处理和自定义权限校验方法的介绍 授权 权限系统作用 在后台进行用户权限的判断&#xff0c;判断当前用户是否有相应的权限&#xff0c;必须具有所需的权限才能进行相应的操作&#xff0c;以此…

高通分享:glTF 2.0扩展MPEG、3GPP在AR/VR 3D场景的沉浸式体验

日前&#xff0c;高通技术标准高级总监托马斯斯托克哈默尔&#xff08;Thomas Stockhammer&#xff09;和高通技术标准总监伊梅德布亚齐兹&#xff08;Imed Bouazizi&#xff09;撰文分享了ISO和Khronos之间是如何紧密合作&#xff0c;并最终开发出MPEG-I Scene Description IS…

基于LangChain的大模型学习手册(入门级)

前言 时间轴来到2024年的下半年&#xff0c;“大模型”这个术语&#xff0c;从几乎是ChatGPT的代名词&#xff0c;转变为AI领域一个划时代产品的广泛词汇。从单一到广泛&#xff0c;代表大模型这个世界级产品&#xff0c;正在走向枝繁叶茂的生命阶段。截止现在&#xff0c;目前…

【算法分析与设计】期末复习-小题100道

目录 0、基础知识点 一、单选题 二、多选题 三、判断题 0、基础知识点 &#xff08;1&#xff09;常见时间复杂度与公式&#xff1a; 汉诺塔&#xff1a;T(n)O(2^n) 全排列&#xff1a;T(n)O(n!) 整数划分&#xff1a; 正整数n的划分&#xff1a;p(n)q(n,n) 分治&#…

推荐系统三十六式学习笔记:工程篇.效果保证31|推荐系统的测试方法及常用指标介绍

目录 为什么要关注指标推荐系统的测试方法1.业务规则扫描2.离线模拟测试3.在线对比测试4.用户访谈 常用指标1.系统有多好&#xff1f; 假设你已经有了自己的推荐系统&#xff0c;这个系统已经上线。 为什么要关注指标 面对推荐系统这样一个有诸多复杂因素联动起作用的系统&am…

C++入门:类和对象(入门篇)

目录 前言 类的定义 1.类定义格式 2.从结构体到类的跨越 3.访问限定符 4.类域 5.类的实例化 类的默认成员函数 1.默认成员函数的定义和学习方向 2.构造函数 3.析构函数 4.拷贝构造函数 5.重载运算符 总结 疑难解答 1.this指针的用法 2.为什么拷贝构造函数的第一个参数必须…

LeetCode 热题 HOT 100 (024/100)【宇宙最简单版】

【哈希表】No. 0128 最长连续序列【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&am…

WPF中RenderTransform,LayoutTransform区别

RenderTransform RenderTransform 是在渲染阶段应用的变换。它不会影响控件的布局&#xff0c;只会影响控件的外观。常用于动画和视觉效果。 • 应用时机&#xff1a;在控件已经完成布局之后。 • 影响范围&#xff1a;仅影响控件的外观&#xff0c;不影响布局。 • 常见用途&…

汇川技术|PLC应用逻辑编程技巧(2)

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 昨天看这块儿内容看到快十二点了&#xff0c;还没看完&#xff0c;今天接着看。 以下为学习笔记。 01 PLC程序实现状态关系 该思路编写程序的要点如下&#xff1a; ①&#xff1a;采用PLC的一个整数型变量作为状态位…

路透社中东门户媒体ZAWYA:自带流量为品牌出海赋能

路透社中东门户媒体ZAWYA:自带流量为品牌出海赋能 随着全球化的不断推进&#xff0c;越来越多的企业开始将目光投向海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;在激烈的市场竞争中&#xff0c;如何让自己的品牌脱颖而出成为一个亟待解决的问题。在这个背景下…

Windows 11系统SQL Server 2016 数据库安装 最新2024教程和使用

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 文件可以关注作者公众号《全栈鍾猿》&#xff0c;发您 安装流程 双击运行 在资源管理器页面如图所示 点击全选-->取消勾选如图所示的3个---》点击下一步 点击下一步 安装完成&#xff0c;如图所示 &a…

USB-HUB电路设计

USB-HUB电路设计 USB-HUB电路是笔者任职电子工程师做的第一块板子,功能为USB3.0的集线器,主芯片采用RTS5411,最多能同时工作四个USB3.0设备。 由于信号有TX.RX,我们很容易将发送端和接收端搞错,毕竟从芯片出来,要经过很多的路径,如USB端子,线材,再到芯片。则芯片出来…

内网渗透—横向移动RDPWinRMWinRSSPN扫描Kerberos攻击

前言 今天仍是横向移动的内容&#xff0c;有些实验能成功&#xff0c;有些实验则各种奇怪的问题导致失败&#xff0c;这都是很常见的。就连小迪在视频中也经常翻车&#xff0c;我们只需要知道原理&#xff0c;以及如何去实现这个攻击行为即可。没必要强求所有的实验都要百分百…

Python3网络爬虫开发实战(8)验证码的识别

文章目录 一、 图片增强&#xff1a;OpenCV1. OpenCV 基础使用2. 滑动验证码缺口识别 二、图片验证码和滑块验证码1. tesserocr2. ddddocr3. 深度学习识别4. 超级鹰打码平台 三、手机验证码的自动化处理 目前&#xff0c;许多网站采取各种各样的措施来反爬虫&#xff0c;其中一…

嵌入式面经篇四——内存管理

文章目录 前言一、内存管理&编程题1、由gcc编译的C语言程序占用的内存分为哪几个部分&#xff1f;2、大小端3、全局变量和局部变量的区别&#xff1f;4、以下程序中&#xff0c;主函数能否成功申请到内存空间&#xff1f;5、请问运行下面的 Test() 函数会有什么样的后果&am…

Anaconda安装jupyter notebook、jupyterlab及体验

Anaconda安装jupyter 1.前言2.创建虚拟环境3.激活虚拟环境4.安装jupyter notebook5.启动6.快捷方式7.jupyterlab插件安装8.报错的处理9.总结1.前言 手贱,不小心将Anaconda自带得jupyter给卸载了,没法子了查了好多资料都比较麻烦,所以自己摸索着重新安装,记录一下心得。 说…

87.SAP Transaction SM31 and SM30

目录 1.SM30是什么 2.SM30维护表的前提条件&#xff1a; 3.用途 维护表数据 查看SAP表的配置点 4.SM31和SM30的区别 1.SM30是什么 Transaction code SM30 can be used to display and update table data. The input field on the first screen of SM30 is long enough t…

企业通用报表平台代码审计

1 第三方组件漏洞审计 本项目是基于Maven构建的。对于Maven项目,我们首先从 pom.xml 文件开始审计引入的第三方组件是 否存在漏洞版本,然后进一步验证该组件是否存在漏洞点。 本项目引入的组件以及组件版本整理如下。 组件名称组件版本SpringBoot2.2.4.RELEASEFastjson1.2…

CDP问卷填报手册指南

CDP认证的作用是向消费者和利益相关者提供一个可信的证明&#xff0c;证明该组织正在采取行动&#xff0c;以减少其对气候变化的影响并提高可持续发展。CDP认证是一个独立的评估过程&#xff0c;通过评估组织在应对气候变化和可持续发展方面的表现和策略&#xff0c;评估其对气…