Docker,Volumes vs Bind Mounts用于持久性数据,如DB,elasticsearch?

docker data volume vs mounted host directory

说卷应该优先于绑定坐骑

关于这个问题,我有几个问题.帖子说:

创建卷时,它存储在Docker主机上的目录中

忍受我,但我是码头工的新手,我想知道这里的码头主机是什么.

它是我构建图像的机器(可能不是)吗?
它是运行图像的机器吗?如果是这样,如果我在多台机器上运行图像会发生什么,它会创建两个独立的卷吗?
当我有开发和生产设置时,docker如何为每个环境管理两个单独的卷?

除此之外,当我使用数据量时,通过做docker-compose来丢失数据似乎相当容易,这是让我不愿意使用数据量的第一个障碍,是否有一个明显的解决方案来缓解这个问题?

最佳答案 这实际上不是一个学说 – 不使用绑定坐骑.是的,如果在默认情况下在容器内具有root权限,则如果安装不正确(例如-v / bin:/ var / log),它们可能会损坏主机的文件系统;它们也不太便携,但它们便于主机和容器之间的文件交换.如果要为服务提供初始配置,或者将编译的源代码放入容器中,我相信您更愿意绑定mount而不是为docker volume cp操作创建和运行临时容器.此外,应尽可能使用:ro选项(只读)以防止从容器内部修改数据.

Docker主机 – 它是一台机器(PC),Docker守护程序正在运行.

Is it a machine where I build the image (probably not)?

不对.您可以远程使用docker CLI或docker API进行构建.

Is it the machine where the image will be run?

是的,图像由docker守护程序运行,因此它将成为主机.

If it is so, what happens if I run the image on multiple machines,
will it create two independent volumes?

这取决于.在不同的机器上运行图像可以通过不同的方式实现,与kubernetes或docker swarm等协调器一起开始,并在单独的docker守护程序上以手动启动结束.使用orchestrator,可以在不同的主机之间共享相同的卷,但在这种情况下,您不能使用绑定挂载,而是使用卷.

When I have developement and production setup, how docker manages two
separate volumes for each environment?

Docker不是你管理的人.

Besides it seems fairly easy to lose data by doing docker-compose down
when I use data volumes, that’s the first obstacle that makes me to
hesitate to use data volumes, is there an obvious solution to mitigate
the issue?

卷可以很容易地在docker-compose会话之间保持不变.实现这一目标的最明确的方法是提前声明卷

docker volume create foo

然后在你的撰写文件中使用它:

version: '3'
services:
  abc:
    volumes:
      foo:/foo
volumes:
  foo:
    external: true
点赞