• 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成功。
    啥原理咱也不知道

  • 相关阅读:
    Permutations II
    LeetCode Sudoku Solver
    LeetCode Insert Interval
    LeetCode Unique Binary Search Trees II
    LeetCode Edit Distance
    LeetCode N-Queens II
    ListView自定义适配器--10.17
    Android开发--ListPreferance 运行报错:android.preference.ListPreference.findIndexOfValue(ListPreference.java:169)
    使用Genymotion作Android开发模拟器:安装Genymotion、部署Genymotion Vitrue Device、安装Genymotion eclipse插件
    Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
  • 原文地址:https://www.cnblogs.com/zhaobowen/p/13254610.html
Copyright © 2020-2023  润新知