Docker 存储
overlayfs
要求说明
- overlay2 驱动支持docker-ee 17.06.02-ee5 或者 docker-ce
- 内核升级到 4.0或者以上
- RHEL 7.1 ext4
- RHEL7.2或者更高,使用xfs,需要:d_type=true (xfs_info / 命令查看),如果d_type不等于1,则会出现各种问题(文件删除出现问号,容器中tail不能实时刷新)。
配置
- 样例
文件名:/etc/docker/daemon.json
{
"storage-driver": "overlay2"
}
Devicemapper
要求说明
安装配置
镜像说明
- 默认情况,镜像及分层挂载到:/var/lib/docker/devicemapper/
- /var/lib/docker/devicemapper/metadata/:包含关于devicemapper配置的metadata,也包含每个镜像和存在的容器的层,devicemapper使用快照,metadata也包含快照信息,以json格式存放。
- /var/lib/devicemapper/mnt/:镜像和容器在这个目录下都有一个挂载点,镜像的挂载点为空,但是容器的挂载点和容器内的信息一致。
容器说明
读信息
写信息
挂载说明
- 根据容器ID查找文件:/var/lib/docker/image/devicemapper/layerdb/mounts/${容器id}/mount-id
- cat 对应容器编号的文件内容为:A
- 根据A,获取:/var/lib/docker/devicemapper/metadata/A的内容B(cat /var/lib/docker/devicemapper/metadata/A)
- B是以json格式展示的内容:其中有一个device_id字段,其内容与通过dmsetup table 获取到的某个device编号匹配
- dmsetup ls 可以查看所有的dm
- dmsetup table 可以查看table
- 在dmsetup table命令的结果中可以看到类似如下信息:
docker-253:4-33585586-290c722e9aa243bff35c920d219b9091ee6751e565c71afebad8f4a2fe2398ad: 0 41943040 thin 253:7 84
从0开始的字段的含义如下:
logical_start_sector num_sectors target_type target_args
开始扇区 扇区数 设备类型 设备参数
- 在这里顺带还解释下docker挂载的一个疑惑,就是docker中dm设备最终都会mount到devicemapper/mnt/{mount-id}/目录下。
- 但是在/proc/mounts下并不可见。这是因为docker daemon单独创建了一个mount的namespace
- 可以通过查看:/proc/1下的ns或者mounts显示命名空间或挂载点
ll /proc/1/ns
cat /proc/${daemon进程号}/mounts(也可以通过nsenter切入到docker daemon进程的mount ns下进行查看:nsenter -t ${daemon进程号} -m mount -l)
FAQ
重启服务激活lvm
# lvchange -ay docker/thinpool
操作系统视角查看磁盘
# lsblk
mount 查看docker挂载点
# mount |grep devicemapper
创建dm设备
# dmsetup create docker-253:4-33585586-290c722e9aa243bff35c920d219b9091ee6751e565c71afebad8f4a2fe2398ad --table "0 20971520 thin 253:3 34709"
移除dm设备
# dmsetup remove docker-253:4-33585586-290c722e9aa243bff35c920d219b9091ee6751e565c71afebad8f4a2fe2398ad