Code前端首页关于Code前端联系我们

Docker 清理释放磁盘空间优化性能指南

terry 2年前 (2023-09-28) 阅读数 99 #未命名

在我们日常使用 Docker 的过程中,可能时不时会遇到以下情况:

$ 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 清理操作如下。

  • 搜索对接数据和流程;
  • 删除未使用的映像、存储、卷和网络;
  • 重置Docker
  • 限制Sheet大小
  • 其他相关操作

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

  • image:可用于创建容器的只读模板。例如,包含 ubuntu 系统的镜像。
  • 容器:从镜像创建的运行实例。您可以使用 Docker 命令控制这些容器。
  • 卷:对接数据保留。
  • 悬挂:未使用的图像。
  • 网络:连接到docker容器服务。查看Docker磁盘使用情况,容器占用42.85MB,数据量3.541GB。了解了基本占用情况后,我们就可以通过下面的命令进行有针对性的清理。

    查找 Docker 数据和进程

    要清理 Docker,您需要知道 docker 数据在哪里以及哪些 docker 进程在哪里。 MDocker Images列出了docker镜像;

  • Docker PS 列出 Docker 容器;
  • Docker Volume ls docker 网络列表;
  • Docker 信息 列出容器镜像的数量以及一些 docker 安装等系统信息。
  • 删除未使用的数据和进程

    Docker提供了一些删除未使用的容器、网络和镜像的快捷方式:

$ 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]

默认情况下,它不会删除数据卷功能,因为数据更重要,防止意外删除一些数据。可以使用 体积 来确定。

同时 – 我们还可以删除所有未使用的图片。为了避免确认,请使用--force

$ 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集装箱西梅清洁停止的容器;
  • Docker卷修剪删除未使用的数据卷;
  • Docker 镜像修剪干净、未使用的镜像;删除所有

Data Recovery Docker

以上命令对正在运行的存储库及相关镜像、数据卷和网络没有影响。如果您需要全部清洁,则需要停止所有水箱。

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

$ docker container ls -aq
  • ls 所有容器列表;
  • --all / -a 列出所有容器(包括非运行者);
  • --quiet / -q 仅容器标识符;

所以我们可以通过以下命令来停止所有容器:

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

与clear命令结合,完整的清除所有容器命令为:

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

同样,我们可以想到如下:

  • Cle docker 容器 rm $(docker 容器 ls -a -q) / docker rm $(docker ps -a -q);
  • Clerm docker 镜像 ls -a - q);

  • 删除数据卷dockervolume rm $(dockervolumels -q);;;
  • docker 网络 网络 ls -q);

存储日志大小限制

我们经常发现日志文件让我们不知所措。问题的根源在于存储日志大小限制。共有三种方法:

  • 修改daemon.json配置;
    {
        "log-opts": {
            "max-size" : "521m"
        }
    }
    
  • 更改docker-compose
    ubuntu:
      image: ubuntu
      restart: always
      logging:
        driver: "json-file"
        options:
          max-size: "1g"
    
  • 传递参数;
    $ docker run -d --log-opt max-size=1g ubuntu
    

其他常见相关清理命令

  • 删除指定日志文件;

    如果要删除特定容器的日志,只需执行几个步骤即可。

    # 获取指定的容器ID, 可通过docker ps 查看 如:2ed640d8fcd1 
    # 获取该容器的日志地址
    $ docker inspect 2ed640d8fcd1  --format '{{.LogPath}}'
    /mnt/data/docker/containers/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a/2ed640d8fcd1bd464a23be78513d23be1807c8ad6a95116da5cb9118a6b2380a-json.log
    

    如果知道日志地址,可以删除或删除日志,但要注意权限。 ~

  • 杀死所有正在运行的容器;
    $ docker kill $(docker ps -a -q)
    
  • 删除所有停止的容器;
    $ docker rm $(docker ps -a -q)
    
  • 删除未打开的标记图像;
    $ docker rmi $(docker images -q -f dangling=true)
    
  • 指定的镜像/容器等批量删除;

    --format可用于指示docker命令的输出格式,grep用于过滤然后删除。例如:

    # 删除带有指定 hub.docker.com 仓库的镜像
    $ docker rmi $(docker images --format '{{.Repository}}' | grep 'hub.docker.com')
    # 杀掉带有ubuntu 镜像名字的容器
    $ docker kill $(docker ps -a --format '{{.Images}}' | grep 'ubuntu')
    

    在使用Docker进行日常开发部署时,经常会遇到需要进行清理操作的情况。在上一节中,我们介绍了一些强大的 Docker 清理操作,包括检查磁盘使用情况、查找 Docker 数据和进程、删除未使用的镜像、容器、卷和网络、重置 Docker 以及限制容器日志大小。 。现在让我们看看其他一些常见的 Docker 清理命令和一些建议。

清除未使用的构建缓存

当您使用 Docker 构建镜像时,会生成一些中间构建镜像和缓存。这些缓存可能会占用大量磁盘空间,尤其是在多次构建映像之后。要释放磁盘空间,请使用 docker builder prune 删除未使用的构建缓存。

$ docker builder prune

这将删除所有未使用的中间构建映像和缓存,从而释放宝贵的磁盘空间。

清除挂起的卷和网络

Docker 可能有挂起的卷和网络,这意味着它们不再与任何容器关联,但仍然占用磁盘空间或系统资源。要清理未使用的卷和网络,您可以使用 docker volume prunedocker network prune 命令。

$ docker volume prune
$ docker network prune

这些命令将删除与任何存储无关的所有卷和网络,确保充分利用系统资源。

删除未标记的镜像

使用 Docker 构建和使用镜像时,可能会生成一些未标记的镜像。这些图像没有与标签关联,因此难以管理和识别。您可以使用 docker image prune 来清理未标记的图像。

$ docker image prune

这将删除所有未标记且不与任何容器关联的图像,使图像列表更清晰。

删除已停止的容器

当我们停止容器时,这些容器仍保留在系统中并占用磁盘空间。如果不再需要这些容器,您可以使用 docker container prune 命令删除已停止的容器。

$ docker container prune

这将删除所有已停止的容器,释放磁盘空间和系统资源。

自动清理策略

除了手动执行清理命令外,还可以配置Docker自动执行清理操作。在 Docker 的配置文件daemon.json中,您可以设置一些参数来定义自动清理策略。

例如,您可以设置图像和容器的过期时间,以便自动清理它们。

{
  "image-prune-filters": {
    "until": "24h"
  },
  "container-prune-filters": {
    "until": "24h"
  }
}

上述配置会删除所有超过 24 小时未使用的镜像和容器。

您还可以设置最大日志大小和日志文件保留时间,以限制日志文件的增长。

{
  "log-opts": {
    "max-size": "100m",
    "max-file": "10"
  }
}

上述配置将每个日志文件的最大大小限制为100 MB,并且最多保留10个日志文件。

通过自动清理策略,可以定期清理不再需要的图像、存储和日志,以保持系统的有序和良好运行。

总结

码头清洁是日常维护工作中不可或缺的一部分。通过删除未使用的映像、存储库、网络、卷和缓存以及设置自动清理策略,释放磁盘空间、优化系统性能并维护 Docker 环境的可靠性和稳定性。

在执行任何清理操作之前,请确保您了解清理命令的含义,并仔细考虑所清理的资源是否确实不必要。清洁不当可能会导致数据丢失或其他意外情况。作者:Bobochang
来源:稀土掘金

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门