Docker [5]

磁盘垃圾清理和内存限制

Posted by ZYT on November 18, 2018

磁盘垃圾清理

不同对象的垃圾清理

docker v1.13 之后提供了对各种对象的 prune 命令,提供对象垃圾处理功能。

# container
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N]

# image
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

# volume
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N]

# network
$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N]

# 可以通过设置 -filter 字段,来过滤要删除的容器
$ docker container prune --filter "until=24h"

所有对象的垃圾清理

docker 17.06.0 之后提供了删除所有对象垃圾处理功能。

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

# 添加–volumes字段来清理存储卷的内容
$ docker system prune --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 dangling images
        - all build cache
Are you sure you want to continue? [y/N]

内存限制

默认情况下容器使用的资源是不受限制的。

为什么要限制容器对内存的使用

linux 内核如果检测到没有足够的内存可以分配,就会扔出 OOME(Out Of Memmory Exception),并开始杀死一些进程用于释放内存空间。糟糕的是任何进程都可能成为内核猎杀的对象,包括 docker daemon 和其它一些重要的程序。甚至有可能引起整个系统的宕机。

内核在选择要杀死的进程时会对所有的进程打分,直接杀死得分最高的进程,接着是下一个。通过降低 docker daemonOOM 优先级 可以在一定程度降低风险,但是并不能解决问题。

限制内存和 swap

# -m 设置最大可使用内存
# --memory-swap = memory + swap ,下面的示例就是不使用 swap 空间
$ docker run -it --rm -m 300M --memory-swap=300M <image-name>

docker 对容器资源进行限制