我已经搜索了一段时间,但找不到分析Docker容器/卷的磁盘使用情况的方法.
我可以看到Docker需要12GB的文件系统:
2.7G /var/lib/docker/vfs/dir
2.7G /var/lib/docker/vfs
2.8G /var/lib/docker/devicemapper/mnt
6.3G /var/lib/docker/devicemapper/devicemapper
9.1G /var/lib/docker/devicemapper
12G /var/lib/docker
Run Code Online (Sandbox Code Playgroud)
但是,我怎么知道这是如何分布在容器上的呢?
我尝试通过运行附加到容器(新的v1.3命令)
docker exec -it <container_name> bash
Run Code Online (Sandbox Code Playgroud)
然后运行'df -h'来分析磁盘使用情况.它似乎有效,但不适用于使用'volume-from'的容器.
例如,我使用MongoDB的仅数据容器,称为"mongo-data".
当我运行docker run -it --volumes-from mongo-data busybox,然后df -h在容器内部,它说安装在/data/db(我的'mongo-data'仅数据容器)上的文件系统使用11.3G,但是当我这样做时du -h /data/db,它说它只使用2.1G.
那么,我如何分析容器/卷磁盘的使用情况呢?或者,在我的情况下,我如何找出'mongo-data'容器大小?
非常感谢,
我已经设置了docker,我使用了完全不同的块设备来存储docker的系统数据:
[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker
other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"
Run Code Online (Sandbox Code Playgroud)
请注意,/disk/1使用完全不同的硬盘驱动器/dev/xvdi
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.8G 5.1G 2.6G 67% /
devtmpfs 1.9G 108K 1.9G 1% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/xvdi 20G 5.3G 15G 27% /disk1
/dev/dm-1 9.8G 1.7G 7.6G 18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2 9.8G 1.7G 7.7G 18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac
Run Code Online (Sandbox Code Playgroud)
问题是当我继续下载docker镜像并运行docker容器时,似乎另一个硬盘驱动器/dev/xvda1也用完了.
我可以通过删除一些docker镜像来验证此问题.删除一些docker图像后,/dev/xvda1现在有一些额外的空间.
我错过了什么吗?
我的码头版:
[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
Pool …Run Code Online (Sandbox Code Playgroud) 我有一个带有2个容器的docker环境(Jenkins和Nexus,都有自己的命名卷).我有一个每日cron-job,删除未使用的容器和图像.这工作正常.但问题出在我的devicemapper中:
du -sh /var/lib/docker/
30G docker/
Run Code Online (Sandbox Code Playgroud)
我可以在我的docker文件夹中的每个文件夹:Volumes(大,但在我的情况下这是正常的):
/var/lib/docker# du -sh volumes/
14G volumes/
Run Code Online (Sandbox Code Playgroud)
集装箱:
/var/lib/docker# du -sh containers/
3.2M containers/
Run Code Online (Sandbox Code Playgroud)
图片:
/var/lib/docker# du -sh image/
5.8M image/
Run Code Online (Sandbox Code Playgroud)
Devicemapper:
/var/lib/docker# du -sh devicemapper/
16G devicemapper/
Run Code Online (Sandbox Code Playgroud)
/var/lib/docker/devicemapper/mnt是7.3G
/var/lib/docker/devicemapper/devicemapper是8.1G
Docker信息:
Storage Driver: devicemapper
Pool Name: docker-202:1-xxx-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: ext4
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 5.377 GB
Data Space Total: 107.4 GB
Data Space Available: 28.8 GB
Metadata Space …Run Code Online (Sandbox Code Playgroud) 我再也无法在Docker中创建和运行新容器了.但同时可以运行以前创建的容器.
当我尝试做这样的事情时:
[user@host ~ ] docker run --name=fpm-5.3 debian:jessie
2014/07/12 07:34:08 Error: Error running DeviceCreate (createSnapDevice) dm_task_run failed
Run Code Online (Sandbox Code Playgroud)
来自docker.log:
2014/07/12 05:57:11 POST /v1.12/containers/create?name=fpm-5.3
[f56fcb6f] +job create(fpm-5.3)
Error running DeviceCreate (createSnapDevice) dm_task_run failed
[f56fcb6f] -job create(fpm-5.3) = ERR (1)
[error] server.go:1025 Error: Error running DeviceCreate (createSnapDevice) dm_task_run failed
[error] server.go:90 HTTP Error: statusCode=500 Error running DeviceCreate (createSnapDevice) dm_task_run failed
Run Code Online (Sandbox Code Playgroud)
dmsetup状态
docker-8:1-1210426-pool: 0 209715200 thin-pool 352 2510/524288 205173/1638400 - ro discard_passdown queue_if_no_space
Run Code Online (Sandbox Code Playgroud)
但它们在磁盘上有很多可用空间.
dmsetup信息
Name: docker-8:1-1210426-pool
State: ACTIVE
Read Ahead: …Run Code Online (Sandbox Code Playgroud) 我最近听到(来自RedHat的人),"direct-LVM"(devicemapper)是生产设置的推荐存储后端,所以我想在CentOS 7 VM上尝试一下.(其中loopback-LVM似乎是默认值).
所以我创建了一个单独的数据磁盘和带有2个LV的VG用于数据和元数据,将它们传递到docker配置并启动docker ...到目前为止一直很好,看起来像这样:
# ps auxwf
...
/usr/bin/docker -d --selinux-enabled -H unix://var/run/docker.sock \
--log-level=warn --storage-opt dm.fs=xfs \
--storage-opt dm.datadev=/dev/vg_data/docker-data \
--storage-opt dm.metadatadev=/dev/vg_data/docker-meta \
--storage-opt dm.basesize=30G --bip=172.17.42.1/24 \
# docker info
Containers: 8
Images: 145
Storage Driver: devicemapper
Pool Name: docker-253:0-34485692-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: xfs
Data file: /dev/vg_data/docker-data
Metadata file: /dev/vg_data/docker-meta
Data Space Used: 4.498 GB
Data Space Total: 34.36 GB
Data Space Available: 29.86 GB
Metadata Space Used: 6.402 MB
Metadata Space Total: 104.9 MB …Run Code Online (Sandbox Code Playgroud) 我在AWS实例上构建了一个中间层基础设施,包括3个主服务器(运行zookeeper,mesos-master,marathon和haproxy)和N个从属服务器(运行mesos-slave和docker).
如果我在不同的奴隶上运行相同的容器马拉松下载每个奴隶相同的图像.我想共享一个单独的nfs导出(比如在master1上)并将其挂载到每个slave上,以便为图像提供唯一的存储空间.
我在EC2实例上使用Ubuntu,因此默认使用的存储驱动程序是device-mapper.我设置奴隶来挂载/ var/lib/docker/devicemapper和/ var/lib/docker/graph,但它最终出现了这个错误:"陈旧的NFS文件句柄"
我想了解的是:
我有一些关于存储的问题./ var/lib/docker/devicemapper /文件夹占据了我存储空间的50%.
在文件夹/ var/lib/docker/devicemapper/mnt中,我有许多空文件夹.
如何正确清理docker devicemapper并删除所有未使用的映射?
我试图通过引用已有的dm-linear,dm-snapshot,dm-cache等来实现设备映射器目标.在我的实现中,我需要对某个扇区范围执行读/修改/写操作.由于器件映射器直接与块层对话,我不确定用什么数据结构/函数来读取存储器中的扇区,修改缓冲区并将其写回另一个扇区范围.在应用程序级别,我们有系统调用,下面我们有vfs_read/vfs_write.设备映射器层有什么类似的东西吗?我被困在这里很久了.任何帮助将不胜感激.
我想知道我是否可以在docker中装载一个图像(例如ubuntu图像),其存储驱动程序是devicemapper"而不将其作为容器执行".
实际上我成功地将文件系统挂载到这样的容器中.
我需要找到挂载图像的方法而不将其作为容器执行.(我正在做一些数字取证研究.)我已经知道命令"docker save~","docker~export"但我不是指这些东西.
我在"/ var/lib/docker"下仔细检查过,但只发现了一个可疑目录,即"/ var/lib/docker/image/devicemapper/layerdb/sha256 /",此路径下的每个目录都有自己的"tar-split". json.gz"文件.我解开它,发现它意味着层之间的一些差异?!
我现在不知道该怎么办.有没有人可以帮助我,请ㅜㅜ.我这样做是因为当我们研究基于docker的系统时,我们需要在不使图像成为容器的情况下查看图像中的文件系统,我们需要"dd"其中的文件系统并导入".dd"文件到另一台用于调查的计算机.
我在 Redhat 上使用 Docker 版本 17.06.0-ce 和 devicemapper 存储。我正在启动一个运行长期服务的容器。容器内的主进程有时会因任何原因而死亡。我收到以下错误消息。
/bin/bash: line 1: 40 Killed python -u scripts/server.py start go
我希望容器退出并由 docker 重新启动。但是 docker 永远不会退出。如果我手动执行,则会出现以下错误:
来自守护进程的错误响应:驱动程序“devicemapper”未能删除根文件系统。
谷歌搜索后,我尝试了很多东西:
docker rm -f <container>
rm -f <pth to mount>
umount <pth to mount>
Run Code Online (Sandbox Code Playgroud)
设备中的所有结果都处于忙碌状态。现在唯一的补救办法是重新启动主机系统,这显然不是一个长期的解决方案。
有任何想法吗?
正如在生产系统上所建议的那样,我在具有devicemapper和Thinpool设备的Redhat系统上运行docker。现在,当我想重新安装docker时,我需要两个步骤:
1)删除docker目录(在我的情况下为/ area51 / docker)
2)清除Thinpool设备
该搬运工文档指出,使用与dm.metadev和dm.datadev选项devicemapper时,清洁devicemapper的最简单的方法是:
如果设置新的元数据池,则必须有效。这可以通过将前4k设为零以指示空的元数据来实现,如下所示:
$ dd if=/dev/zero of=$metadata_dev bs=4096 count=1
Run Code Online (Sandbox Code Playgroud)
不幸的是,根据文档,dm.metadatadev不推荐使用,而是改为使用dm.thinpooldev 。
我的thinpool是按照此docker 指令创建的, 因此,我的设置现在看起来像这样:
cat /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.thinpooldev=/dev/mapper/thinpool_VG_38401-thinpool",
"dm.basesize=18G"
]
}
Run Code Online (Sandbox Code Playgroud)
在devicemapper目录下,我看到以下Thinpool设备
ls -l /dev/mapper/thinpool_VG_38401-thinpool*
lrwxrwxrwx 1 root root 7 Dec 6 08:31 /dev/mapper/thinpool_VG_38401-thinpool -> ../dm-8
lrwxrwxrwx 1 root root 7 Dec 6 08:31 /dev/mapper/thinpool_VG_38401-thinpool_tdata -> ../dm-7
lrwxrwxrwx 1 root root 7 Dec 6 08:31 /dev/mapper/thinpool_VG_38401-thinpool_tmeta -> ../dm-6
Run Code Online (Sandbox Code Playgroud)
因此,在成功运行docker之后,我尝试如上所述重新安装并通过在tmeta设备中写入4K零来清除Thinpool并重新启动docker:
dd if=/dev/zero of=/dev/mapper/thinpool_VG_38401-thinpool_tmeta bs=4096 count=1
systemctl …Run Code Online (Sandbox Code Playgroud) 阅读 dm-crypt 和 LUKS 的文档,我了解到 LUKS 是一种允许 FDE 的格式规范,而 dm-crypt 是一个 dm 目标,允许对块设备的写入/读取进行加密/解密。
但是,我不确定这些现在到底提供什么(即职责是什么)。在作者(Milan Broz)制作的幻灯片中,提到LUKS2还可以提供完整性保护(从而使加密得到验证)。由此看来,并阅读了LUKS1规范,我认为这在 LUKS1 中是不可能的。然而,稍后在幻灯片中它讨论了 dm-crypt 如何允许经过身份验证的加密。这就是我困惑的地方;我们假设我们使用 LUKS2 吗?
我觉得我并没有真正掌握 LUKS 和 dm-crypt 的主要功能和职责。
谢谢!
通过 NFS 导出 /var/lib/docker 的含义是什么?这个想法是将 docker 图像存储在服务器中,并将其导出到内存有限的主机来存储和运行容器。这对于避免让每个主机下载并存储它自己的 docker 镜像库很有用。主机可以使用 FS-Cache 来限制网络上的数据传输。
device-mapper ×13
docker ×11
redhat ×3
lvm ×2
lxc ×2
nfs ×2
caching ×1
centos ×1
diskspace ×1
encryption ×1
linux ×1
linux-kernel ×1
luks ×1
mesos ×1