谁用光了磁盘?Docker System命令详解

译者按: Docker镜像,容器,数据卷以及网络都会占用主机的磁盘空间,这样的话,磁盘很容易就会被用完。这篇博客介绍了一个简单的解决方案 - Docker System命令

为了保证可读性,本文采用意译而非直译。

用了一段时间Docker后,会发现它占用了不少硬盘空间。还好Docker 1.13引入了解决方法,它提供了简单的命令来查看/清理Docker使用的磁盘空间。

本文通过一个简单的示例,可以证明Docker能够很快地将磁盘占满。该示例通过play-with-docker.com运行。点击Add new instance即可创建新的实例,该实例安装了最新版的Docker 17.03。这篇博客主要讨论磁盘空间,那么不妨使用df命令查看磁盘的初始状态:

$ df -h
Filesystem           Size       Used Available Use% Mounted on
/dev/mapper/...      10.0G    443.3M      9.6G   4% /
tmpfs                60.0G         0     60.0G   0% /dev
tmpfs                60.0G         0     60.0G   0% /sys/fs/cgroup
/dev/xvda1           49.1G      3.7G     43.3G   8% /etc/resolv.conf
/dev/xvda1           49.1G      3.7G     43.3G   8% /etc/hostname
/dev/xvda1           49.1G      3.7G     43.3G   8% /etc/hosts
shm                  64.0M         0     64.0M   0% /dev/shm
/dev/mapper/...      10.0G    443.3M      9.6G   4% /graph/overlay2

可知,在新创建的play-with-docker.com实例,一共有10GB磁盘空间,其中接近500MB已被占用。

接下来编写Dockerfile来创建一个镜像。这个镜像基于Alpine镜像;镜像将写入3个随机的文件,每个文件1GB,文件由dd命令生成;因为这个镜像并没有实际作用,因此CMD设为/bin/true

FROM alpine
RUN dd if=/dev/zero of=1g1.img bs=1G count=1
RUN dd if=/dev/zero of=1g2.img bs=1G count=1
RUN dd if=/dev/zero of=1g3.img bs=1G count=1
CMD /bin/true

运行docker build -t test .即可创建镜像,执行完成后将生成一个3GB的镜像。

$ docker image ls
REPOSITORY          TAG                CREATED             SIZE
test                latest             38 seconds ago      3.23GB
alpine              latest             5 weeks ago         3.99MB

不难理解,该镜像占用了相应大小的磁盘空间。

$ df -h
Filesystem        Size       Used Available Use% Mounted on
/dev/mapper/...   10.0G      3.4G      6.5G  34% /

若只写入2个随机文件,则需要修改Dockerfile,删掉一行。为了避免构建镜像时使用缓存,我在dd命令之前添加了一行echo命令。

FROM alpine
RUN echo foo
RUN dd if=/dev/zero of=1g1.img bs=1G count=1
RUN dd if=/dev/zero of=1g2.img bs=1G count=1
# RUN dd if=/dev/zero of=1g3.img bs=1G count=1
CMD /bin/true

本来以为这样可以节省1GB磁盘空间,然而实际情况更加糟糕!

$ df -h
Filesystem        Size       Used Available Use% Mounted on
/dev/mapper/...   10.0G      5.4G      4.5G  54% /

旧的Docker镜像一直存在,最终磁盘空间会很快被用完。Docker 1.13引入了docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况。

$ docker system df
TYPE                TOTAL     ACTIVE    SIZE          RECLAIMABLE
Images              3         0         5.373GB       5.373GB (100%)
Containers          0         0         0B            0B
Local Volumes       0         0         0B            0B

可知,实例上一共有3个Docker镜像: apline镜像,包含3个1GB随机文件的镜像以及包含2个1GB随机文件的镜像。这些镜像占用了超过5GB磁盘空间。由于我们并没有基于这些镜像运行容器,所以它们都可以被删除,所以可回收的(RECLAIMABLE)磁盘空间为100%。使用docker run test运行test镜像再查看:

$ docker system df
TYPE                TOTAL     ACTIVE    SIZE          RECLAIMABLE
Images              3         1         5.373GB       3.225GB (60%)
Containers          1         0         0B            0B
Local Volumes       0         0         0B            0B

现在情况就不同了,我运行了一个容器,它执行/bin/true之后就很快退出了。这个容器绑定了test镜像,test镜像被标记为活跃(active)因而不能被删除,这导致可回收的磁盘空间变少了。

现在来清理一下磁盘空间。Docker提供了docker system prune,可以用于清理dangling镜像(参考What are Docker <none>:<none> images?)和容器,以及失效的数据卷和网络。

$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
1cdf866157b4a97e151125af3c2a7f186a59b6f63807e2014ce1a00d68f44e1d
Deleted Images:
deleted: sha256:f59bb277...
deleted: sha256:695b8e70...
deleted: sha256:93b1cceb...
deleted: sha256:c74d6bcd...
deleted: sha256:df8b9bb1...
deleted: sha256:dfe8340f...
deleted: sha256:ce1ee654...
Total reclaimed space: 3.221GB

根据警告信息可知,这个命令会删除所有关闭的容器以及dangling镜像。示例中,含有3个1GB随机文件的镜像的名称被占用了,名称为<none>:<none>,为dangling镜像,因此会被删除。同时,所有的中间镜像也会被删除。这样的话,一共3GB的磁盘空间被回收了!

更进一步,使用-a选项可以做深度清理。这时我们会看到更加严重的WARNING信息:

$ docker system prune -a
WARNING! This will remove:
        - all stopped containers
        - all volumes not used by at least one container
        - all networks not used by at least one container
        - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: test:latest
deleted: sha256:c515ebfa2...
deleted: sha256:07302c011...
deleted: sha256:37c0c6474...
deleted: sha256:5cc2b6bc4...
deleted: sha256:b283b9c35...
deleted: sha256:8a8b9bd8b...
untagged: alpine:latest
untagged: [email protected]:58e1a1bb75db1...
deleted: sha256:4a415e366...
deleted: sha256:23b9c7b43...
Total reclaimed space: 2.151GB

这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎。比如,我们不能在生产环境中运行prune -a命令,因为一些备用镜像(用于备份,回滚等)有时候需要用到,如果这些镜像被删除了,则运行容器时需要重新下载。

此时,所有未绑定容器的镜像将会被删除。由于第一次prune命令删除了所有容器,因此所有镜像(它们没有绑定任何容器)都会被删除。

$ df -h
Filesystem          Size      Used Available Use% Mounted on
/dev/mapper/...    10.0G    442.5M      9.6G   4% /

现在,已使用的磁盘空间又变成了4%。本文的示例只是冰山一角,因为一旦我们运行了真正的容器,并且使用了Docker数据卷和Docker网络,则磁盘空间将会更快用完。感兴趣的话,可以查看博客最后的视频(不要忘了订阅!)。在视频中,我介绍一个简单的WordPress应用,它由数个容器,数据卷以及网络构成。这个应用可以很快地消耗掉磁盘空间,我将介绍如何处理这个问题。

视频: What‘s eating my disk?!Clean up your Docker System

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/19/docker-system-explain/

原文地址:http://blog.51cto.com/13957060/2319126

时间: 2024-10-13 00:47:24

谁用光了磁盘?Docker System命令详解的相关文章

docker run命令详解及示例(二)

docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container 上接博文:docker run命令详解及示例(一) --link --link=[]        Add link to another container 用于连接两个容器. 启动容器1:web docker run --name web -d -p 22 -p 80 -itwebserver:v1

Docker基础命令详解——镜像及容器操作

Docker基础命令详解--镜像及容器操作 前言 ? 上篇文章介绍了有关Docker的基础与Linux下docker的安装,本文主要讲解安装docker后的基础使用方法以及命令的介绍,主要是docker镜像操作及容器操作命令. ? 当然,docker的相关命令非常多,可以使用docker help命令查看对应目录以及相关提示命令. Docker镜像操作命令 [[email protected] ~]# which docker /usr/bin/docker 1.镜像搜索:docker sear

Docker常用命令详解

docker ps 查看当前正在运行的容器 docker ps -a 查看所有容器的状态 docker start/stop id/name 启动/停止某个容器 docker attach id 进入某个容器(使用exit退出后容器也跟着停止运行) docker exec -ti id 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行) docker images 查看本地镜像 docker rm id/name 删除某个容器 docker rmi id/name 删除

docker基础命令详解

Commands: attach    Attach to a running container build     Build an image from a Dockerfile commit    Create a new image from a container's changes cp        Copy files/folders from a container's filesystem to the host path create    Create a new co

docker run命令详解及示例

docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -a -a, --attach=[]                 Attach to STDIN, STDOUT orSTDERR 如果在执行run命令时没有指定-a,那么docker默认会挂载所有标准数据流,包括输入输出和错误.你可以特别指定挂载哪个标准流. #docker run -a stdin

docker run命令详解 转

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]     -a, --attach=[]            登录容器(以docker run -d启动的容器)     -c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使

docker 命令详解

Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container).(我个人还是喜欢称虚拟机) Docker应用容器相对于 VM 有以下几个优点: 启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久 资源利用率高,一台普通PC 可以跑上千个容器,你跑上千个 VM 试试 性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源 因为VM 的 Hypervi

linux yum命令详解

yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...]其中的[opti

31个有用的系统管理员命令详解(linux)

在开始之前,你必须了解一下linux 基本知识: centos7目录结构.文件类型及权限.inode解析.信号 最常用的linux命令行快捷键.centos7 vi编辑器及环境变量的使用 Linux进程优先级及调度原理 1.Uptime 命令显示:运行时间.登陆用户数及1,5,15分钟间隔负载. # uptime 08:16:26 up 22 min,  1 user,  load average: 0.00, 0.03, 0.22 Uptime 命令仅有一个版本选项而且仅显示一天内的小时:分钟