目的
问题
问题随着项目开发进度的推移,容器挂载到宿主机中的volume大小可能会增加,甚至占满本地文件系统。我们应采取何种方式控制docker volume数据卷容量大小呢?
解决
2.1 几个概念:docker文件系统、镜像与容器、UFS与volume
Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已存在的文件,那么该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。
在Docker镜像中,只读层以及在顶部的读写层组合,被称为Union FIle System(联合文件系统)。
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,以正常的文件或者目录形式存在于宿主机上。
- 清理
发现大文件
在当前文件夹中,查找100M以上的文件,并升序输出
find . -type f -size +100M -print0 | xargs -0 du -h | sort -nr
清空大文件内容
从上述输出中,找出大文件,内容置
cat /dev/null > /path/to/file_name
注意,只是把文件内容置0,而非删除文件。
通过大文件查找,我们可以获取大文件的目标路径,但是清理过后,volume中的测试数据可能还会涨满。如何限制volume的大小呢?
2.3 指定Volume大小的两种方式
创建docker volume,指定大小,再指定容器挂载卷。
docker volume create -d local -o type=tmpfs -o device=tmpfs -o o=size=100m,uid=1000 test_volume_101
docker volume rm test_volume_102
docker volume create -d local -o type=none -o device=/data/docker-volume/test_volume_102 -o o=bind --name=test_volume_102 && mkdir -p /data/docker-volume/test_volume_102
docker volume rm ln-10{0,1,2,3,4,5,6,7,8,9}
for i in `seq 100 1 109` ; do docker volume create -d local -o type=none -o device=/data/docker-volume/ln-$i -o o=bind --name=ln-$i ;done
docker volume inspect ln-100
__run() {
_name=test_container_100
docker rm -f $_name
docker run -itd --name=$_name \
--hostname=$_name \
--restart=always \
--net=host \
--privileged \
-v ln-100:/apps/data \
-v /proc:/host/:ro \
-v /data/docker-share/:/apps/share/ \
-v /data/docker-data/zabbix/dcache:/apps/data \
registry.cn-hangzhou.aliyuncs.com/lwmacct/ubuntu:v1
}
__run
_name=test_container_100 docker rm -f $_name docker run -itd --name=$_name \ --hostname=$_name \ --restart=always \ --net=host \ --privileged \ -v ln-100:/apps/data \ -v /proc:/host/:ro \ -v /data/docker-share/:/apps/share/ \ -v /data/docker-data/zabbix/dcache:/apps/data \ registry.cn-hangzhou.aliyuncs.com/lwmacct/ubuntu:v1
docker run -it --name test_container_101 --hostname test_container_101 -v test_volume_101:/apps/data centos:7
docker run -it --rm --name test_container_102 --hostname test_container_102 -v ln-100:/apps/data centos:7
// 在容器命令行,尝试向volume里面填充数据,但最后只能写入2M
dd if=/dev/zero of=/apps/data/my101.img bs=1M count=10
同理,也可以在docker-compose.yml、dockerfile中指定已经创建的volume。
映射本地文件系统
mkdir /run/my_test_volume_01
// 宿主机挂载目录
mount tmpfs /run/my_test_volume_01 -t tmpfs -o rw,size=2m,uid=1000
// 使用-v选项,把这个文件系统挂载给容器
docker run -it --rm --name test01 --hostname test01 -v /run/my_test_volume_01:/mytest centos:7.3.1611 bash
同理,也可以在docker-compose.yml、dockerfile中指定已经创建的volume。
https://blog.csdn.net/shanyongxu/article/details/51460930
https://blog.csdn.net/yjk13703623757/article/details/80579395
————————————————
[
](https://blog.csdn.net/yjk13703623757/article/details/80579395)