Docker storage-driver overlay2 限制容器可占用的磁盘空间

Docker容器默认启动的虚拟机,会占用宿主机的资源(CPU、内存、硬盘),例如默认Docker基于Overlay2驱动方式,容器硬盘的rootfs根分区空间是整个宿主机的空间大小。

可以指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件:vim /usr/lib/systemd/system/docker.service中,OPTIONS参数后面添加如下代码,指定Docker容器rootfs容量大小为40G:

 

说明


overlay2.size是在 17.07.0-ce 中引入的: Add overlay2.size daemon storage-opt 。

这里使用的docker版本是19.03.11-ce:

[root@localhost ~]# docker version
Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:12:26 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

 

overlay2.size


docker daemon配置项 中介绍了 overlay2.size 配置项,可以用来限制每个容器可以占用的磁盘空间。

overlay2.size
Sets the default max size of the container. It is supported only when the backing fs is xfs and mounted with pquota mount option. Under these conditions the user can pass any size less then the backing fs size.
Example
$ sudo dockerd -s overlay2 –storage-opt overlay2.size=1G
如文档中所述,需要使用xfs文件系统,并且挂载时使用 pquota 

 

开启xfs的quota特性


#什么结果都没有,这个表示没有设置配额
[root@localhost ~]# xfs_quota -x -c 'report'   /
[root@localhost ~]# mount -o remount,rw,uquota,prjquota  /

在开始划分分区的时候就要让分区的配额生效,添加一块硬盘作为docker的数据目录

[root@localhost ~]# fdisk -l | grep sdb
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors

最早开始发根分区没有指定该参数,重新指定不支持了。需要添加一块新的盘支持目录配额,因为对目录空间的限制可以让docker overlay模式控制每个虚拟机大小到40Gb,因为不控制那么每个容器就是占满宿主机,对整个盘做一个分区就好了,添加一块盘来支持目录配额

[root@localhost ~]# mkfs.xfs -f /dev/sdb
[root@localhost ~]# mkdir -p /data
[root@localhost ~]# mount  -o uquota,prjquota /dev/sdb /data/
[root@localhost ~]# df -h | grep sdb
/dev/sdb         50G   33M   50G   1% /data

这个分区就支持目录配额,支持目录配额以后就可以对docker去限制其空间大小

[root@localhost ~]# xfs_quota -x -c 'report' /data/
User quota on /data (/dev/sdb)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                0          0          0     00 [--------]

Project quota on /data (/dev/sdb)
                               Blocks                     
Project ID       Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
#0                  0          0          0     00 [--------]

#docker的overlay2需要的是 pquota ,在 /etc/fstab 中设置
[root@localhost ~]# blkid  /dev/sdb
/dev/sdb: UUID="f1822c62-7544-406c-b042-b94f3b7a3502" TYPE="xfs" 
[root@localhost ~]# vim /etc/fstab 
UUID=f1822c62-7544-406c-b042-b94f3b7a3502  /data      xfs     rw,pquota  0 0
[root@localhost ~]# mount -a

#可以在 /proc/mounts 中看到已经被挂载的目录和参数:
[root@localhost ~]# cat /proc/mounts  | grep sdb
/dev/sdb /data xfs rw,relatime,attr2,inode64,usrquota,prjquota 0 0

 

配置docker daemon 


 将docker引擎默认数据存储目录/var/lib/docker重命名,并且将/data/docker目录软链接至/var/lib/下即可

[root@localhost ~]# mkdir -p /data/docker/
[root@localhost ~]# cd /var/lib/
[root@localhost lib]# mv docker docker.bak
[root@localhost lib]# ln -s /data/docker/  .
[root@localhost lib]# ll docker
lrwxrwxrwx 1 root root 13 Aug 17 16:29 docker -> /data/docker/

现在是docker引擎自动配额,不需要我们去手动限制docker容器的配额--storage-opt overlay2.size=40G,一旦磁盘配额修改完之后就不要再修改(/usr/lib/systemd/system/docker.service 配置文件如下,这里将每个容器可以使用的磁盘空间设置为40G)

[root@localhost lib]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -b br0 -H fd:// --containerd=/run/containerd/containerd.sock --storage-opt overlay2.size=40G

 重启Docker服务,并且查看进程,可以看到docker overlay2.size大小配置,如下所示: 

[root@localhost lib]# systemctl daemon-reload 
[root@localhost lib]# systemctl restart docker

[root@localhost ~]# ps -ef | grep docker
root       1881      1  0 16:33 ?        00:00:00 /usr/bin/dockerd -b br0 -H fd:// --containerd=/run/containerd/containerd.sock --storage-opt overlay2.size=40G

Overy2模式,默认是宿主机的大小,你宿主机可以空间就是每个容器可用空间。你的云主机空间就是每个40G,为什么是40G就是因为做了overy2模式,设置了全局大小,这样才会限制约束每个容器的空间

这样每个容器启动占用40G就不会占用宿主机全部空间了,其他资源限制还是一样。

#这样CPU 一核 2G内存 硬盘40G
[root@localhost ~]# docker run -itd --net=none --cpuset-cpus=0-0 -m 2048m --privileged centos7-ssh
58e8aafd4ea3a11cecd540b67530afcab8fd01821e3d579dc6ebee0cdfdf9956


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ed8776f67171        centos7-ssh         "/bin/sh -c /usr/sbi…"   3 seconds ago       Up 2 seconds                            frosty_tharp
[root@localhost ~]# docker exec -it ed8776f67171 /bin/bash
[root@ed8776f67171 ansible]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          45G   12K   45G   1% /

补充一点,如果你的docker版本是修改json文件参考下面

配置docker daemon


/etc/docker/daemon.json配置文件如下,这里将每个容器可以使用的磁盘空间设置为1G:

{
    "data-root": "/data/docker",
    "storage-driver": "overlay2",
    "storage-opts": [
      "overlay2.override_kernel_check=true",
      "overlay2.size=1G"
    ]
}

写入文件测试


重启docker后,启动一个容器,在容器中创建文件。

先创建一个1000M的文件:

/ # dd if=/dev/zero of=/a bs=100M count=10
10+0 records in
10+0 records out

然后创建第二个1000M的文件:

/ # dd if=/dev/zero of=/b bs=100M count=10
dd: writing '/b': No space left on device
2+0 records in
0+1 records out

可以看到第二个1000M文件因为空间不足创建失败,并且只写入了24M:

/ # ls -lh
total 1048572
-rw-r--r--    1 root     root     1000.0M Dec 26 03:38 a
-rw-r--r--    1 root     root       24.0M Dec 26 03:38 b

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/108058302