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
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
#什么结果都没有,这个表示没有设置配额
[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引擎默认数据存储目录/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文件参考下面
/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