返回顶部
首页 > 资讯 > 精选 >Docker中常见的异常总结
  • 872
分享到

Docker中常见的异常总结

2023-06-19 10:06:34 872人浏览 安东尼
摘要

本篇内容主要讲解“Docker中常见的异常总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker中常见的异常总结”吧!异常一docker ps 无响应, node 节点表现为 NotRe

本篇内容主要讲解“Docker中常见的异常总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker中常见的异常总结”吧!

异常一

docker ps 无响应, node 节点表现为 NotReady。

运行信息

$ docker -v$ Docker version 17.03.2-ce, build f5ec1e2$ docker-containerd -v$ containerd version 0.2.3 commit:4ab9917febca54791c5f071a9d1f404867857fcc$ docker-runc -v$ runc version 1.0.0-rc2$ commit: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe$ spec: 1.0.0-rc2-dev

启用 Docker Debug 模式

有两种方法可以启用调试。 建议的方法是在 daemon.JSON 文件中将 debug 设置为 true。 此方法适用于每个 Docker 平台。

编辑 daemon.json 文件,该文件通常位于 /etc/docker/ 中。 如果该文件尚不存在,您可能需要创建该文件。 2.增加以下设置

{  "debug": true}

向守护程序发送 HUP 信号以使其重新加载其配置。

sudo kill -SIGHUP $(pidof dockerd)

可以看到 Docker debug 级别的日志

Dec 14 20:04:45 dockerd[7926]: time="2018-12-14T20:04:45.788669544+08:00" level=debug msg="Calling GET /v1.27/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dpodsandbox%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:45 dockerd[7926]: time="2018-12-14T20:04:45.790628950+08:00" level=debug msg="Calling GET /v1.27/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dcontainer%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:46 dockerd[7926]: time="2018-12-14T20:04:46.792531056+08:00" level=debug msg="Calling GET /v1.27/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dpodsandbox%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:46 dockerd[7926]: time="2018-12-14T20:04:46.794433693+08:00" level=debug msg="Calling GET /v1.27/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dcontainer%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:47 dockerd[7926]: time="2018-12-14T20:04:47.097363259+08:00" level=debug msg="Calling GET /v1.27/containers/json?filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dpodsandbox%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:47 dockerd[7926]: time="2018-12-14T20:04:47.098448324+08:00" level=debug msg="Calling GET /v1.27/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.kubernetes.docker.type%3Dcontainer%22%3Atrue%7D%2C%22status%22%3A%7B%22running%22%3Atrue%7D%7D&limit=0"Dec 14 20:04:47 dockerd[7926]:

dockerd一直在请求 list containers 接口,但是没有响应。

打印堆栈信息

$ kill -SIGUSR1 $(pidof dockerd)

生成的调试信息可以在以下目录找到:

...Goroutine stacks written to /var/run/docker/goroutine-stacks-2018-12-02T193336z.log...daemon datastructure dump written to /var/run/docker/daemon-data-2018-12-02T193336z.log

查看 goroutine-stacks-2018-12-02T193336z.log 文件内容,

goroutine 248 [running]:GitHub.com/docker/docker/pkg/signal.DumpStacks(0x18fe090, 0xf, 0x0, 0x0, 0x0, 0x0)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/pkg/signal/trap.go:82 +0xfcgithub.com/docker/docker/daemon.(*Daemon).setupDumpStackTrap.func1(0xc421462de0, 0x18fe090, 0xf, 0xc4203c8200)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/daemon/debugtrap_unix.go:19 +0xcbcreated by github.com/docker/docker/daemon.(*Daemon).setupDumpStackTrap        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/daemon/debugtrap_unix.go:32 +0x10agoroutine 1 [chan receive, 91274 minutes]:main.(*DaemonCli).start(0xc42048a840, 0x0, 0x190f560, 0x17, 0xc420488400, 0xc42046c820, 0xc420257320, 0x0, 0x0)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/cmd/dockerd/daemon.go:326 +0x183emain.runDaemon(0x0, 0x190f560, 0x17, 0xc420488400, 0xc42046c820, 0xc420257320, 0x10, 0x0)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/cmd/dockerd/docker.go:86 +0xb2main.newDaemonCommand.func1(0xc42041f200, 0xc42045df00, 0x0, 0x10, 0x0, 0x0)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/cmd/dockerd/docker.go:42 +0x71github.com/docker/docker/vendor/github.com/spf13/cobra.(*Command).execute(0xc42041f200, 0xc42000c130, 0x10, 0x11, 0xc42041f200, 0xc42000c130)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/vendor/github.com/spf13/cobra/command.go:646 +0x26dgithub.com/docker/docker/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xc42041f200, 0x16fc5e0, 0xc42046c801, 0xc420484810)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/vendor/github.com/spf13/cobra/command.go:742 +0x377github.com/docker/docker/vendor/github.com/spf13/cobra.(*Command).Execute(0xc42041f200, 0xc420484810, 0xc420084058)        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/vendor/github.com/spf13/cobra/command.go:695 +0x2bmain.main()        /root/rpmbuild/BUILD/docker-ce/.gopath/src/github.com/docker/docker/cmd/dockerd/docker.go:106 +0xe2goroutine 17 [syscall, 91275 minutes, locked to thread]:...

至此,我们可以确定,containerd 无响应导致的 docker ps 无响应,在堆栈中我们也可以看到调用 containerd 无响应是因为加了lock.

查看dmesg

通过 dmesg 查看系统异常信息,发现 cgroup 报 OOM 溢出错误。

[7993043.926831] Memory cgroup out of memory: Kill process 20357 (runc:[2:INIT]) score 970 or sacrifice child

查看了大部分机器的 dmesg 信息,发现都有 OOM 这个错误,至此我们怀疑是由于某个容器 OOM 导致的 containerd 无响应.

模拟OOM

既然怀疑是容器 OOM 异常导致的 containerd 无响应,那我们干脆自己创造现场模拟一下。

首选我们创建一个 OOM 的部署,通过 nodeSelector 让这个部署调度到指定 Node。

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  labels:    wayne-app: oomtest    wayne-ns: test    app: oomtest  name: oomtestspec:  selector:    matchLabels:      app: oomtest  template:    metadata:      labels:        wayne-app: oomtest        wayne-ns: test        app: oomtest    spec:      nodeSelector:        kubernetes.io/hostname: test-001      containers:        - resources:            limits:              memory: 0.2Gi              cpu: '0.2'            requests:              memory: 0.2Gi              cpu: '0.1'          args:            - '-m'            - '10'            - '--vm-bytes'            - 128M            - '--timeout'            - 60s            - '--vm-keep'          image: progrium/stress          name: stress

发现过了一会 test-001 这台 Node 出现了 docker ps 无响应的情况,查看 dmesg 以及 containerd 的堆栈信息,发现和之前的 Node 出现的异常一致。至此,基本可以确定是某个容器 OOM 导致的 containerd hung 住。

原因分析

通过查找社区 Issues 及相关 PR,最后发现根本原因是 runc 的bug。

使用 runc startrunc run 启动容器时,stub process(runc [2:INIT])打开一个 fifo 进行写入。 它的父 runc 进程 将打开相同的 fifo 阅读。 通过这种方式,它们可以同步。

如果 stub process 在错误的时间退出,那么父 runc 进程 会永远被阻塞。

当两个 runc 操作相互竞争时会发生这种情况:runc run / startrunc delete。 它也可能由于其他原因而发生, 例如 内核的 OOM killer 可以选择杀死 stub process。

解决方案:

通过解决 exec fifo 竞争来解决这个问题。 如果 在我们打开 fifo 之前 stub process 退出,那么返回一个错误。

小结

containerd 官方已经在 v1.0.2 版本合并了这个修改。因此这个问题可以通过升级 Docker 版本解决。我们目前已经将部分机器升级到 Docker 18.06。 已升级的机器暂时未发现类似问题。

相关issues: https://github.com/containerd/containerd/issues/1882 Https://github.com/containerd/containerd/pull/2048 https://github.com/opencontainers/runc/pull/1698

异常二

Docker 在 Centos 系统下以 direct-lvm 模式运行, 无法启动

Error starting daemon: error initializing graphdriver: devicemapper: Non existing device docker-thinpoolDec 14 03:21:03 two-slave-41-135 systemd: docker.service: main process exited, code=exited, status=1/FAILUREDec 14 03:21:03 two-slave-41-135 systemd: Failed to start Docker Application Container Engine.Dec 14 03:21:03 two-slave-41-135 systemd: Dependency failed for kubernetes Kubelet.Dec 14 03:21:03 two-slave-41-135 systemd: Job kubelet.service/start failed with result 'dependency'.

根本原因

这个问题发生在使用 devicemapper 存储驱动时Docker试图重用之前使用 LVM thin pool。例如,尝试更改节点上的 Docker 的数据目录时会发生此问题。由于安全措施旨在防止 Docker 因配置问题而意外使用和覆盖 LVM thin pool 中的数据,因此会发生此错误。

解决方案

要解决阻止Docker启动的问题,必须删除并重新创建逻辑卷,以便Docker将它们视为新的thin pool。

警告:这些命令将清除Docker数据目录中的所有现有镜像和卷。 请在执行这些步骤之前备份所有重要数据。

停止 Docker

sudo systemctl stop docker.service

删除 Dodcker 目录

sudo rm -rf /var/lib/docker

删除已经创建的 thin pool 逻辑卷

$ sudo lvremove docker/thinpoolDo you really want to remove active logical volume docker/thinpool? [y/n]: y  Logical volume "thinpool" successfully removed

创建新的逻辑卷

lvcreate -L 500g --thin docker/thinpool --poolmetadatasize 256m

根据实际磁盘大小调整 thinpool 和 metadata 大小

Docker自动direct-lvm模式配置

如果您想要让Docker自动为您配置direct-lvm模式,请继续执行以下步骤。

编辑/etc/docker/daemon.json文件以将dm.directlvm_device_force = valuefalse更改为true。 例如:

{  "storage-driver": "devicemapper",  "storage-opts": [    "dm.directlvm_device_force=true"  ]}

除了删除逻辑卷之外,还要删除docker卷组:

$ sudo vgremove docker

启动Dokcer

sudo systemctl start docker.service

总结

Docker 虽然是目前最常用的容器解决方案,但它仍旧有很多不足。

  • Docker 的隔离性比较弱,混布容易导致业务互相影响,可能因为一个服务有问题就会影响其他服务甚至影响整个集群

  • Docker 自己存在一些 bug, 由于历史原因,很多 bug 无法完全归因于内核或者 Docker,需要 Docker 和内核配合修复。

到此,相信大家对“Docker中常见的异常总结”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Docker中常见的异常总结

本文链接: https://lsjlt.com/news/295276.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Docker中常见的异常总结
    本篇内容主要讲解“Docker中常见的异常总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker中常见的异常总结”吧!异常一docker ps 无响应, Node 节点表现为 NotRe...
    99+
    2023-06-19
  • Python常见异常处理总结
    目录异常处理介绍语法报错异常处理解决方法抛出异常自定义异常其他内置函数总结异常处理介绍 在实际的开发中,我们经常遇到一些报错的例子,在pycharm的显示页面下,当我们看到一串串的红...
    99+
    2024-04-02
  • Java异常(Exception)处理以及常见异常总结
    目录前言异常简介 异常类型 总结前言 很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。...
    99+
    2024-04-02
  • 常见的Python异常及处理方法总结
    目录一、错误与异常1.什么是错误2.什么是异常3.回溯信息二、常见异常常见异常类三.异常处理1.异常处理2.简单的异常处理格式3.执行顺序4.except分支可以有多个5.执行顺序6...
    99+
    2024-04-02
  • Java常见异常及处理方式总结
    目录一、概述二、异常分类三、声明及抛出四、捕获异常五、捕获多个异常六、自定义异常七、异常堆栈一、概述 异常指不期而至的各种状况,它在程序运行的过程中发生。作为开发者,我们都希望自己写...
    99+
    2024-04-02
  • Redis常见异常汇总
    概述 在阿里云文档中看到一篇Redis错误排查的内容,作者整理的比较详细,感觉很有参考意义,摘录下来,方便个人后续参考使用… Jedis虽然使用起来比较简单,但是不能根据使用场景设置合理的参数(例如连...
    99+
    2023-10-12
    redis lua java 数据结构
  • JavaScript中的常见继承总结
    目录前言原型链常用的继承方法原型继承原理优点缺点执行结果借用构造函数继承原理优点缺点执行结果组合继承原理优点缺点执行结果前言 我们在学习前端的过程中一定会遇到继承这个问题 继承其实就...
    99+
    2024-04-02
  • python中常见函数总结
    目录 1.range()是一个函数 2.Python数学函数 3、Python随机数函数 4、python的字符串内建函数 5.文件操作函数 6、zip函数 7、python内置函数set 8.python中的round()函数 9.字典...
    99+
    2023-09-06
    python 算法 开发语言
  • docker常用命令总结
    本篇内容主要讲解“docker常用命令总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“docker常用命令总结”吧!个人简单总结:参数用途语法示例search在docker hub中搜索镜像d...
    99+
    2023-06-03
  • java中常见的中文乱码总结
    在Java中,常见的中文乱码问题主要有以下几种情况:1. 字符串编码不一致:在Java中,字符串是以Unicode编码表示的,而在进...
    99+
    2023-08-11
    java
  • Moment.js常见用法总结
    Moment.js是一个轻量级的js时间处理类库,其使用简单,方便了日常开发中对时间的操作,提高了开发效率。 引用Moment.js npm install moment 常用的方...
    99+
    2024-04-02
  • Python使用asyncio异步时的常见问题总结
    目录1. 如何停止任务?2. 如何等待任务完成?3. 如何从任务中获取返回值?4. 如何在后台运行任务?5. 如何等待所有后台任务?1. 如何停止任务? 我们可以通过 asyncio...
    99+
    2023-05-16
    Python asyncio异步常见问题 Python asyncio异步 Python asyncio
  • python 异常处理总结
    最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 ...
    99+
    2022-06-04
    异常 python
  • Python 标准异常总结
    Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d) FloatingPointErr...
    99+
    2023-01-31
    异常 标准 Python
  • Python中常见的导入方式总结
    目录一、直接导入模块二、直接导入包三、导入包中的一个模块四、导入模块并取别名五、从模块(或者包)中取出特定函数(不建议)六、从包中取出特定模块一、直接导入模块 import 模块名 ...
    99+
    2024-04-02
  • JavaScript中常见的高阶函数总结
    目录前言map函数reduce函数filter函数sortevery方法find方法findIndex方法foreach方法总结前言 一个函数可以接受另一个函数作为参数,就把这个函数...
    99+
    2024-04-02
  • 常见的socket error错误总结
    常见的socket error错误总结如下:1. ConnectionRefusedError:连接被拒绝。可能是目标主机拒绝了连接...
    99+
    2023-08-24
    错误
  • ctf中常见php rce绕过总结
    php webshell的研究 只是总结一些常见的姿势,大佬轻喷 无字母的情况 一个经典的示例 ...
    99+
    2023-09-29
    php 开发语言 web安全 网络安全 安全
  • Java程序常见异常及处理汇总
    Java程序中常见的异常包括:1. NullPointerException(空指针异常):当尝试访问一个空对象的方法或属性时抛出。...
    99+
    2023-08-16
    Java
  • 总结JavaScript中BigIn函数常见的属性
    目录一、概述二、属性1. 数学运算符2. 比较运算符3. 布尔运算三、总结一、概述 BigInt 是一种特殊的数字类型,它提供了对任意长度整数的支持。 创建 bigint 的方式有两...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作