之前我们提过,容器内的文件系统类型不是xfs也不是ext4,而是OverlayFS(具体来说是overlay2),OverlayFS的实现原理是把宿主机上的lowerdir与upperdir两层目录联合挂载到容器里。
也就是说,你在容器里看到的根文件系统rootfs的源,是宿主机上的一个lowerdir目录和一个upperdir目录。
在宿主机上如果你是root用户那么你肯定对lowerdir与upperdir拥有任意权限的,均可读可写,
但是在容器内部,宿主机上的lowerdir目录对你是只读的,你在容器内的写的数据都写到了宿主机的upperdir里
而overlay2只负责挂载,并不负责对upperdir目录进行配额,默认uppperdir可用的是宿主机上关联磁盘的所有空间大小,这个磁盘关联的就是我们docker的数据目录,所有docker容器的数据都在它下面。
如果某一个容器内有大量写操作,比如写日志,在我们没有限制容器磁盘容量的情况下,把宿主机写满,就是迟早的事情,此时影响的是整个宿主机,其上运行的容器都跟着受牵连。
| [root@test04 ~] |
| 82da766314660aa87d2145c81a1df9bea430a51d2ac6d792582b3cb0861362a4 |
| |
| [root@test04 ~] |
| "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 ~] |
| sh-4.2 |
| sh-4.2 |
| exit |
| |
| [root@test04 ~] |
| [root@test04 diff] |
| a.txt root |
| [root@test04 diff] |
| 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). usrquota:针对使用者账号 |
| (2). grpquota:针对群组 |
| (3). prjquota:针对单一目录,但是不能与grpquota同时存在 |
| ps:ext4在2016年开始支持project quota |
| |
| |
| docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option. |
| |
| 如果你的数据目录是一个新磁盘,那么直接:mount -o remount,prjquota /dev/sda3 即可 |
| 如果是已经在使用的磁盘,需要修改/etc/fstab,加上prjquota属性 |
| /dev/sdb /home xfs defaults,prjquota 0 0 |
| |
| 然后修改下述内核参数,重启主机 |
| |
| | top:-10em; |
| width:100%; |
| height:10em; |
| background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%,#ffffff 100%); |
| background-image: -moz-linear-gradient(rgba(255, 255, 255, 0) 0%,#ffffff 100%); |
| background-image: -o-linear-gradient(rgba(255, 255, 255, 0) 0%,#ffffff 100%); |
| background-image: linear-gradient(rgba(255, 255, 255, 0) 0%,#ffffff 100%); |
| background-image: -ms-linear-gradient(rgba(255, 255, 255, 0) 0%,#ffffff 100%);"> |
| |