devicemapper存储驱动下镜像的存储

docker配置devicemapper存储驱动

#查看当前使用的存储驱动,默认为overlay
docker info | grep -i storage

#停止docker
systemctl stop docker
#移除原存储配置文件 rm /etc/sysconfig/docker-storage #使用vdb磁盘创建pv pvcreate /dev/vdb #使用vdb磁盘创建dockercg vgcreate dockervg /dev/vdb #配置docker pool为dockervg cat <<EOF > /etc/sysconfig/docker-storage-setup VG=dockervg EOF #配置存储 docker-storage-setup #重启docker systemctl restart docker

 

devicemapper存储驱动下镜像的存储

docker数据存储的目录为/var/lib/docker,可以通过docker info | grep -i "Docker Root Dir" 查看

以下通过构建一个镜像来观察镜像的存储方式,Dockerfile如下

#创建测试目录
mkdir  -p /tmp/docker-test && cd /tmp/docker-test

#创建Dockerfile和测试文件
echo <<EOF > Dockerfile
FROM docker.io/resouer/guestbook:v1 (该镜像已存在节点)
COPY 1 /tmp/1.txt
COPY 2 /tmp/2.txt
COPY 3 /tmp/3.txt
EOF
echo 111 > 1
echo 222 > 2
echo 333 > 3

#构建镜像前/var/lib/docker/devicemapper两个目录文件数量如下
devicemapper存储驱动下镜像的存储

 

#构建镜像

docker build -t docker-test01 . --no-cache

 

#构建镜像后/var/lib/docker/devicemapper两个目录文件数量如下

devicemapper存储驱动下镜像的存储

 

 #通过ls -lrt在metadate目录查看最新生成的文件,如图新增了3个文件与Dockerfile中的3个COPY层对应

devicemapper存储驱动下镜像的存储

 

 

#每层分别有一个device_id,如下图

devicemapper存储驱动下镜像的存储

 

 

 

 

使用device_id创建dm设备并挂载到文件系统

如上,每个镜像层都会对应一个device_id

#查看docker为其管理的容器所创建的dm设备
dmsetup ls
dmsetup table
其中dmsetup table输出结果的格式如下
logical_start_sector num_sectors target_type target_args
开始扇区             扇区数      设备类型    设备参数

如docker-253:1-1447237-b4b4ee02b3171ce0d9c9c39012b87dfe69c72fee4ab2a004bf03983ea00b612c: 0 20971520 thin 252:2 141

docker-253:1-1447237-b4b4ee02b3171ce0d9c9c39012b87dfe69c72fee4ab2a004bf03983ea00b612c为在/dm设备名称
0为起始扇区
20971520 为扇区数,一个扇区大小为512kb,总共为10g
thin为{未知,dm设备所使用的存储块按需分配?}
252:2为dockervg-docker--pool的dm编号,可通过dmsetup ls查看
141为device_id

#为每个镜像层依次创建dm设备
dmsetup create myimage-dm1 --table "0 20971520 thin 252:2 186"
dmsetup create myimage-dm2 --table "0 20971520 thin 252:2 189"
dmsetup create myimage-dm3 --table "0 20971520 thin 252:2 192"
#查看/dev/mapper目录,发现新增了3个链接文件,链接到不同dm设备
devicemapper存储驱动下镜像的存储

 

 

#创建测试挂载点,并挂载dm设备

mkdir -p /tmp/mp1

mkdir -p /tmp/mp2

mkdir -p /tmp/mp3

 

mount /dev/dm-19 /tmp/mp1/

查看/tmp/mp1中的rootfs/tmp目录,如下,tmp目录只有一个1.txt文件,与Dockerfile中的第一个COPY层吻合

devicemapper存储驱动下镜像的存储

 

 

继续通过mount /dev/dm-20 /tmp/mp2/  mount /dev/dm-21 /tmp/mp3/挂载第二层和第三层,均报Filesystem has duplicate UUID 040571c8-2123-4c9b-ab15-a77f69626835 - can‘t mount,如下

devicemapper存储驱动下镜像的存储

 

 

 

#卸载dm-19,再挂载dm-20,可以看到tmp目录下对应Dockerfile中的第一个COPY和第二个COPY的内容

umount /dev/dm-19 && mount /dev/dm-20 /tmp/mp2

devicemapper存储驱动下镜像的存储

 

 

#再次dm-20,再挂载dm-21,可以发现tmp目录是对应的全部的三个测试文件

以上说明,镜像的每一个层是根据Dockerfile中的顺序依次叠加的

 

 

 

参考:

https://www.cnblogs.com/xuxinkun/p/10643840.html

https://blog.csdn.net/felix_yujing/article/details/54344251

devicemapper存储驱动下镜像的存储

上一篇:android.os.TransactionTooLargeException


下一篇:document.documentElement.scrollTop获取滚动条位置在手机上失效