美文网首页Docker
干货丨Docker容器九类常见故障排查及处理

干货丨Docker容器九类常见故障排查及处理

作者: 同创永益 | 来源:发表于2021-05-14 18:52 被阅读0次

    本文转自@TWT社区。

    【前言】至少,以Docker和kubernetes为代表的容器技术日新月异,但我们在容器的使用过程中,也会碰到各种损坏和难题。出有针对性的说明和解决方案,希望可以帮助到大家去快速定位和解决类似问题故障。

    具有超过十年的互联网运维及五年以上团队管理经验,多年容器云的运维,尤其是在Docker和kubernetes领域非常精通。

    Docker是一种相对使用较简单的容器,我们可以通过以下几种方式获取信息:

    1,通过docker run执行命令,或许返回信息

    2,通过docker logs去获取日志,做有针对性的筛选

    3,通过systemctl status docker查看docker服务状态

    4,通过journalctl -u docker.service查看日志

    以下是整理的docker容器类问题故障,分为9个类

    一,启动类故障

    1,

    docker:无法通过unix:///var/run/docker.sock连接到Docker守护程序。泊坞窗守护程序正在运行吗?

    原因:Docker未正常启动

    解决方式:

    systemctl启动docker

    2,

    无法创建Unix套接字/var/run/docker.sock:是目录

    原因:docker.sock不能创建

    解决方式:

    rm -rf /var/run/docker.sock

    然后重新启动docker

    3,

    docker.service的作业失败。无法启动Docker应用程序

    原因:Selinux引起

    解决方式:

    / etc / sysconfig / selinux,将selinux值替换为禁用

    重启docker解决

    4,

    泊坞窗:来自守护程序的错误响应:

    / var / lib / docker / overlay / XXXXXXXXXXXXXXXXXXXXXXXXXX:无此类文件或目录。

    原因:docker没有指定目录或文件

    解决方式:

    systemctl停止docker

    rm -rf / var / lib / docker / *

    systemctl启动docker

    重启run重新启动容器

    5,

    泊坞窗:来自守护程序的错误响应:冲突。容器名称“ XXX”已被容器“ XXX”使用。您必须删除(或重命名)该容器才能重用该名称。

    原因:码头工人名字重名

    解决方式:

    改名容器或者删除重建容器

    6,

    错误:连接激活失败:找不到适合此连接的设备

    原因:网卡配置问题

    解决方式:

    重启网卡

    7,

    系统重启后docker无法启动

    报错为:docker0:iptables:该名称没有链/目标/匹配

    原因:docker服务iptables问题

    解决方式:

    重启docker服务系统重启docker

    8,

    启动守护程序时出错:初始化graphdriver时出错:不支持驱动程序

    使用overlay2存储驱动启动docker daemon报错

    原因:daemon经济配置

    解决方式:

    添加配置:

    /etc/docker/daemon.json

    {“存储驱动器”:“ overlay2”,

    “存储选项”:[“ overlay2.override_kernel_check = true”]}

    9,

    无法启动docker.service:单位docker.service被屏蔽。

    未知原因:docker被遮罩

    解决方式:

    systemctl取消屏蔽docker.service

    systemctl取消屏蔽docker.socket

    systemctl启动docker.service

    10,

    无法启动docker.service:单元未正确加载:参数无效。

    未知原因:docker服务无法正常加载

    解决方式:

    卸载docker,删除docker.service

    重新安装docker

    11,

    docker-compose启动容器时报错:

    /usr/lib/python2.7/site-packages/requests/init.py:80:RequestsDependencyWarning:urllib3(1.22)或chardet(2.2.1)与支持的版本不匹配!RequestsDependencyWarning)

    未知原因:pip相应组件版本不支持

    解决方式:

    pip卸载urllib3

    pip卸载chardet

    点安装请求

    12,docker容器重启故障

    强杀docker进程后,重启docker。docker中的容器无法启动并报错

    docker restart XXXXXXX来自守护程序的错误响应:无法重新启动容器XXXXXXX:容器“ XXXXXXXXXXXXXXXX”:已存在

    原因:旧容器未安全退出

    解决方式:

    docker-containerd-ctr --address /run/docker/containerd/docker-containerd.sock --namespace c rm <容器hash_id>

    码头工人开始容器

    13,

    docker重启错误-重启命令一直卡住

    systemctl重新启动docker卡住

    未知原因:可能是启动的容器数量过多,或者磁盘IO问题

    解决方式:

    systemctl启动docker-cleanup.service

    systemctl启动docker

    二,权限问题报错

    14,

    尝试连接到unix:///var/run/docker.sock的Docker守护程序套接字时获得的权限被拒绝

    解决方式:

    查看/var/run/docker.sock其中用户组

    将用户重新加入docker组中,usermod -aG docker $ {USER}

    15,

    在步骤GROUP中使用chown socket:没有此类过程

    原因:docker无法找到Group组信息,docker组有可能被误删除,

    解决方式:

    groupadd泊坞窗

    16,

    发布http:///var/run/docker.sock/v1.XXX / auth:拨打unix /var/run/docker.sock:权限被拒绝。您是否要连接到没有TLS的启用TLS的守护程序?

    原因:非Root用户管理Docker时,权限不足

    解决方式:

    groupadd泊坞窗

    usermod -a -G docker用户

    17,

    码头工人犯错误

    处理tar文件时出错(退出状态1):意外的EOF

    原因:可能是权限问题引起

    解决方式:

    chmod + x加一个执行权限

    三,总体和仓库问题报错

    18,

    获取https://registry-1.docker.io/v2/:拨打tcp:查找注册表-1.docker.io

    原因:Docker仓库无法访问

    解决方式:

    修改Docker仓库源为国内或者自建的仓库源

    修改/etc/docker/daemon.json

    19,推出本地可行性报错

    推送指向存储库[XXXX]获取https:// xxx / v1 / _ping:http:服务器向HTTPS客户端提供了HTTP响应

    原因:docker Registry未采用https服务所致

    解决方式:

    /etc/docker/daemon.json文件写入:

    {“不安全的注册表”:[“”]}

    20,

    / usr / bin / docker-current:来自守护程序的错误响应:oci运行时错误:container_linux.go:启动容器进程导致“ exec:\” / bin / bash \”:在$ PATH中找不到可执行文件”。

    原因:Docker本身的固有问题或Docker引擎版本比较低导致

    解决方式:

    可以升级Docker版本服务

    21,精心设计,执行chown -R非常慢

    原因:Docker使用写时复制策略,所以chown命令执行时,将上层副本文件全部复制到当前层,然后再修改权限,再写入文件系统。

    解决方式:

    不应该使用chown -R类别大批量修改文件的命令

    22,docker build造就的的时候报错:

    来自syslogd内核的消息:unregister_netdevice:等待lo释放。使用次数= 1

    原因:docker engine版本过高

    解决方式:

    docker引擎版本需要和docker内部附加的内核版本匹配

    23,

    泊坞窗:来自守护程序的错误响应:容器:容器未在指定的超时之前启动。ERRO[0133]从守护程序获取事件的错误:上下文已取消

    原因:修改完docker root dir,重启后,下载多个报错

    解决方式:

    重启docker服务

    或者重启服务器

    四,资源问题报错

    25,

    Docker设备上没有剩余空间

    原因:空间不足

    解决方式:清理空间,删除删除使用的容器,额外等资源

    码头工人系统修剪-a

    26,

    / var / lib / docker / containers占用过大

    原因:日志文件占用过大

    解决方式:

    cat / dev / null> * -json.log

    或者

    增加dockerd启动参数,/ etc / docker / daemon.json

    {“ log-driver”:“ json-file”,

    “ log-opts”:{“ max-size”:“ 2G”,“ max-file”:“ 10”}

    27,

    最大虚拟内存区域vm.max_map_count [65530]太低,至少增加到[262144]

    原因:系统参数预设配置过小

    解决方式:

    修改/etc/sysctl.conf里面的vm.max_map_count调大

    28,

    无法启动容器进程导致“ process_linux.go:301:

    正在运行的exec setns进程进行初始化,导致\“退出状态40 \”“:未知。

    原因:可能是缓存问题引起

    解决方式:

    回声1> / proc / sys / vm / drop_caches

    29,

    docker本机启动多台容器导致出现后续容器启动失败

    原因:查看硬盘空间是否满,如果不是硬盘空间问题引起

    解决方式:

    vim /etc/sysctl.conf

    添加参数fs.aio-max-nr = 1048576

    sysctl -p

    30,Docker启动异常,状态反复重启

    Docker日志容器名,查看异常日志

    查看/ var / log /消息

    原因:内存跑满,引起OOM

    解决方式:

    释放内存后,再启动容器

    五,版本不兼容报错

    31,

    overlayfs:即使在ext4上,也无法删除从基本层移至新创建的目录的文件

    原因:Centos提供的文件系统XFS和Overlay兼容问题导致,

    解决方式:

    这个问题的修复在内核4.4.6以上

    32,

    泊坞窗:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:344:启动容器进程导致“ process_linux.go:297:从管道获取最终子进程的pid导致\“读取init-p:连接被同级重置\” ”:未知。

    原因:Docker版本和操作系统版本不匹配

    解决方式:

    重新安装和操作系统内核支持的docker版本

    六,网络或端口问题报错

    33,

    警告:IPv4转发已禁用。网络将无法正常工作。

    原因:ipv4网络无法转发

    解决方式:

    /usr/lib/sysctl.d/00-system.conf

    在最后一行添加net.ipv4.ip_forward = 1

    重启网络服务。删除错误的容器,再次创建新容器

    34,

    使用默认驱动程序创建网络“ xxxxxxx”

    原因:docker网关冲突

    启动容器,docker-compose启动容器后,断网问题

    解决方式:

    配置docker-compose.yml内给启动器的容器配置参数network_mode:“ bridge”

    35,

    找不到满足以下条件的节点[端口xxxx]

    原因:当容器使用端口映射(docker run -p xxxx:xxxx或compose模板中的

    ports)之后系统会在主机上创建一个端口,通过NAT来访问容器的指定端口。如果主机上的端口被容器或系统进程占用,则会导致端口分配失败。

    解决方式:

    清除占用端口的容器或者进程,或调整容器端口映射的主机机端口避免冲突

    36,

    来自守护程序的错误响应:名称为xxx的服务端点已经

    原因:端口已经被占用

    解决方式:

    重启docker容器

    37,

    泊坞窗:来自守护程序的错误响应:驱动程序无法对端点XXXXX上的外部连接进行编程:绑定0.0.0.0:80失败:端口已分配

    原因:容器端口冲突

    解决方式:

    更换主机机绑定端口

    七,Docker安装报错

    38,安装docker报要求:container-selinux> = 2.9

    原因:container-selinux版本低或者是没安装的原因

    解决方式:

    wget -O /etc/yum.repos.d/CentOS-Base.repo

    http://mirrors.aliyun.com/repo/Centos-7.repo

    百胜安装epel-release

    yum makecache

    yum install container-selinux

    39,安装docker-compose时报错

    “ ImportError:'模块'对象没有属性'check_specifier'”

    原因:setuptools版本问题

    解决方式:

    升级setuptools到30.1.0版本以上版本

    pip install --upgrade setuptools

    40,安装docker-compose时报错

    声明:Python 2.7将于2020年1月1日到期,请升级您的Python,因为在该日期之后将不再维护Python 2.7。pip的未来版本将放弃对Python 2.7的支持。

    原因:python2.7提示升级

    解决方式:

    点安装-i https://pypi.douban.com/simple docker-compose

    八,Docker删除报错

    41,docker删除容器报错

    来自守护程序的错误响应:驱动程序覆盖无法删除根文件系统xxxxx:remove / var / lib / docker / overlay2 / xxxxx / merged:设备或资源繁忙

    原因:容器挂载数据卷,无法直接删除

    解决方式:

    grep docker / proc / * / mountinfo | grep xxxxx

    kill进程后

    再重新删除容器

    42,状态死机的容器删除报错

    来自守护程序的错误响应:驱动程序aufs无法删除根文件系统XXXXXXXXXXXXXXXX:aufs:重试后卸载错误:/ var / lib / docker / aufs / mnt / xxxxxxxx:设备或资源繁忙

    原因:dead状态容器无法删除,还在占用资源

    解决方式:

    docker rm -fv容器id过几分钟后会自动删除

    43,泊坞窗删除错误报错

    来自守护程序的错误响应:冲突:无法删除存储库引用“ XXXX”(必须强制)-容器XXXX正在使用其引用的映像YYYY

    原因:必然正在被某容器使用

    解决方式:

    需要删除相关ID容器后,才能删除

    44,码头工人删除错误报错

    来自守护程序的错误响应:冲突:无法删除XXXXXXXXXX(必须强制执行)-在多个存储库中引用了图像

    原因:重新登录push了更长的其他仓库

    解决方式:

    如果不需要此补充,docker rmi -f强删

    45,泊坞窗删除错误报错

    来自守护程序的错误响应:冲突:无法删除XXX(无法强制执行)-图像具有相关的子图像

    原因:存在依赖于父本身的子整合

    解决方式:

    强制删除或者或者批量删除容器,再删除更多

    九,其他报错

    46,docker:来自守护程序的错误响应:驱动程序无法对端点XXXXXXX上的外部连接进行编程:( iptables失败:iptables --wait -t过滤器-A DOCKER!-i docker0 -o docker0 -p tcp -d 172.17.0.2- -dport 8080 -j接受:iptables:该名称没有链/目标/匹配。

    原因:防火墙问题引起

    解决方式:

    关闭防火墙,重启docker

    47,

    执行docker info出现如下警告

    警告:bridge-nf-call-iptables已禁用

    警告:bridge-nf-call-ip6tables已禁用

    原因:配置问题引起,需要启用bridge-nf-call-iptables

    解决方式:

    vi /etc/sysctl.conf

    添加以下内容

    net.bridge.bridge-nf-call-ip6tables = 1

    net.bridge.bridge-nf-call-iptables = 1

    net.bridge.bridge-nf-call-arptables = 1

    48,

    docker数据库相关报错

    使用Docker创建mysql容器闪退

    数据库未初始化,并且未指定密码选项

    解决方式:

    docker运行-d -e MYSQL_ROOT_PASSWORD = [密码] -p 3306:3306 mysql

    为避免出现各种奇怪且偶发的问题,运维和开发人员应该有规范的去使用docker容器,最大程度的去避免因为使用不当而引起的故障,参考以下:

    Docker使用规范建议

    尽量使用最近1-2年的新的稳定的docker版本

    不要去安装今年前很老的版本,大量的bug已经被新版本更新解决掉了

    尽量不要去创造非常大的替代,例如5G10G以上的

    最好要轻量化,去除多余的软件,数据等

    容器内挂载宿主机配置,使用替代

    容器需要-v主机的配置文件,尽量使用ro替换

    数据要挂载主机机物理硬盘或存储矩阵上

    不要直接在容器里运行,避免容器停机机引起数据丢失

    应用日志一定要挂到宿主机上

    不要直接打印到容器内部,避免只能docker logs方式查看,避免去vulume目录里查看日志

    不要只使用latest标签

    标签要有个管理标准,可以根据标签查找对应版本

    不要使用容器ip,配置里更不能写死(至少172.17.0.x)

    容器重启后,ip很可能会变

    尽量不要在单容器内跑多进程

    容器不是虚拟机,尽量做到1个容器,1个进程

    跨环境可持续保持一致

    绝对是测试,UAT,生产环境,尽量保持同一个副本,不要变更,环境变更只需要变更环境变量参数做区别

    一定监控docker容器,即使发现问题

    建议使用prometheus监控容器

    一定要限制docker容器的资源

    尤其是CPU,内存,硬盘空间,甚至是网络等,避免侵害占用主机机的硬件资源

    相关文章

      网友评论

        本文标题:干货丨Docker容器九类常见故障排查及处理

        本文链接:https://www.haomeiwen.com/subject/ptxcjltx.html