Docker容器管理之FAQ

一、前言

在这里插入图片描述

某次,某容器服务发现无法使用了,查看状态为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: nginxcontainer_name: healthcheckhealthcheck:test: ["CMD", "curl", "-fs", "http://localhost/"]interval: 6stimeout: 3sretries: 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.rhkb.cn/news/400314.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老师分班查询助手,新学期老师都在用!

作为一名教师&#xff0c;您是否曾经在新学期伊始&#xff0c;面对着一堆学生名单和分班结果&#xff0c;感到无从下手&#xff1f;是否曾经历过在黑板上一笔一划地写下每个学生的名字和班级&#xff0c;然后一遍又一遍地回答家长和学生的询问&#xff1f;这样的场景&#xff0…

web页面的性能测试

背景 测试大模型主要web页面的性能 使用工具 通过google自带的lighthouse测试页面的性能 各个参考指标 First Contentful Paint(FCP):测量在用户导航到页面后浏览器呈现第一段 DOM 内容所花费的时间。页面上的图像、非白色<canvas>元素和 SVG 被视为 DOM 内容&#…

ECMAScript6语法:类

在 ES6 中新增了类的概率&#xff0c;多个具有相同属性和方法的对象就可以抽象为类。类和对象的关系如下&#xff1a; &#xff08;1&#xff09;类抽象了对象的公共部分&#xff0c;它泛指某一大类&#xff08;class&#xff09;。 &#xff08;2&#xff09;对象特指通过类…

Linux:基础IO

目录 1. stdin & stdout & stderr 2. 系统文件I/O 1. 接口介绍 open write read close lseek 2. open函数返回值 3. 文件描述符fd 0 & 1 & 2 文件描述符的分配规则 重回定向 dup2 简易Shell的模拟实现 4. FILE 5. 再谈对文件的理解 1. stdin …

threejs webgl效果 功能特效

雷达效果 ​飘扬的红旗 光柱效果 OD线 下雪 下雨 光墙效果 能源球 烟火效果 threejs烟花效果 光圈效果 threejs 光圈 波动 function initScene() {scene new THREE.Scene();}function initCamera() {camera new THREE.PerspectiveCamera(45, window.innerWidth / window.inne…

深入探索PDF源码解析:从PDF到Excel的数据统计分析找到正文

在数字化时代&#xff0c;数据已成为企业决策和业务运营的关键。PDF文档作为一种广泛使用的文件格式&#xff0c;其中蕴含着大量有价值的信息。然而&#xff0c;PDF文档的结构和格式使得直接对其进行数据提取和分析变得复杂。为了解决这个问题&#xff0c;我们采取了一种创新的…

SQL注入实例(sqli-labs/less-17)

0、初始网页 1、确定闭合字符 注入点在于password框&#xff0c;闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…

经纬恒润亮相第四届焉知汽车年会,功能安全赋能域控

8月初&#xff0c;第四届焉知汽车年会在上海举行。此次年会围绕当下智能电动汽车的热点和焦点&#xff0c;聚焦于智能汽车场景应用、车载通信、激光雷达、智能座舱、功能安全、电驱动系统等多个领域&#xff0c;汇聚了来自OEM、科技公司、零部件供应商、测试认证机构、政府院校…

Spark SQL Catalyst工作流程

我们写的SQL语句&#xff0c;会经过一个优化器 (Catalyst)&#xff0c;转化为 RDD&#xff0c;交给集群执行。 而Catalyst在整个Spark 生态中的地位也是至关重要的。 SQL到RDD中间经过了一个Catalyst&#xff0c;它就是Spark SQL的核心&#xff0c;是针对Spark SQL语句执行过程…

使用pytest+selenium编写网页UI自动化脚本和用例

1 UI自动化测试 UI自动化测试&#xff08;User Interface Automation Testing&#xff09;是一种通过编写脚本或使用自动化测试工具&#xff0c;对界面&#xff08;UI&#xff09;进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面&#xff0c;自动化执行用户…

kali安装docker

docker 安装 ● 1、更新 kali 下载资料源&#xff1a;apt-get update ● 2、如果出现上面没有数字签名问题&#xff0c;那就是需要下载证书 使用命令&#xff1a; wget archive.kali.org/archive-key.asc #下载证书 apt-key add archive-key.asc #添加证书 ● 3、重新更新一…

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

redis面试(十六)公平锁释放和排队加锁

锁释放 RedissonFairLock.unlockInnerAsync()方法 这和加锁的逻辑没有太大区别 也就是说在客户端A他释放锁的时候&#xff0c;也会走while true的脚本逻辑&#xff0c;看一下有序集合中的元素的timeout时间如果小于了当前时间&#xff0c;就认为他的那个排队就过期了&#xf…

如何减少 Docker 镜像大小:6 种优化方法

如果您想减少docker镜像的大小&#xff0c;您需要使用构建docker镜像的标准最佳实践。 本博客讨论了您可以快速实施的各种优化技术&#xff0c;以制作最小、最精简的 docker 镜像。我们还将介绍一些用于 Docker 镜像优化的最佳工具。 Docker 作为一种容器引擎&#xff0c;可以…

k8s核心架构分析

k8s核心概念概述 Kubernetes入门&#xff1a;掌握集群核心&#xff0c;释放容器潜能 技术爱好者们&#xff0c;CD集群的核心概念是构建、部署和管理容器化应用的基石。掌握这些概念&#xff0c;不仅助你深入理解技术细节&#xff0c;更能在CD集群中自如操作&#xff0c;无论是…

2 C 语言开发工具选择、 MinGW 的安装与配置、VS Code 的安装与配置、插件推荐

目录 1 开发工具选择 1.1 Visual Studio 1.2 Code::Block 1.3 Clion 1.4 VS Code 1.5 在线编辑工具 2 开发工具安装 2.1 安装 MinGW-w64 2.1.1 MinGW-w64 介绍 2.1.2 解压 MinGW 2.1.3 将 MinGW 添加至环境变量 2.1.4 验证安装 2.2 安装 VS Code 2.2.1 下载安装包…

Avnet ZUBoard 1CG开发板上手—深度学习新选择

Avnet ZUBoard 1CG 开发板上手—深度学习新选择 摘要 本文主要介绍了 Avnet ZUBoard 1CG 开发板的特性、架构、硬件单元等概念&#xff0c;并对如何使用以太网接口和串口连接开发板进行基本介绍&#xff0c;同时辅以两个应用例程演示其功能。 原文链接&#xff1a; FreakSt…

如何编写一个CMakeLists.txt文件(由简到难,较详细)

在Linux系统下&#xff0c;经常使用CMakeLists.txt文件来链接、编译C工程&#xff0c;大部分人clone的代码里都是有CMakeLists.txt文件的&#xff0c;只需要cmake .. 和make就完事了&#xff0c;但在工作中&#xff0c;你必须要有从无到有编写CMakeLists.txt文件的能力。 一、…

【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存

上一章介绍使用QT播放GStreamer视频流 【QGroundControl二次开发】八. QT实现播放gstreamer视频。 这章介绍如何在原有基础上保存为视频&#xff0c;同时保存为一个个规定大小的小视频。 一. 思想 之前的文章展示了如何在QT中播放GST视频流&#xff0c;这章在原有的基础上增加…

金九银十,软件测试面试题合集(含答案)

前言 前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些…