卷设备映射如何在Docker上工作
我创建了两个Docker卷:卷设备映射如何在Docker上工作,docker,filesystems,dockerfile,docker-volume,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 mount /dev/sda1 /var/vcap
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
mount /dev/sda1 /var/vcap/store
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)
这让我很困惑,因为我不清楚如何将同一个设备安装在不同的文件夹上,并成为不同的文件系统。事实上,我验证了如果我在Linux VM上的/var/vcap/store中创建一个文件,在Mac上托管容器,我会在文件夹下看到:
/var/lib/docker/volumes/volume1/_data
创建的文件。如果我在Linux VM上的/var/vcap/store2下创建它,我会看到它是在
/var/lib/docker/volumes/volume2/_data
到目前为止还不错。我的问题是,我创建了特权容器,因为我想装载和卸载这些文件系统。卸载工作正常,但如果我尝试再次装载卷,我不知道要使用哪个设备。如果我使用命令:
docker create -it ... some options ... -v volume1:/var/vcap/store -v volume2:/var/vcap/store2 --privileged myimage /bin/bash
mount /dev/sda1 /var/vcap/store
我在此文件夹下看到以下内容:
cni containerd docker kubeadm kubelet-plugins log lost+found nfs swap
我不知道它从哪里来
问题是:
回答您的问题:
创建docker卷时,docker会创建一个指向/var/lib/docker/volumes/volume\u name的内部符号链接。 如果在/dev/sda1中装入/var/lib/docker/volumes,则属于/dev/sda1的每个卷和装入的文件或目录都将在同一点上装入,因为它们实际上是符号链接
答案也是第一:它是相同的文件系统,但内部符号链接不同。Docker执行“虚拟”装载,因此,您只有一个real/dev/sda1,尽管它看起来有几个。这就是为什么不能从容器中卸载/dev/sda1。只有一个“虚拟”docker卸载
通过
docker run
或docker compose up
完成的虚拟装载不可能在容器内完成,因为卷将被引用到主机装载点(/dev/sda1)。
最后,我建议控制从启动容器的主机安装和卸载。如果您需要从容器中装载和卸载,请装载和卸载不同于当前/dev/sda1的装载点(例如samba目录、nfs存储等等),以避免误解。您可以详细说明第3点吗。我想使用Docker创建一个开发环境来测试PostgreSQL集群,由于某些原因,我无法在这里解释我的代码问题—装载/卸载几个文件系统。我的问题是能够以某种方式在Docker中模拟这些装载/卸载。即使采用变通方法,这是否可行?