• 关于Docker清理


    在Docker的日常使用中,我们或许偶尔遇到下面这些情况:

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker-compose ps
    [27142] INTERNAL ERROR: cannot create temporary directory!

    $ df -h
    Filesystem Size Used Avail Use% Mounted on
    devtmpfs 489M 132K 488M 1% /dev
    tmpfs 497M 0 497M 0% /dev/shm
    /dev/xvda1 7.8G 7.7G 0 100% /

    这时候,我们大概明白了,大概是Docker把磁盘占满了。这时就需要我们去做一些清理了,这篇博客主要总结如下一些有效的Docker清理操作。

    • 找到dockers数据与进程;
    • 删除未使用的镜像,容器,卷和网络;
    • 重置docker
    • 限制日志大小
    • 其他相关操作

    在了解这些之前,我相信你已经对下面的一些词汇已经有一定的了解。

    • image: 一个只读模版,可以用来创建container。如,一个包含ubuntu系统的镜像。
    • container: 从镜像创建的运行实例。可以用docker命令去控制这些container。
    • volume: docker数据持久化。
    • dangling: 未使用的image。
    • network: 连接docker容器服务。

    查看Docker的磁盘使用情况

    使用docker system df即可查看:

    1
    2
    3
    4
    5
    $ docker system df
    TYPE TOTAL ACTIVE SIZE RECLAIMABLE
    Images 13 7 6.4 GB 7.2 MB (88%)
    Containers 8 0 42.85 MB 42.85 MB (100%)
    Local Volumes 5 5 3.541 GB 0 B (0%)

    如上,镜像占了6.4GB, 容器占了42.85 MB, 数据卷占了3.541 GB。 了解基本占用后,我们就可以用下面介绍的命令进行针对性的清理了。

    找到Dockers数据与进程

    要清理docker,就要知道docker数据在哪,具体有哪些docker进程。

    1. docker images 列出docker镜像;
    2. docker ps 列出docker容器;
    3. docker volume ls 列出docker数据卷;
    4. docker network ls 列出docker网络;
    5. docker info 列出容器镜像的数量以及一些docker 安装等系统信息。

    清除未使用的数据与进程

    docker提供了一些快捷的命令去清除未使用的容器,网络和镜像:

    1
    2
    3
    4
    5
    6
    7
    $ docker system prune
    WARNING! This will remove:
    - all stopped containers
    - all networks not used by at least one container
    - all dangling images
    - all dangling build cache
    Are you sure you want to continue? [y/N]

    默认是没有清除数据卷的功能,由于数据比较重要,防止意外删除一些数据。可以通过--volumes指定。

    同时,我们还可以将—all清除未使用的images。使用--force免确认。

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker system prune --all --volumes
    WARNING! This will remove:
    - all stopped containers
    - all networks not used by at least one container
    - all volumes not used by at least one container
    - all images without at least one container associated to them
    - all build cache
    Are you sure you want to continue? [y/N]

    当然,我们也可以单独清除。

    • docker container prune 清除停止的容器;
    • docker volume prune 清除未使用的数据卷;
    • docker image prune 清除未使用的镜像;

    清除所有数据重置docker

    上面的命令不会影响运行中的容器以及关联的镜像,数据卷和网络。如果你需要全部清理就需要将所有容器都停止下来。

    使用docker container stop [CONTAINERS...]能停止正在运行的容器。同时我们可以通过下面命令获取正在运行的容器ID。

    大专栏  关于Docker清理r">
    1
    $ docker container ls -aq
    • ls 列出所有容器;
    • --all / -a列出所有容器(包含未运行的);
    • --quiet / -q 只显示容器ID;

    于是我们可以使用下面命令停止所有容器:

    1
    $ docker container stop $(docker container ls -a -q)

    结合清除的命令,完整的清除所有的容器命令如下:

    1
    $ docker container stop $(docker container ls -a -q) && docker system prune -a -f --volumes

    同理,我们可以想到:

    • 清除容器 docker container rm $(docker container ls -a -q) / docker rm $(docker ps -a -q);
    • 清除镜像 docker image rm $(docker images ls -a -q);
    • 清除数据卷 docker volume rm $(docker volume ls -q);
    • 清除网络 docker network rm $(docker network ls -q);

    限制容器日志大小

    很多时候,我们发现我们都是被日志文件撑爆的,解决问题的源头就是限制容器日志大小,方法有三:

    • 修改daemon.json配置;

      1
      2
      3
      4
      5
      {
      "log-opts": {
      "max-size" : "521m"
      }
      }
    • 修改docker-compose

      1
      2
      3
      4
      5
      6
      7
      ubuntu:
      image: ubuntu
      restart: always
      logging:
      driver: "json-file"
      options:
      max-size: "1g"
    • 通过参数;

      1
      $ docker run -d --log-opt max-size=1g ubuntu

    其他常见的有关清理命令

    • 清除指定日志文件;

      如果你要删除指定容器的日志,只有几步即可。

      1
      2
      3
      4

      # 获取该容器的日志地址
      $ docker inspect 2ed640d8fcd1 --format '{{.LogPath}}'
      /mnt/data/docker/containers/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a-json.log

      知道了日志地址,你就可以删除或清空该日志了,不过注意权限哦~

    • 杀死所有正在运行的容器;

      1
      $ docker kill $(docker ps -a -q)
    • 删除所有已经停止的容器;

      1
      $ docker rm $(docker ps -a -q)
    • 删除未打标签的镜像;

      1
      $ docker rmi $(docker images -q -f dangling=true)
    • 批量删除指定镜像/容器等;

      我们可以通过--format指出docker命令的输出形式,通过grep去筛选,然后删除。 如:

      1
      2
      3
      4
      # 删除带有指定 hub.docker.com 仓库的镜像
      $ docker rmi $(docker images --format '{{.Repository}}' | grep 'hub.docker.com')
      # 杀掉带有ubuntu 镜像名字的容器
      $ docker kill $(docker ps -a --format '{{.Images}}' | grep 'ubuntu')
  • 相关阅读:
    aliyun服务器安装AMH面板
    自动化测试框架Appium的安装和使用
    Java中的replace()函数
    Spring框架中的控制反转和依赖注入
    Spring MVC中ModelAndView
    Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
    bootstrap中常用的元素类名详解
    处理网页上的字符溢出的方法
    前端开发中用过的比较好用的框架
    php laravel框架学习笔记 (一) 基本工作原理
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12347529.html
Copyright © 2020-2023  润新知