我创建了两个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
我不知道它从哪里来。
问题是:
最佳答案
回答您的问题:
创建docker卷时, docker创建一个内部符号链接(symbolic link)到/ var / lib / docker / volumes / volume_name 。
如果将/ var / lib / docker / volumes挂载在/ dev / sda1中,则属于/ dev / sda1的每个卷和挂载的文件或dir都将在同一位置挂载,因为它们实际上是符号链接(symbolic link)。
它也用1号答案来回答:它是相同的文件系统,但是内部符号链接(symbolic link)不同。 Docker进行“虚拟”挂载,因此,您只有一个真实的/ dev / sda1,尽管它看起来很像。这就是为什么您不能从容器中卸载/ dev / sda1的原因。仅卸载了一个“虚拟” docker 。
不能在容器内部完成由docker run
或docker-compose up
完成的虚拟挂载,因为卷将被引用到主机挂载点(/ dev / sda1)。
绝对,我建议控制从启动容器的主机进行安装和卸载的控制。如果需要从容器安装和卸载,请安装和卸载与当前/ dev / sda1不同的安装点(例如samba目录,nfs存储等),以免造成误解。