聊聊关于Docker的清理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 聊聊关于Docker的清理

在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清理操作。

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

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

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

查看Docker的磁盘使用情况

使用docker system df即可查看:

$ 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提供了一些快捷的命令去清除未使用的容器,网络和镜像:

$ 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免确认。

$ 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 container ls -aq
  • ls 列出所有容器;
  • --all / -a列出所有容器(包含未运行的);
  • --quiet / -q 只显示容器ID;

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

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

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

$ 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配置;
{
    "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')
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
Linux Docker 容器
Docker 的/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录
Docker 的/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录
629 1
|
13天前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
13 2
|
1月前
|
前端开发 开发工具 git
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
33 5
|
3月前
|
Shell 调度 Docker
在Docker中,如何清理批量后台停止的容器?
在Docker中,如何清理批量后台停止的容器?
|
3月前
|
Docker 容器
在Docker中,如何批量清理临时镜像文件?
在Docker中,如何批量清理临时镜像文件?
|
3月前
|
Docker 容器 Perl
在Docker中,如何清理后台停止的容器?
在Docker中,如何清理后台停止的容器?
|
4月前
|
Linux Docker 容器
docker 容器大小查看及清理docker磁盘空间
docker 容器大小查看及清理docker磁盘空间
831 0
|
4月前
|
Linux Docker 容器
docker 容器大小查看及清理docker磁盘空间
docker 容器大小查看及清理docker磁盘空间
566 0
|
6月前
|
Ubuntu Docker 容器
清理docker容器
清理docker容器
121 0
|
6月前
|
Linux Docker 容器
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
221 0