头图

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

同创永益

-本文转自@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应用程序
image.png

原因: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:单元未正确加载:参数无效。
image.png

未知原因: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:没有此类过程
image.png

原因: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/...
原因: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启动异常,状态反复重启
image.png

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

查看/ var / log /消息
image.png

原因:内存跑满,引起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
image.png

原因:container-selinux版本低或者是没安装的原因
解决方式:
wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/rep...
百胜安装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:设备或资源繁忙
image.png

原因:容器挂载数据卷,无法直接删除
解决方式:
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容器闪退
数据库未初始化,并且未指定密码选项
image.png

解决方式:
docker运行-d -e MYSQL_ROOT_PASSWORD = [密码] -p 3306:3306 mysql
为避免出现各种奇怪且偶发的问题,运维和开发人员应该有规范的去使用docker容器,最大程度的去避免因为使用不当而引起的故障,参考以下:

Docker使用规范建议

1.尽量使用最近1-2年的新的稳定的docker版本
不要去安装今年前很老的版本,大量的bug已经被新版本更新解决掉了

2.尽量不要去创造非常大的替代,例如5G10G以上的
最好要轻量化,去除多余的软件,数据等

3.容器内挂载宿主机配置,使用替代
容器需要-v主机的配置文件,尽量使用ro替换

4.数据要挂载主机机物理硬盘或存储矩阵上
不要直接在容器里运行,避免容器停机机引起数据丢失

5.应用日志一定要挂到宿主机上
不要直接打印到容器内部,避免只能docker logs方式查看,避免去vulume目录里查看日志

6.不要只使用latest标签
标签要有个管理标准,可以根据标签查找对应版本

7.不要使用容器ip,配置里更不能写死(至少172.17.0.x)
容器重启后,ip很可能会变

8.尽量不要在单容器内跑多进程
容器不是虚拟机,尽量做到1个容器,1个进程

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

10.一定监控docker容器,即使发现问题
建议使用prometheus监控容器

11.一定要限制docker容器的资源
尤其是CPU,内存,硬盘空间,甚至是网络等,避免侵害占用主机机的硬件资源

阅读 1.5k

同创永益,面向未来的组织韧性服务提供商

4 声望
0 粉丝
0 条评论
你知道吗?

同创永益,面向未来的组织韧性服务提供商

4 声望
0 粉丝
宣传栏