02 容器磁盘配额

一 容器层写满带来的影响

之前我们提过,容器内的文件系统类型不是xfs也不是ext4,而是OverlayFS(具体来说是overlay2),OverlayFS的实现原理是把宿主机上的lowerdir与upperdir两层目录联合挂载到容器里。

也就是说,你在容器里看到的根文件系统rootfs的源,是宿主机上的一个lowerdir目录和一个upperdir目录。

在宿主机上如果你是root用户那么你肯定对lowerdir与upperdir拥有任意权限的,均可读可写,

但是在容器内部,宿主机上的lowerdir目录对你是只读的,你在容器内的写的数据都写到了宿主机的upperdir里

而overlay2只负责挂载,并不负责对upperdir目录进行配额,默认uppperdir可用的是宿主机上关联磁盘的所有空间大小,这个磁盘关联的就是我们docker的数据目录,所有docker容器的数据都在它下面。

如果某一个容器内有大量写操作,比如写日志,在我们没有限制容器磁盘容量的情况下,把宿主机写满,就是迟早的事情,此时影响的是整个宿主机,其上运行的容器都跟着受牵连。

[root@test04 ~]# docker run -d --name egon_test centos:7 tail -f /dev/null
82da766314660aa87d2145c81a1df9bea430a51d2ac6d792582b3cb0861362a4

[root@test04 ~]# docker container inspect egon_test |grep -A7 GraphDriver
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/170e6618921391b66cf2da3c43e3113f8992256e63a0d2abd0f5b2531b4580b3-init/diff:/var/lib/docker/overlay2/5d3667d6d8f47bfd06c315c1c77ff4d1c62fa58e4880d0699dbb824e52093990/diff",
                "MergedDir": "/var/lib/docker/overlay2/170e6618921391b66cf2da3c43e3113f8992256e63a0d2abd0f5b2531b4580b3/merged",
                "UpperDir": "/var/lib/docker/overlay2/170e6618921391b66cf2da3c43e3113f8992256e63a0d2abd0f5b2531b4580b3/diff",
                "WorkDir": "/var/lib/docker/overlay2/170e6618921391b66cf2da3c43e3113f8992256e63a0d2abd0f5b2531b4580b3/work"
            },
            "Name": "overlay2"

在容器里写,到宿主机查看

[root@test04 ~]# docker exec -ti egon_test sh
sh-4.2# echo egon666 > a.txt
sh-4.2# exit
exit

[root@test04 ~]# cd /var/lib/docker/overlay2/170e6618921391b66cf2da3c43e3113f8992256e63a0d2abd0f5b2531b4580b3/diff
[root@test04 diff]# ls
a.txt  root
[root@test04 diff]# cat a.txt 
egon666
[root@test04 diff]# 

二 限制容器的磁盘使用量

在linux系统上xfs与ext4都支持Quota特性,可以用来对容器的upperdir目录进行容量限制。

以xfs为例,关于xfs_quota具体使用详见:https://kim1024.github.io/2018/11/27/quota-with-xfs

对应到我们的容器使用,我们只需要在启动容器是指定参数–storage-opt size=即可,本质就是使用xfs的quota特性对upperdir进行了容量限制

示例

# 1、针对xfs的quota限额的使用有3项:
  (1). usrquota:针对使用者账号
  (2). grpquota:针对群组
  (3). prjquota:针对单一目录,但是不能与grpquota同时存在
   ps:ext4在2016年开始支持project quota

# 2、--storage-opt是依赖xfs的quota功能的,所以以该参数启动容器前,必须为docker所在数据目录的磁盘remount一个pquota属性,否则以该参数启动容器会报错
docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.

如果你的数据目录是一个新磁盘,那么直接:mount -o remount,prjquota /dev/sda3 即可
如果你的数据目录是根分区,那么需要增加一个内核启动参数rootflags=pquota 然后重启主机

# 3、修改内核参数

联系管理员微信tutu19192010,注册账号

上一篇
下一篇
Copyright © 2022 Egon的知识星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术