docker常见问题汇总

docker常用问题处理指南

1、修改数据存储路径

docker安装好后默认的路径在/var/lib/docker下,在安装操作系统的时候选择的是默认的分区的话,根目录只有50G,跑不了几个容器就满了,所以需要修改数据存储路径。有以下两种方法,一种是使用操作系统的软链接,另一种是在配置文件daemon.json中配置"graph"。

方法一:

0.停止正在运行的docker: service docker stop

1.创建文件夹:mkdir disk/docker (disk为新磁盘目录名)

2.移动/var/lib/docker/目录到新目录中: mv /var/lib/docker/* /disk/docker

3.删除/var/lib/docker/目录: rm -rf /var/lib/docker

4.软连接/disk/docker到/var/lib/里: ln -s /app/docker /var/lib/

5.启动docker: service docker start

方法二:

[$] vi /etc/docker/daemon.json
{"registry-mirrors": ["http://7e61f7f9.m.daocloud.io"]}

// 添加内容:
{"graph": "/home/docker/data"}

// 文件修改后的内容:
[$] cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://7e61f7f9.m.daocloud.io"],
"graph": "/home/docker/data"
}

docker info |grep 'Docker Root Dir' 查看修改后的存储路径

2、清理数据空间

docker在运行一段时间后会发生运行容器(Exit)太多而导致的磁盘空间满的情况。尤其是K8S中频繁的迭代或重启之类的操作会有大量的Exit容器。

1.13版本后Docker提供给了一些System命令,使用System df命令可以查看Docker占用分布:

docker system df
docker system df -v

docker system prune
执行docker system prune清理的内容有:

  1. 已停止的容器
  2. 未被任何容器使用的卷
  3. 未被任何容器所关联的网络
  4. 所有悬空的镜像

docker system prune -a 会一并清楚所有未被使用的镜像和无tag的镜像。

也可以使用shell命令去定向删除:

//手工删除
//删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

OR

docker ps -a|grep Exited|awk '{print$1}'
docker rm `docker ps -a|grep Exited|awk '{print $1}'`

//删除所有无tag的镜像
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
//删除所有无用得到数据卷
docker volume rm $(docker volume ls -qf dangling=true)
//强制删除所有未被容器使用的镜像
docker image prune -a -f
//强制清理退出的容器快照
docker rm $(docker ps -q -f status=exited)

3、docker_device_busy

在删除docker镜像的时候,会遇到device or resource busy,报错如下:

/proc/10990/mountinfo:3238 2992 0:358 / /var/lib/docker/containers/240fd32e33f20035985dced2b0352b5ae0e55c0036cdc50b34054cc8f4527c74/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k

看字面意思也很简单就是驱动忙的意思,和linux下umonut正在使用的磁盘是一个概念。把占用的进程kill掉就好了。

grep 240fd32e33f20035985dced2b0352b5ae0e55c0036cdc50b34054cc8f4527c74 /proc/*/mountinfo
//grep的串就是报错信息中的那个串
返回结果:
/proc/10990/mountinfo:3238 2992 0:358 / /var/lib/docker/containers/240fd32e33f20035985dced2b0352b5ae0e55c0036cdc50b34054cc8f4527c74/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k
/proc/11079/mountinfo:3238 2992 0:358 / /var/lib/docker/containers/240fd32e33f20035985dced2b0352b5ae0e55c0036cdc50b34054cc8f4527c74/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k

执行:kill -9 10990 11079
再次删除镜像,OK。

4、docker升级

一次线上dockerhub使用的存储崩溃了(还好有备份的~)再加上存储挂载到K8S上和其他程序共享(手生不敢动555)恢复起来比较困难。所以干脆重新部署一个并且升级。扯远了,详见dockerhub的专题吧。总之是会遇到版本的问题需要升级docker。

//查找主机上关于Docker的软件包

rpm -qa | grep docker

//使用yum remove卸载软件

yum remove docker-*

//使用curl升级到最新版

curl -fsSL https://get.docker.com/ | sh

执行:

#重启Docker
systemctl restart docker
#设置Docker开机自启
systemctl enable docker
#查看Docker版本信息
docker version
#查看Docker系统信息,包括镜像和容器数…
docker info

5、docker dead but pid file exists

Cnetos6.5下安装docker报错,安装完成启动报错:docker dead but pid file exists

度娘一下是因为device-mapper-libs版本过低导致的。

yum update -y device-mapper-libs

service docker restart

6、Failed to get D-Bus connection: Operation not permitted

有一次我在镜像里装了一个ldapphpadmin需要用到http,然后启动http的时候报错(systemct restart httpd),提示Failed to get D-Bus connection: Operation not permitted

这个问题其实应该放到docker容器启动实战里,不过既然是报错那么就一起归纳了吧。

ubuntu16.04以上版本, redhat, oraclelinux, centos但非centos7镜像等:

$ docker run -d --privileged=true IMAGENAME:TAG /usr/sbin/init

$ docker exec -it CONTAINERID /bin/bash

IMAGENAME:TAG: 指定需要启动的镜像和标签,CONTAINERID: 容器的id(可用docker ps -a查看)。

centos7下:

docker run -d -e "container=docker" --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup --name centos7 centos:centos7 /usr/sbin/init

docker exec -it centos7 /bin/bash

进入容器中使用systemctl restart http,OK。

7、容器时间差8小时

不用想是时区问题,有三个方案:
1、在dockerfile中添加RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone 重制镜像
2、启动容器的时候添加-v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime
3、docker cp /etc/localtime [containerId]:/etc/localtime
docker cp /etc/timezone [containerId]:/etc/timezone

8、start of the service was attempted too often

一次重启服务器后,再启动docker报错。
解决方法:将/etc/docker/daemon.json改成daemon.conf 重启docker成功。
啥原理咱也不知道

原文地址:https://www.cnblogs.com/zhaobowen/p/13254610.html