在容器文件系统介绍中我们了解到了容器使用overlayFS分为lower和upper两层。 其中修改的数据都会写在upper层。虽然是只被特定的容器使用的目录,但是从宿主机的角度来看,还是在往宿主机的目录上写数据。
那么就存在容器将宿主机上的磁盘写满的可能,这种情况下,容器就会影响整个宿主机上程序的使用。比如容器将log写在文件系统系统上并且没有做log rotation。
所以正常来说是不允许容器往overlay文件系统大量写数据的,而是挂载一个volume,往volume中写数据。为了保证出现写满的情况,需要容器能够限制往overlay写的数据量。这就需要看宿主机上的文件系统是否支持限制目录的容量了。
xfs限制目录可写入大小
xfs使用project quota来实现限制目录可写入数据大小。 这需要xfs文件系统在挂载的时候加上pquota选项,如果xfs作为根目录,那么需要加上内核参数内核启动的参数”rootflags=pquota”来保证xfs挂载后开启了pquota。
限制的过程比较简单
- 给目录打上project id
# mkdir -p /tmp/xfs_prjquota
# xfs_quota -x -c 'project -s -p /tmp/xfs_prjquota 101' /
Setting up project 101 (path /tmp/xfs_prjquota)...
Processed 1 (/etc/projects and cmdline) paths for project 101 with recursion depth infinite (-1).- 为上面打上的project id,也就是101加上quota限制,这里限制10m
# xfs_quota -x -c 'limit -p bhard=10m 101' /现在限额已经完成,可以进行验证
# dd if=/dev/zero of=/tmp/xfs_prjquota/test.file bs=1024 count=20000
dd: error writing '/tmp/xfs_prjquota/test.file': No space left on device
10241+0 records in
10240+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0357122 s, 294 MB/s
# ls -l /tmp/xfs_prjquota/test.file
-rw-r--r-- 1 root root 10485760 Oct 31 10:00 /tmp/xfs_prjquota/test.file介绍完了原理,在docker使用的时候,run容器的时候加上--storage-opt size= <SIZE>即可限制写入大小。这个限制的目录当然就是容器的upperdir了。