--storage-opt size=10G
来设置改容器的 rootfs 大小。$ docker run -it --storage-opt size=120G fedora /bin/bash
This (size) will allow to set the container rootfs size to 120G at creation time. This option is only available for the devicemapper
, btrfs
, overlay2
, windowsfilter
and zfs
graph drivers. For the devicemapper
, btrfs
, windowsfilter
and zfs
graph drivers, user cannot pass a size less than the Default BaseFS Size. For the overlay2
storage driver, the size option is only available if the backing fs is xfs
and mounted with the pquota
mount option. Under these conditions, user can pass any size less than the backing fs size.
谷歌翻译:
$ docker run -it --storage-opt size=120G fedora /bin/bash
此(大小)将允许在创建时将容器rootfs大小设置为120G。此选项仅适用于devicemapper
,btrfs
,overlay2
, windowsfilter
和zfs
图形驱动程序。对于devicemapper
,btrfs
,windowsfilter
和zfs
图形驱动程序,用户无法设置比默认BaseFS 小的size。对于overlay2
存储驱动程序,只有在支持fs xfs
并通过pquota
mount选项进行安装的情况下,size选项才可用。
在满足前面overlay2
条件下,用户可以设置任意比 backing fs size 小的值。
解释一下:
默认情况下,每个 Docker 容器都有 10G 的存储空间,当超出该大小时,容器就会出现问题。那么修改容器大小,有两个方向,一个是比10G 大【即驱动程序为devicemapper
,btrfs
,windowsfilter
和zfs
】,一个是比10G小【即驱动程序为overlay2,且
只有在支持fs xfs
并通过pquota
mount选项进行安装的情况下】。当然,默认的存储空间,也是可以修改的【文末介绍】。
PS 需要切换到 overlay2:【docker系列】Docker切换OverLay(2)——提高性能,加快速度
在我们开始修改配置之前,可以先尝试的创建一个容器,并带上--storage-opt size=1G参数,看看能否成功。
[root@slave4 ~]# docker run -dit \
> -m 640M --memory-swap -1 --memory-reservation 400M \
> --storage-opt size=100M \
> seowen/jdk8u241-project:latest
docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.
See 'docker run --help'.
[root@slave4 ~]#
error:
docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.
docker:来自daemon的错误响应: --storage-opt 只支持覆盖在xfs与'pquota'挂载选项。
错误说明,也描述的很清楚了。 那接下来介绍如何开启xfs的pquota特性。
开启pquota, 需要先确定,你开开启的文件系统。 即你的docker工作目录挂载的系统文件。
1、查看docker 的工作目录:docker info |grep "Docker Root Dir"
2、 查看目录挂载的,文件系统是哪个
这里的文件系统为:/dev/mapper/centos-home
要为XFS文件系统上的用户启用配额,请在文件系统的 /etc/fstab条目中包括pquota选项
编辑 vim /etc/fstab ::::/dev/mapper/centos-home /home xfs rw,pquota 0 0
将 /dev/mapper/centos-home 卸载后,重新挂载:
umount /dev/mapper/centos-home 或者 umount /home
原因是因为有程序在使用/home目录,我们可以使用fuser查看那些程序的进程,
这里之所以这么多进程,是因为我的 docker 服务还没有关闭, 所以 需要先 停止 docker ,在 卸载
[root@keda /]# systemctl stop docker
卸载完成后,需要重新挂载:
mount -a
然后,可以在 /proc/mounts
中看到已经被挂载的目录和参数:
cat /proc/mounts |grep home
至此,重新启动 docker, 就可以使用 --storage-opt size 参数了。
前面提过,可以修改 docker容器的 默认存储空间大小,这里详解一下。
vim /etc/docker/daemon.json
配置文件如下,这里将每个容器可以使用的磁盘空间设置为 5G:
[root@keda /]# vim /etc/docker/daemon.json
{
"data-root": "/home/docker/lib/docker",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=5G"
]
}
说明:
#如果是CentOS7或者RedHat7内核在3.10.0-693以下的,如下
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
其他,直接配置:
{
"storage-driver": "overlay2"
}
重启docker
systemctl daemon-reload
systemctl restart docker
验证:
运行两个容器,一个带上--storage-opt size=1G,一个不带。 然后查看磁盘空间。如下:
# 带上 storage-opt size=1G 参数
docker run -dit \
--storage-opt size=1G \
--restart=always \
--privileged=true \
--name=keda6-dev-demo \
--hostname=demo \
-v /home/docker/springCloud/project/keda6-demo/:/var/local/project/ \
-v /home/springCloud/project/keda6-demo/:/data/springCloud/ \
-p 2231:22 \
seowen/jdk8u241-project:latest \
/usr/sbin/init
# 不带 storage-opt size 参数
docker run -dit \
--name=keda6-dev-demo2 \
--restart=always \
--privileged=true \
--hostname=demo2 \
-v /home/docker/springCloud/project/keda6-demo2/:/var/local/project/ \
-v /home/springCloud/project/keda6-demo2/:/data/springCloud/ \
-p 2232:22 \
seowen/jdk8u241-project:latest \
/usr/sbin/init
运行这两个容器,然后分别进入两个容器,使用 df -h 查看空间大小:
可以,看到 两个容器的 使用空间 分别为 1G 和 5G.
1G : 因为 --storage-opt size=1G 的原因
5G: 因为前文,设置了 每个容器的 默认空间为 5G。
测试:
接下来,分别上传一份文件,到这两个容器内,然后在看空间大小。
可以看到, 空间的利用率
自此,设置 docker 容器的使用空间,已经基本完成了。
为什么说基本呢?因为还有个问题, 可以注意上图。 有个 挂载目录的龙剑大小为 3.6T。 这是因为,我在创建容器的时候。
使用 -v 的属性,是容器内的文件目录。挂载到宿主机上。 这个在创建的容器的时候,是非常常用的配置。 一般,都是用来挂载容器生成的文件,比如日志文件,然后宿主机,统一收集每个容器服务【比如项目微服务】的日志数据,用于数据分析。
那么新的问题来了,如果某个服务的日志生成太多,造成磁盘空间不足,甚至挤爆宿主机的磁盘空间,那对整个宿主机上的所有服务,都将是灾难性的。因此,我们需要一种方法,来限制每个容器挂载目录的空间大小, 使其不影响到宿主机的其他服务。
其实,这个才是我写这篇文章的初衷。
虽然,前文的配置,都可以限制一个容器的使用空间。但前提是这个容器,没有目录挂载到宿主机。 如果,一旦有容器的目录挂载到宿主机上,那前文的作用,就基本是个鸡肋了。
所以,接来下,就要介绍如果限制,挂载目录的空间大小。准确来说,应该是限制 单个文件夹大小。
dd if=/dev/zero of=/home/img/demo3.img bs=3M count=1024
以上分别为 两个不同类型的文件系统,创建 镜像文件的速度。
overlay : 3.4GB/s
xfs : 1.5GB/s
说明:
这样就创建了一个大小为3G(3*1024)的磁盘镜像。
[root@demo2 /]# losetup /dev/loop0 /home/img/demo3.img
如果这里出现 losetup: /dev/loop0: device is busy 可以将 /dev/loop0换成 /dev/loop1,下面也要对应。
当前磁盘格式化类型为xfs, 此处不必一定和原磁盘格式保持一致,可以选择 其他类型,如 ext3 格式化磁盘。
这里还是选择 xfs
[root@keda ~]# mount -t xfs /dev/loop0 /home/springCloud/project/keda6-demo3/
通过上图,可以看到。 我们成功的 限制了容器的空间大小,即 5G+3G 【不含非限制的挂载目录】。
注:
要想,让限制大小的文件夹起作用, 必须删除容器, 重新运行容器来挂载到 宿主机文件夹。
docker 内存、cpu 限制 请参考以下两篇;
【docker系列】最通俗易懂的详解Docker容器设置cpu,memory等资源限制
【SpringCloud分布式框架搭建】一文读懂,docker容器部署springCloud微服务莫名停止的原因
[root@slave2 /]# umount /data/springCloud/project/keda6-information-plan/
[root@slave2 /]# losetup -d /dev/loop0
[root@slave2 /]# rm -rf /home/img/demo3.img