Docker容器九类常见故障
错误原因:
在防火墙中默认 nat 是 REJECT的,所以端口映射被拒绝。
解决方法:
vim /etc/sysconfig/iptables ##注释掉下面这一行,这行的意思是拒绝掉所有的FORWARD,拒绝的提示信息是icmp-host-prohibited(禁止) #-A FORWARD -j REJECT --reject-with icmp-host-prohibited #重启iptables systemctl restart iptables.service
网上其他的解决方法:基本都是重置docker0网络,重启docker
pkill docker iptables -t nat -F ifconfig docker 0 down brctl delbr docker 0 docker -d ##重启docker服务 systemctl restart docker
网上有的说是只重启docker即可,即只执行systemctl restart docker,我自己也是这样解决掉问题的。
如果还是不行的话,就按照上面的方式试一试,可能是网络原因造成的
可以参考
docker 报错整理
docker学习笔记之七:解决 -i docker0: iptables: No chain/target/match by that name.
这两篇文章写的还是比较透彻的,主要就是防火墙映射转发之类的,需要了解下防火墙相关的只是,因此暂时不做深入了解,等有时间了再好好研究防火墙。
本文转自@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应用程序
%20%20%20原因:Selinux引起
%20%20%20解决方式:
%20%20%20/%20etc%20/%20sysconfig%20/%20selinux,将selinux值替换为禁用
%20%20%20重启docker解决
%20%20%204,
%20%20%20泊坞窗:来自守护程序的错误响应:
%20%20%20/%20var%20/%20lib%20/%20docker%20/%20overlay%20/%20XXXXXXXXXXXXXXXXXXXXXXXXXX:无此类文件或目录。
%20%20%20原因:docker没有指定目录或文件
%20%20%20解决方式:
%20%20%20systemctl停止docker
%20%20%20rm%20-rf%20/%20var%20/%20lib%20/%20docker%20/%20*
%20%20%20systemctl启动docker
%20%20%20重启run重新启动容器
%20%20%205,
%20%20%20泊坞窗:来自守护程序的错误响应:冲突。容器名称“%20XXX”已被容器“%20XXX”使用。您必须删除(或重命名)该容器才能重用该名称。
%20%20%20原因:码头工人名字重名
%20%20%20解决方式:
%20%20%20改名容器或者删除重建容器
%20%20%206,
%20%20%20错误:连接激活失败:找不到适合此连接的设备
%20%20%20原因:网卡配置问题
%20%20%20解决方式:
%20%20%20重启网卡
%20%20%207,
%20%20%20系统重启后docker无法启动
%20%20%20报错为:docker0:iptables:该名称没有链/目标/匹配
%20%20%20原因:docker服务iptables问题
%20%20%20解决方式:
%20%20%20重启docker服务系统重启docker
%20%20%208,
%20%20%20启动守护程序时出错:初始化graphdriver时出错:不支持驱动程序
%20%20%20使用overlay2存储驱动启动docker%20daemon报错
%20%20%20原因:daemon经济配置
%20%20%20解决方式:
%20%20%20添加配置:
%20%20%20/etc/docker/daemon.json
%20%20%20{“存储驱动器”:“%20overlay2”,
%20%20%20“存储选项”:[“%20overlay2.override_kernel_check%20=%20true”]}
%20%20%209,
%20%20%20无法启动docker.service:单位docker.service被屏蔽。
%20%20%20未知原因:docker被遮罩
%20%20%20解决方式:
%20%20%20systemctl取消屏蔽docker.service
%20%20%20systemctl取消屏蔽docker.socket
%20%20%20systemctl启动docker.service
%20%20%2010,
%20%20%20无法启动docker.service:单元未正确加载:参数无效。
%20%20%20%20%20%20未知原因:docker服务无法正常加载
%20%20%20解决方式:
%20%20%20卸载docker,删除docker.service
%20%20%20重新安装docker
%20%20%2011,
%20%20%20docker-compose启动容器时报错:
%20%20%20/usr/lib/python2.7/site-packages/requests/init.py:80:RequestsDependencyWarning:urllib3(1.22)或chardet(2.2.1)与支持的版本不匹配!RequestsDependencyWarning)
%20%20%20未知原因:pip相应组件版本不支持
%20%20%20解决方式:
%20%20%20pip卸载urllib3
%20%20%20pip卸载chardet
%20%20%20点安装请求
%20%20%2012,docker容器重启故障
%20%20%20强杀docker进程后,重启docker。docker中的容器无法启动并报错
%20%20%20docker%20restart%20XXXXXXX来自守护程序的错误响应:无法重新启动容器XXXXXXX:容器“%20XXXXXXXXXXXXXXXX”:已存在
%20%20%20原因:旧容器未安全退出
%20%20%20解决方式:
%20%20%20docker-containerd-ctr%20--address%20/run/docker/containerd/docker-containerd.sock%20--namespace%20c%20rm%20<容器hash_id>
%20%20%20码头工人开始容器
%20%20%2013,
%20%20%20docker重启错误-重启命令一直卡住
%20%20%20systemctl重新启动docker卡住
%20%20%20未知原因:可能是启动的容器数量过多,或者磁盘IO问题
%20%20%20解决方式:
%20%20%20systemctl启动docker-cleanup.service
%20%20%20systemctl启动docker
%20%20%20二,权限问题报错
%20%20%2014,
%20%20%20尝试连接到unix:///var/run/docker.sock的Docker守护程序套接字时获得的权限被拒绝
%20%20%20解决方式:
%20%20%20查看/var/run/docker.sock其中用户组
%20%20%20将用户重新加入docker组中,usermod%20-aG%20docker%20$%20{USER}
%20%20%2015,
%20%20%20在步骤GROUP中使用chown%20socket:没有此类过程
%20%20%20%20%20%20原因:docker无法找到Group组信息,docker组有可能被误删除,
%20%20%20解决方式:
%20%20%20groupadd泊坞窗
%20%20%2016,
%20%20%20发布http:///var/run/docker.sock/http://v1.XXX%20/%20auth:拨打unix%20/var/run/docker.sock:权限被拒绝。您是否要连接到没有TLS的启用TLS的守护程序?
%20%20%20原因:非Root用户管理Docker时,权限不足
%20%20%20解决方式:
%20%20%20groupadd泊坞窗
%20%20%20usermod%20-a%20-G%20docker用户
%20%20%2017,
%20%20%20码头工人犯错误
%20%20%20处理tar文件时出错(退出状态1):意外的EOF
%20%20%20原因:可能是权限问题引起
%20%20%20解决方式:
%20%20%20chmod%20+%20x加一个执行权限
%20%20%20三,总体和仓库问题报错
%20%20%2018,
%20%20%20获取https://registry-1.docker.io/v2/:拨打tcp:查找注册表http://-1.docker.io
%20%20%20原因:Docker仓库无法访问
%20%20%20解决方式:
%20%20%20修改Docker仓库源为国内或者自建的仓库源
%20%20%20修改/etc/docker/daemon.json
%20%20%2019,推出本地可行性报错
%20%20%20推送指向存储库[XXXX]获取https://%20xxx%20/%20v1%20/%20_ping:http:服务器向HTTPS客户端提供了HTTP响应
%20%20%20原因:docker%20Registry未采用https服务所致
%20%20%20解决方式:
%20%20%20/etc/docker/daemon.json文件写入:
%20%20%20{“不安全的注册表”:[“”]}
%20%20%2020,
%20%20%20/%20usr%20/%20bin%20/%20docker-current:来自守护程序的错误响应:oci运行时错误:container_linux.go:启动容器进程导致“%20exec:\”%20/%20bin%20/%20bash%20\”:在$%20PATH中找不到可执行文件”。
%20%20%20原因:Docker本身的固有问题或Docker引擎版本比较低导致
%20%20%20解决方式:
%20%20%20可以升级Docker版本服务
%20%20%2021,精心设计,执行chown%20-R非常慢
%20%20%20原因:Docker使用写时复制策略,所以chown命令执行时,将上层副本文件全部复制到当前层,然后再修改权限,再写入文件系统。
%20%20%20解决方式:
%20%20%20不应该使用chown%20-R类别大批量修改文件的命令
%20%20%2022,docker%20build造就的的时候报错:
%20%20%20来自syslogd内核的消息:unregister_netdevice:等待lo释放。使用次数=%201
%20%20%20原因:docker%20engine版本过高
%20%20%20解决方式:
%20%20%20docker引擎版本需要和docker内部附加的内核版本匹配
%20%20%2023,
%20%20%20泊坞窗:来自守护程序的错误响应:容器:容器未在指定的超时之前启动。ERRO[0133]从守护程序获取事件的错误:上下文已取消
%20%20%20原因:修改完docker%20root%20dir,重启后,下载多个报错
%20%20%20解决方式:
%20%20%20重启docker服务
%20%20%20或者重启服务器
%20%20%20四,资源问题报错
%20%20%2025,
%20%20%20Docker设备上没有剩余空间
%20%20%20原因:空间不足
%20%20%20解决方式:清理空间,删除删除使用的容器,额外等资源
%20%20%20码头工人系统修剪-a
%20%20%2026,
%20%20%20/%20var%20/%20lib%20/%20docker%20/%20containers占用过大
%20%20%20原因:日志文件占用过大
%20%20%20解决方式:
%20%20%20cat%20/%20dev%20/%20null>%20*%20-json.log
%20%20%20或者
%20%20%20增加dockerd启动参数,/%20etc%20/%20docker%20/%20daemon.json
%20%20%20{“%20log-driver”:“%20json-file”,
%20%20%20“%20log-opts”:{“%20max-size”:“%202G”,“%20max-file”:“%2010”}
%20%20%2027,
%20%20%20最大虚拟内存区域vm.max_map_count%20[65530]太低,至少增加到[262144]
%20%20%20原因:系统参数预设配置过小
%20%20%20解决方式:
%20%20%20修改/etc/sysctl.conf里面的vm.max_map_count调大
%20%20%2028,
%20%20%20无法启动容器进程导致“%20process_linux.go:301:
%20%20%20正在运行的exec%20setns进程进行初始化,导致\“退出状态40%20\”“:未知。
%20%20%20时
%20%20%20原因:可能是缓存问题引起
%20%20%20解决方式:
%20%20%20回声1>%20/%20proc%20/%20sys%20/%20vm%20/%20drop_caches
%20%20%2029,
%20%20%20docker本机启动多台容器导致出现后续容器启动失败
%20%20%20原因:查看硬盘空间是否满,如果不是硬盘空间问题引起
%20%20%20解决方式:
%20%20%20vim%20/etc/sysctl.conf
%20%20%20添加参数fs.aio-max-nr%20=%201048576
%20%20%20sysctl%20-p
%20%20%2030,Docker启动异常,状态反复重启
%20%20%20%20%20%20Docker日志容器名,查看异常日志
查看/%20var%20/%20log%20/消息
%20%20%20%20%20%20原因:内存跑满,引起OOM
%20%20%20解决方式:
%20%20%20释放内存后,再启动容器
%20%20%20五,版本不兼容报错
%20%20%2031,
%20%20%20overlayfs:即使在ext4上,也无法删除从基本层移至新创建的目录的文件
%20%20%20原因:Centos提供的文件系统XFS和Overlay兼容问题导致,
%20%20%20解决方式:
%20%20%20这个问题的修复在内核4.4.6以上
%20%20%2032,
%20%20%20泊坞窗:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:344:启动容器进程导致“%20process_linux.go:297:从管道获取最终子进程的pid导致\“读取init-p:连接被同级重置\”%20”:未知。
%20%20%20原因:Docker版本和操作系统版本不匹配
%20%20%20解决方式:
%20%20%20重新安装和操作系统内核支持的docker版本
%20%20%20六,网络或端口问题报错
%20%20%2033,
%20%20%20警告:IPv4转发已禁用。网络将无法正常工作。
%20%20%20原因:ipv4网络无法转发
%20%20%20解决方式:
%20%20%20/usr/lib/sysctl.d/00-system.conf
%20%20%20在最后一行添加net.ipv4.ip_forward%20=%201
%20%20%20重启网络服务。删除错误的容器,再次创建新容器
%20%20%2034,
%20%20%20使用默认驱动程序创建网络“%20xxxxxxx”
%20%20%20原因:docker网关冲突
%20%20%20启动容器,docker-compose启动容器后,断网问题
%20%20%20解决方式:
%20%20%20配置docker-compose.yml内给启动器的容器配置参数network_mode:“%20bridge”
%20%20%2035,
%20%20%20找不到满足以下条件的节点[端口xxxx]
%20%20%20原因:当容器使用端口映射(docker%20run%20-p%20xxxx:xxxx或compose模板中的
%20%20%20ports)之后系统会在主机上创建一个端口,通过NAT来访问容器的指定端口。如果主机上的端口被容器或系统进程占用,则会导致端口分配失败。
%20%20%20解决方式:
%20%20%20清除占用端口的容器或者进程,或调整容器端口映射的主机机端口避免冲突
%20%20%2036,
%20%20%20来自守护程序的错误响应:名称为xxx的服务端点已经
%20%20%20原因:端口已经被占用
%20%20%20解决方式:
%20%20%20重启docker容器
%20%20%2037,
%20%20%20泊坞窗:来自守护程序的错误响应:驱动程序无法对端点XXXXX上的外部连接进行编程:绑定0.0.0.0:80失败:端口已分配
%20%20%20原因:容器端口冲突
%20%20%20解决方式:
%20%20%20更换主机机绑定端口
%20%20%20七,Docker安装报错
%20%20%2038,安装docker报要求:container-selinux>%20=%202.9
%20%20%20%20%20%20原因:container-selinux版本低或者是没安装的原因
%20%20%20解决方式:
%20%20%20wget%20-O%20/etc/yum.repos.d/CentOS-Base.repo
%20%20%20http://mirrors.aliyun.com/repo/Centos-7.repo
%20%20%20百胜安装epel-release
%20%20%20yum%20makecache
%20%20%20yum%20install%20container-selinux
%20%20%2039,安装docker-compose时报错
%20%20%20“%20ImportError:'模块'对象没有属性'check_specifier'”
%20%20%20原因:setuptools版本问题
%20%20%20解决方式:
%20%20%20升级setuptools到30.1.0版本以上版本
%20%20%20pip%20install%20--upgrade%20setuptools
%20%20%2040,安装docker-compose时报错
%20%20%20声明:Python%202.7将于2020年1月1日到期,请升级您的Python,因为在该日期之后将不再维护Python%202.7。pip的未来版本将放弃对Python%202.7的支持。
%20%20%20原因:python2.7提示升级
%20%20%20解决方式:
%20%20%20点安装-i%20https://pypi.douban.com/simple%20docker-compose
%20%20%20八,Docker删除报错
%20%20%2041,docker删除容器报错
%20%20%20来自守护程序的错误响应:驱动程序覆盖无法删除根文件系统xxxxx:remove%20/%20var%20/%20lib%20/%20docker%20/%20overlay2%20/%20xxxxx%20/%20merged:设备或资源繁忙
%20%20%20%20%20%20原因:容器挂载数据卷,无法直接删除
%20%20%20解决方式:
%20%20%20grep%20docker%20/%20proc%20/%20*%20/%20mountinfo%20|%20grep%20xxxxx
%20%20%20kill进程后
%20%20%20再重新删除容器
%20%20%2042,状态死机的容器删除报错
%20%20%20来自守护程序的错误响应:驱动程序aufs无法删除根文件系统XXXXXXXXXXXXXXXX:aufs:重试后卸载错误:/%20var%20/%20lib%20/%20docker%20/%20aufs%20/%20mnt%20/%20xxxxxxxx:设备或资源繁忙
%20%20%20原因:dead状态容器无法删除,还在占用资源
%20%20%20解决方式:
%20%20%20docker%20rm%20-fv容器id过几分钟后会自动删除
%20%20%2043,泊坞窗删除错误报错
%20%20%20来自守护程序的错误响应:冲突:无法删除存储库引用“%20XXXX”(必须强制)-容器XXXX正在使用其引用的映像YYYY
%20%20%20原因:必然正在被某容器使用
%20%20%20解决方式:
%20%20%20需要删除相关ID容器后,才能删除
%20%20%2044,码头工人删除错误报错
%20%20%20来自守护程序的错误响应:冲突:无法删除XXXXXXXXXX(必须强制执行)-在多个存储库中引用了图像
%20%20%20原因:重新登录push了更长的其他仓库
%20%20%20解决方式:
%20%20%20如果不需要此补充,docker%20rmi%20-f强删
%20%20%2045,泊坞窗删除错误报错
%20%20%20来自守护程序的错误响应:冲突:无法删除XXX(无法强制执行)-图像具有相关的子图像
%20%20%20原因:存在依赖于父本身的子整合
%20%20%20解决方式:
%20%20%20强制删除或者或者批量删除容器,再删除更多
%20%20%20九,其他报错
%20%20%2046,docker:来自守护程序的错误响应:驱动程序无法对端点XXXXXXX上的外部连接进行编程:(%20iptables失败:iptables%20--wait%20-t过滤器-A%20DOCKER!-i%20docker0%20-o%20docker0%20-p%20tcp%20-d%20172.17.0.2-%20-dport%208080%20-j接受:iptables:该名称没有链/目标/匹配。
%20%20%20原因:防火墙问题引起
%20%20%20解决方式:
%20%20%20关闭防火墙,重启docker
%20%20%2047,
%20%20%20执行docker%20info出现如下警告
%20%20%20警告:bridge-nf-call-iptables已禁用
%20%20%20警告:bridge-nf-call-ip6tables已禁用
%20%20%20原因:配置问题引起,需要启用bridge-nf-call-iptables
%20%20%20解决方式:
%20%20%20vi%20/etc/sysctl.conf
%20%20%20添加以下内容
%20%20%20net.bridge.bridge-nf-call-ip6tables%20=%201
%20%20%20net.bridge.bridge-nf-call-iptables%20=%201
%20%20%20net.bridge.bridge-nf-call-arptables%20=%201
%20%20%2048,
%20%20%20docker数据库相关报错
%20%20%20使用Docker创建mysql容器闪退
%20%20%20数据库未初始化,并且未指定密码选项
%20%20%20解决方式:
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,内存,硬盘空间,甚至是网络等,避免侵害占用主机机的硬件资源
yaoshengting
启动docker容器时报iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport错误
同创永益
干货丨Docker容器九类常见故障排查及处理