Docker,Volumes与Bind Mounts之间的持久数据,例如DB,elasticsearch?

时间:2019-02-04 15:23:10

标签: docker docker-compose

docker data volume vs mounted host directory

volumes胜过bind mounts

我对此问题有几个疑问。帖子说:

When you create a volume, it is stored within a directory on the Docker host

与我同在,但是我是Docker的新手,我想知道docker host是什么。

是我在其中构建映像的机器(可能不是)吗?
是运行映像的机器吗?如果是这样,如果我在多台计算机上运行映像会发生什么,它将创建两个独立的卷吗?
当我设置了developementproduction时,docker如何为每个环境管理两个单独的卷?

除了在我使用数据量时通过执行docker-compose down丢失数据似乎相当容易之外,这是让我犹豫使用data volumes的第一个障碍,是否有明显的解决方案来缓解该问题?

1 个答案:

答案 0 :(得分:1)

实际上这不是一个原则-不使用绑定挂载。是的,默认情况下,一旦在容器中具有root特权,它们安装不正确(例如-v /bin:/var/log)就会损坏主机的文件系统;它们的便携性也较差,但它们有助于主机和容器之间的文件交换。当您想为服务提供初始配置,或将要编译的源代码放入容器中时,我相信您宁愿使用bind mount而不是为docker volume cp操作创建和运行临时容器。另外,在可能的情况下,应始终使用:ro选项(只读),以防止从容器内部修改数据。

Docker主机-它是运行Docker守护程序的计算机(PC)。

  

是否是我在其中构建映像的机器(可能不是)?

不是。您可以远程使用docker CLIdocker API进行构建。

  

是运行图像的机器吗?

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

  

如果是这样的话,如果我在多台计算机上运行映像会发生什么,   它会创建两个独立的卷吗?

这取决于。可以通过不同的方式来实现在不同机器上运行映像的方法,它们可以与kubernetesdocker swarm之类的编排器凝视,最后可以在单独的docker守护程序上手动启动。使用协调器,可以在不同的主机之间共享相同的卷,但是在这种情况下,您不能使用bind mounts,而要使用volumes

  

当我完成开发和生产设置后,Docker如何管理两个   每个环境都有单独的卷?

Docker并非由您来管理。

  

此外,通过执行docker-compose down似乎很容易丢失数据   当我使用数据量时,这是我遇到的第一个障碍   犹豫使用数据量,是否有明显的解决方案来缓解   问题?

音量可以轻松地在docker-compose个会话之间保持。最明确的实现方法是提前声明音量

docker volume create foo

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

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