【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会

官网找到,有个属性,可以用来配置容器大小

  • 在创建容器的时候使用参数--storage-opt size=10G来设置改容器的 rootfs 大小。

官方文档如下:

Set storage driver options per container

$ 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 devicemapperbtrfsoverlay2windowsfilter and zfs graph drivers. For the devicemapperbtrfswindowsfilter 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。此选项仅适用于devicemapperbtrfsoverlay2, windowsfilterzfs图形驱动程序。对于devicemapperbtrfswindowsfilterzfs图形驱动程序,用户无法设置比默认BaseFS 小的size对于overlay2存储驱动程序,只有在支持fs xfs并通过pquotamount选项进行安装的情况下,size选项才可用
在满足前面
overlay2条件下,用户可以设置任意比 backing fs size 小的值

解释一下:
默认情况下,每个 Docker 容器都有 10G 的存储空间,当超出该大小时,容器就会出现问题。那么修改容器大小,有两个方向,一个是比10G 大【即驱动程序为devicemapperbtrfswindowsfilterzfs】,一个是比10G小【即驱动程序为overlay2,且只有在支持fs xfs并通过pquotamount选项进行安装的情况下】。当然,默认的存储空间,也是可以修改的【文末介绍】。

查看docker的 驱动程序类型:docker info
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第1张图片

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、 查看目录挂载的,文件系统是哪个
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第2张图片
 这里的文件系统为:/dev/mapper/centos-home

 要为XFS文件系统上的用户启用配额,请在文件系统的 /etc/fstab条目中包括pquota选项
编辑  vim /etc/fstab    ::::/dev/mapper/centos-home     /home        xfs     rw,pquota        0 0
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第3张图片

将  /dev/mapper/centos-home  卸载后,重新挂载:

umount  /dev/mapper/centos-home 或者    umount /home

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第4张图片

原因是因为有程序在使用/home目录,我们可以使用fuser查看那些程序的进程,
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第5张图片

这里之所以这么多进程,是因为我的 docker 服务还没有关闭, 所以  需要先 停止 docker ,在 卸载

[root@keda /]# systemctl stop docker

卸载完成后,需要重新挂载:

mount -a

然后,可以在 /proc/mounts 中看到已经被挂载的目录和参数:

cat /proc/mounts |grep home

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第6张图片

至此,重新启动 docker, 就可以使用  --storage-opt size  参数了。 

前面提过,可以修改 docker容器的 默认存储空间大小,这里详解一下。

配置docker daemon

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"
  ]
}
  • data-root : 即 docker 的工作目录,前文已经介绍过如何 查看
  • storage-driver: 即文件存储驱动类型,前文已经介绍过如何 查看
  • 重点:
  •        overlay2.size=5G   即每个容器的默认空间大小为5G.
  •        overlay2.override_kernel_check=true   因为我的系统为CentOS7,所以需要加上这个配置

说明:

#如果是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  查看空间大小:

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第7张图片

可以,看到 两个容器的 使用空间 分别为 1G 和 5G.

1G :  因为 --storage-opt size=1G 的原因
5G:   因为前文,设置了 每个容器的 默认空间为 5G。

测试:

接下来,分别上传一份文件,到这两个容器内,然后在看空间大小。
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第8张图片

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第9张图片
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第10张图片

可以看到, 空间的利用率

自此,设置 docker 容器的使用空间,已经基本完成了。

为什么说基本呢?因为还有个问题, 可以注意上图。 有个 挂载目录的龙剑大小为 3.6T。 这是因为,我在创建容器的时候。
使用 -v 的属性,是容器内的文件目录。挂载到宿主机上。 这个在创建的容器的时候,是非常常用的配置。 一般,都是用来挂载容器生成的文件,比如日志文件,然后宿主机,统一收集每个容器服务【比如项目微服务】的日志数据,用于数据分析。

那么新的问题来了,如果某个服务的日志生成太多,造成磁盘空间不足,甚至挤爆宿主机的磁盘空间,那对整个宿主机上的所有服务,都将是灾难性的。因此,我们需要一种方法,来限制每个容器挂载目录的空间大小, 使其不影响到宿主机的其他服务。

其实,这个才是我写这篇文章的初衷。

虽然,前文的配置,都可以限制一个容器的使用空间。但前提是这个容器,没有目录挂载到宿主机。 如果,一旦有容器的目录挂载到宿主机上,那前文的作用,就基本是个鸡肋了。

所以,接来下,就要介绍如果限制,挂载目录的空间大小。准确来说,应该是限制 单个文件夹大小。

1、创建一个你指定大小的磁盘镜像文件:

dd if=/dev/zero of=/home/img/demo3.img bs=3M count=1024

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第11张图片

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第12张图片
以上分别为 两个不同类型的文件系统,创建 镜像文件的速度。
overlay :  3.4GB/s
xfs : 1.5GB/s

说明:

  • if=/dev/zero:表示输入文件为/dev/zero,一个虚拟的设备,顾名思义,里边的数据全是0
  • of=/home/img/demo3.img:输出的镜像文件,【自定义的目录,最好为空间充足的 目录】
  • bs=3M: 表示每次读取的块大小为3M,这个数值的大小跟内存有关。
  • count=1024:表示共读取1024块

这样就创建了一个大小为3G(3*1024)的磁盘镜像。

2、将磁盘镜像文件与loop设备进行挂载

[root@demo2 /]# losetup /dev/loop0 /home/img/demo3.img

如果这里出现  losetup: /dev/loop0: device is busy  可以将 /dev/loop0换成 /dev/loop1,下面也要对应。

3、指定文件类型,并格式化设备
   查看文件系统类型:df -T /home

当前磁盘格式化类型为xfs, 此处不必一定和原磁盘格式保持一致,可以选择 其他类型,如 ext3 格式化磁盘。
这里还是选择 xfs
【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第13张图片

4、 将需要的 文件夹,挂载到此设备。我是为了 docker 的挂载目录而创建的,自然需要挂载到  宿主机上的 -v 的目录

[root@keda ~]# mount -t xfs /dev/loop0 /home/springCloud/project/keda6-demo3/

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第14张图片

5、使用 刚刚创建好的 目录,作为 docker 容器的 挂载目录

【docker系列】 通俗易懂的讲解如何配置基于docker容器的springCloud微服务的磁盘使用空间大小,包懂包会_第15张图片

通过上图,可以看到。 我们成功的 限制了容器的空间大小,即 5G+3G 【不含非限制的挂载目录】。

注:
   要想,让限制大小的文件夹起作用, 必须删除容器, 重新运行容器来挂载到 宿主机文件夹。

docker 内存、cpu 限制 请参考以下两篇;

【docker系列】最通俗易懂的详解Docker容器设置cpu,memory等资源限制

【SpringCloud分布式框架搭建】一文读懂,docker容器部署springCloud微服务莫名停止的原因

6、卸载:先卸载文件夹

[root@slave2 /]# umount /data/springCloud/project/keda6-information-plan/

7、卸载:卸载设备

[root@slave2 /]# losetup -d /dev/loop0

8、卸载:如果不再使用可以直接删除镜像文件

[root@slave2 /]# rm -rf /home/img/demo3.img 

 

你可能感兴趣的:(docker,centos,docker,overlay,服务器,linux,容器)