Docker、卷与持久数据(例如数据库、elasticsearch)的绑定挂载?

eug*_*ene 6 docker docker-compose

docker数据量与挂载的主机目录

volumes应该优先于bind mounts

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

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

请耐心等待,但我是 docker 新手,我想知道docker host这里是什么。

它是我构建镜像的机器吗(可能不是)?
是运行映像的机器吗?如果是这样,如果我在多台机器上运行该映像会发生什么,它会创建两个独立的卷吗?
当我完成developement设置后production,docker 如何为每个环境管理两个单独的卷?

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

gra*_*pes 4

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

Docker 主机 - 它是一台机器(PC),Docker 守护进程在其中运行。

它是我构建镜像的机器吗(可能不是)?

不对。您可以使用docker CLIdocker API远程构建。

是运行映像的机器吗?

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

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

这取决于。在不同的机器上运行镜像可以通过不同的方式来实现,从像kubernetes或 这样的编排器开始docker swarm,最后在单独的 docker 守护进程上手动启动。使用协调器,可以拥有相同的卷,在不同的主机之间共享,但在这种情况下,您不能使用bind mounts,而是使用volumes.

当我进行开发和生产设置时,docker 如何为每个环境管理两个单独的卷?

Docker 不是由你来管理的。

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

卷可以在docker-compose会话之间轻松保留。实现这一目标的最明确方法是提前声明数量

docker volume create foo
Run Code Online (Sandbox Code Playgroud)

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

version: '3'
services:
  abc:
    volumes:
      foo:/foo
volumes:
  foo:
    external: true
Run Code Online (Sandbox Code Playgroud)