docker 如何映射主机分区?

How does docker map host partitions?

我对 docker 比较陌生,当我启动一个容器(一个 ubuntu 基础映像)时,我注意到以下内容:

在主机上,

$ df -h
...
/dev/sdc1       180M   98M   70M  59% /boot
/dev/sdc2        46G   20G   24G  46% /home
/dev/sdc5        37G  7.7G   27G  23% /usr
/dev/sdc6        19G   13G  5.3G  70% /var

$ lsblk
...
sdc      8:32   0 232.9G  0 disk 
├─sdc1   8:33   0   190M  0 part /boot
├─sdc2   8:34   0  46.6G  0 part /home
├─sdc3   8:35   0  18.6G  0 part /
├─sdc4   8:36   0     1K  0 part 
├─sdc5   8:37   0  37.3G  0 part /usr
├─sdc6   8:38   0  18.6G  0 part /var
├─sdc7   8:39   0  29.8G  0 part [SWAP]
└─sdc8   8:40   0  42.8G  0 part 

在容器上

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs           19G   13G  5.3G  70% /
none             19G   13G  5.3G  70% /
tmpfs           7.8G     0  7.8G   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sdc6        19G   13G  5.3G  70% /etc/hosts
tmpfs           7.8G     0  7.8G   0% /proc/kcore
tmpfs           7.8G     0  7.8G   0% /proc/latency_stats
tmpfs           7.8G     0  7.8G   0% /proc/timer_stats

$ lsblk
sdc      8:32   0 232.9G  0 disk 
|-sdc1   8:33   0   190M  0 part 
|-sdc2   8:34   0  46.6G  0 part 
|-sdc3   8:35   0  18.6G  0 part 
|-sdc4   8:36   0     1K  0 part 
|-sdc5   8:37   0  37.3G  0 part 
|-sdc6   8:38   0  18.6G  0 part /var/lib/cassandra
|-sdc7   8:39   0  29.8G  0 part [SWAP]
`-sdc8   8:40   0  42.8G  0 part 

问题1:为什么sdc6挂载在宿主机和容器不同的地方?

因为两个挂载点的内容不同,所以我假设docker一定是在容器上做了某种设备映射,所以sdc6在容器里是不一样的作为主机上的那个。但是分区的容量和用途都是一样的,所以这里搞糊涂了。

问题2:为什么容器根目录使用率这么高? docker 图片上没有太多内容。

感谢您的帮助。

加法

Dockerfile 有一行

VOLUME /var/lib/cassandra

Question 1: why is sdc6 mounted on different places between the host and the container?

/dev/sdc6 在您的主机上是 /var,这是 /var/lib/docker 所在的位置,也是 Docker 保存某些数据的位置,例如分配的 hosts 文件到你的容器。

hosts 文件作为容器内的绑定挂载公开,这就是您看到的原因:

/dev/sdc6        19G   13G  5.3G  70% /etc/hosts

Question 2: why is the container's root dir usage so high? The docker image doesn't have much stuff on it.

看看容器内的df输出:

rootfs           19G   13G  5.3G  70% /

现在查看主机上的 df 输出,您会看到:

/dev/sdc6        19G   13G  5.3G  70% /var

容器内的 df 反映了主机文件系统的状态。这表明您正在使用 aufsoverlay 存储驱动程序,它们都在主机文件系统之上为容器创建 "overlay" 文件系统。如果您使用 devicemapper 存储驱动程序,df 的输出会有所不同,它依赖于设备映射器块设备而不是覆盖文件系统。