卷 - 设备映射如何在Docker

时间:2018-05-18 14:20:14

标签: docker filesystems dockerfile docker-volume

我创建了两个Docker卷:

docker volume create volume1
docker volume create volume2

然后我使用以下命令创建了一个Docker容器:

docker create -it ... some options ... -v volume1:/var/vcap/store -v volume2:/var/vcap/store2 --privileged myimage /bin/bash

Docker容器已正确配置ssh,因此当我在其中ssh时,我正确地看到/ var / vcap / store上安装的卷。特别是,我看到了这一点:

/dev/sda1 on /var/vcap/store type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /var/vcap/store2 type ext4 (rw,relatime,data=ordered)

此外,我还在设备/ dev / sda1上看到了其他文件系统:

/dev/sda1 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /etc/hosts type ext4 (rw,relatime,data=ordered)

这让我很困惑,因为我不清楚如何将相同的设备安装在不同的文件夹上并且是不同的文件系统。事实上,我验证了如果我在Mac上托管容器的Linux VM上的/ var / vcap / store中创建了一个文件,我会在文件夹下看到:

/var/lib/docker/volumes/volume1/_data 

创建的文件。如果我在Linux VM上的/ var / vcap / store2下创建它,我会看到它在

下创建
/var/lib/docker/volumes/volume2/_data
到目前为止一切顺利。我的问题是我创建了容器特权,因为我想挂载和卸载这些文件系统。卸载工作正常,但如果我再次尝试安装卷,我不知道使用哪个设备。如果我使用命令:

mount /dev/sda1 /var/vcap/store

我在此文件夹下看到以下内容:

cni  containerd  docker  kubeadm  kubelet-plugins  log  lost+found  nfs  swap

我不知道它来自哪里。

问题是:

  1. 当我在Docker上安装卷如何在/ dev / sda1设备上映射?
  2. 不同文件系统的相同设备怎么可能?
  3. 假设我在特权模式下使用Docker,我应该使用mount命令再次安装以前卸载过的文件系统吗?

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  
      
  1. 当我在Docker上安装卷时,它是如何映射到/ dev / sda1的   设备?
  2.   

创建泊坞窗卷时, docker会为/ var / lib / docker / volumes / volume_name 创建内部符号链接。 如果在/ dev / sda1中安装了/ var / lib / docker / volumes,则每个卷和已安装的文件或属于/ dev / sda1的目录将显示在同一点上,因为实际上它们是符号链接。

  
      
  1. 对于不同的设备,如何才能使用相同的设备   文件系统?
  2.   

它还回答了1号回答:它是相同的文件系统,但是内部符号链接不同。 Docker确实"虚拟" mount,所以,你只有一个真正的/ dev / sda1,尽管看起来有几个。这就是为什么你不能从容器中卸载/ dev / sda1的原因。只有一个"虚拟" docker unmount。

  
      
  1. 假设我在安装的特权模式下使用Docker   我应该使用命令再次安装文件系统   卸载?
  2.   

docker rundocker-compose up完成的虚拟安装不可能在容器内完成,因为卷将被引用到主机安装点(/ dev / sda1)。 最后,我建议控制从启动容器的主机安装和卸载。如果您需要从容器装载和卸载,请安装和卸载不同的安装点(例如samba目录,nfs存储等),而不是当前的/ dev / sda1,以避免误解。