【docker基础知识】docker坑问题汇总
1. Got starting container process caused ":301: running exec setns process for init caused \"exit status 40\"": unknown. from time to time
most of the memories are consumed by page cache, echo 1 > /proc/sys/vm/drop_caches
2. Rpmdb checksum is invalid: dCDPT(pkg checksums):
描述:
rpm数据库损坏需要重建。需要在 yum install … 前使⽤ rpm –rebuilddb重建数据库
解决⽅法:
RUN rpm --rebuilddb && yum install -y ...
3. Docker宿主机agetty进程cpu占⽤率100%
描述:
使⽤"docker run"运⾏容器时使⽤了 /sbin/init和--privileged参数
解决⽅法:
在宿主机以及Container中运⾏下述命令
systemctl stop getty@tty1.service
systemctl mask getty@tty1.service
4. Failed to get D-Bus connection: Operation not permitted
描述:
centos 7.2容器内使⽤systemctl命令
解决⽅法:
docker run --privileged -d  /usr/sbin/init
5. 解决ssh登录慢慢的问题
使⽤了dns反查,当ssh某个IP时,通过DNS反查相对应的域名,如果DNS中没有这个IP的域名解析,等待超时
解决⽅法:/etc/ssh/sshd_config
设置 UseDNS no
6.  /etc/hosts, /f和/etc/hostname都是易失
问题描述:
/etc/hosts, /f和/etc/hostname,容器中的这三个⽂件不存在于镜像,⽽是存在
于/var/lib/docker/containers/<container_id>,在启动容器的时候,通过mount的形式将这些⽂件挂载到容器内部。因此,如果在容器中修改这些⽂件的话,修改部分不会存在于容器的top layer,⽽是直接写⼊这三个物理⽂件中。
解决⽅法:
通过docker run命令的--add-host参数来为容器添加host与ip的映射关系
通过echo -e "aaa 10.10.10.10\n" >> /etc/hosts
7. docker容器centos 7.2镜像⽀持中⽂
sudo localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
export LC_ALL="zh_CN.UTF-8"
8. docker容器时间为UTC时间,与宿主机相差8⼩时
cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
9. overlayfs: Can't delete file moved from base layer to newly created dir even on ext4
解决⽅法:
1. 停⽌各个中间服务,
stop容器(docker stop $(docker ps -qa))
systemctl stop docker
备份数据/srv lsof | grep srv
2. 查看磁盘分区fdisk -l , mount | grep srv
umount /dev/mapper/centos-srv
格式化: mkfs.xfs -fn ftype=1 /dev/mapper/centos-srv
查看ftype是否设置为1: xfs-info /srv |grep ftype
mount /dev/mapper/centos-srv /srv/
3. 恢复数据/srv
systemctl start docker
docker start $(docker ps -qa)
10. /var/lib/docker/overlay2 占⽤很⼤,占⽤⼏百G空间
描述:这个问题应该是容器内应⽤产⽣的数据或者⽇志造成
解决⽅法:
进⼊/var/lib/docker/overlay2,du -h --max-depth=1查看哪个容器占⽤的⽐较⼤,⼀看占⽤450G,
⼀查看发现⽇志占⽤的多,这个啥吗应⽤这么刷⽇志,是调试遗留的⼀个容器,⼀直在刷错误⽇志,docker kill and docker rm,⼀下释放了450多G
11. Error starting daemon: error initializing graphdriver: driver not supported
描述: 使⽤overlay2存储驱动启动docker daemon报错
解决⽅法: 添加配置如下:
cat /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
或者添加启动参数:
/usr/bin/dockerd --storage-driver=overlay2 --storage-opt overlay2.override_kernel_check=1
docker进入容器11. 修改docker容器最⼤⽂件数(open files)
直接修改docker container的 /etc/f⽆效
宿主机上执⾏如下操作:
[lin@node1 ~]$ cat /etc/sysconfig/docker
ulimit -HSn 999999
重起docker daemon进程,systemctl restart docker
12. /var/lib/docker/containers 占⽤过⼤
描述: 容器⽇志⼀般存放在/var/lib/docker/containers/container_id/下⾯, 以json.log结尾的⽂件(业务⽇志)很⼤。
如果docker容器正在运⾏,那么使⽤rm -rf⽅式删除⽇志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者⽂件管理器删除⽂件,将会从⽂件系统的⽬录结构上解除链接(unlink)。如果⽂件是被打开的(有⼀个进程正在使⽤),那么进程将仍然可以读取该⽂件,磁盘空间也⼀直被占⽤
解决⽅法1:cat /dev/null > *-json.log
#!/bin/sh
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
解决⽅法2:增加dockerd启动参数,/etc/docker/daemon.json
{
"registry-mirrors": ["registry.docker-cn"],
"max-concurrent-downloads": 6,
"insecure-registries":["line.local", "harbor.local"],
"log-driver":"json-file",
"log-opts": {"max-size":"2G", "max-file":"10"}
}
13. umount.nfs device is busy
描述:
[root@localhost /]# umount /data/share/gaocheng
umount.nfs: /data/share/gaocheng: device is busy
解决⽅法:
-v 表⽰ verbose 模式。进程以 ps 的⽅式显⽰,包括 PID、USER、COMMAND、ACCESS 字段
-m 表⽰指定⽂件所在的⽂件系统或者块设备(处于 mount 状态)。所有访问该⽂件系统的进程都被列出。
如上所⽰,有进程占⽤了,将其kill掉,再重新取消挂载
kill -9 25869 45636 131466
umount /data/share/gaocheng
14. docker hang
only found in docker/发现想要获取lock,真特么得不到,导致所有都等待,暂未发现哪⾥给lock了
func (s *State) IsRunning() bool {
s.Lock()
res := s.Running
s.Unlock()
return res
}
15 Too many open files的四种解决办法
⼀  单个进程打开⽂件句柄数过多
通过“cat /proc/<pid>/limits”查看
⼆ 操作系统打开的⽂件句柄数过多
/proc/sys/fs/file-max”命令来动态修改该值,也可以通过修改"/f"⽂件来永久修改该值
三 systemd对该进程进⾏了限制
LimitNOFILE=
四 inotify达到上限
监控机制,可以监控⽂件系统的变化。该机制受到2个内核参数的影
响:“fs.inotify.max_user_instances”和“fs.inotify.max_user_watches”,其中“fs.inotify.max_user_instances”表⽰每个⽤户最多可以创建的inotify instances数量上限,“fs.inotify.max_user_watches”表⽰么个⽤户同时可以添加的watch数⽬
参考:Too many open files的四种解决办法
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。