在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')

关于Docker清理的更多相关文章

  1. [转帖]Docker 清理占用的磁盘空间

    Docker(二十七)-Docker 清理占用的磁盘空间 https://www.cnblogs.com/zhuochong/p/10076599.html docker system docker ...

  2. [转帖]docker清理日志

    docker清理日志 2017年05月03日 10:37:27 不想当码农的程序员 阅读数 12827    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn. ...

  3. Docker 清理容器 log 日志

    原文 Docker 清理容器 log 日志 docker logs <容器ID> 是常用命令,来查看容器运行日志,但时间长了之后,就会发现越来越慢,log 太多了,这时就需要清理一下. 先 ...

  4. docker 清理容器的一些命令,彻底或选择清理

    越往下的,越要慎重 列出无用的卷 docker volume ls -qf dangling=true 清理无用的卷,容器,镜像 docker volume rm $(docker volume ls ...

  5. Docker(二十七)-Docker 清理占用的磁盘空间

    1. docker system命令 docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况: docker system dfTYPE TOTAL A ...

  6. docker 清理容器和镜像

    在docker运行过程中,会不知不觉造出很多容器,很多都是不用的,需要清理. 下面就是一些清理办法,一个个清理肯定很低效,批量清理很有意思. 查看正在运行的容器 # docker ps -q 9b9f ...

  7. docker 清理无用的卷

    docker  system prune 对于卷的清理不够彻底 题外话:docker volume ls查看当前卷列表 使用如下命令可以清理不用的卷 docker volume prune -f 强制 ...

  8. Docker 清理命令集锦

    杀死所有正在运行的容器 复制代码代码如下: docker kill $(docker ps -a -q) 删除所有已经停止的容器 复制代码代码如下: docker rm $(docker ps -a ...

  9. docker 清理容器的命令

    执行以下命令会彻底清除所有容器. docker rm -f $(docker ps -qa) rm -rf /var/lib/etcd /var/lib/cni /var/run/calico rm ...

随机推荐

  1. Django整体架构

    Django整体架构 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了 一 ...

  2. gcc -c xx.c 选项讲解

    -c选项表示编译.汇编指定的源文件(也就是编译源文件),但是不进行链接.使用-c选项可以将每一个源文件编译成对应的目标文件. 目标文件是一种中间文件或者临时文件,如果不设置该选项,gcc 一般不会保留 ...

  3. Underscore _.template 方法使用详解

    为什么用「void 0」代替「undefined」 undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写. 事实上,undefined ...

  4. debian下通过scp 上传下载文件

    1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 2.从服务器上下载文件 scp username@servername:/path ...

  5. debian8.8安装sougou输入法

    传送门:http://www.cnblogs.com/ligongzi/p/6137601.html 亲测可用

  6. win10远程桌面身份验证错误,要求的函数不受支持

    出现原因win10最近安装了一个更新补丁导致的,当然可以直接卸载这个补丁,也可以安装操作来就可以.需要修改注册表里边的项目,添加下面的设置. 解决办法1.win+R 输入 regedit, 打开注册表 ...

  7. mysql之存储过程(二)

    1.批量根据复杂的SQL查询结果插入到新表 DELIMITER && CREATE PROCEDURE settlePADTEST() begin        DECLARE c_s ...

  8. 大数据学习——MapReduce学习——字符统计WordCount

    操作背景 jdk的版本为1.8以上 ubuntu12 hadoop2.5伪分布 安装 Hadoop-Eclipse-Plugin 要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 ...

  9. 【转】nginx如何设置防盗链

    转自博客园作者:howhy,文章地址:nginx如何设置防盗链.大佬写的甚好,在此备份一下 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底 ...

  10. Linux集群软件安装实战

    一.需求和思路 1. 需求描述 公司有N个节点的集群,需要统一安装一个软件(jdk)需要开发一个脚本程序,实现对集群中的N个节点批量自动下载.安装jdk 2. 思路 1)编写一个启动脚本,用来发送一个 ...