卷设备映射如何在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卷:

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上装载卷时,它如何映射到/dev/sda1设备上
  • 同一设备如何可能用于不同的文件系统
  • 假设我在特权模式下使用Docker,我应该使用哪个mount命令来再次装载以前卸载的文件系统

  • 回答您的问题:

  • 当我在Docker上装载卷时,它是如何映射到/dev/sda1的 装置
    创建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 我应该使用命令重新装载以前的文件系统吗 卸载

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

    您可以详细说明第3点吗。我想使用Docker创建一个开发环境来测试PostgreSQL集群,由于某些原因,我无法在这里解释我的代码问题—装载/卸载几个文件系统。我的问题是能够以某种方式在Docker中模拟这些装载/卸载。即使采用变通方法,这是否可行?