如何将多个容器中的写入同步到群集上的同一卷?

问题描述

在码头群中使用flock是否安全?

我正在寻找一种安全的方法,以使多个容器写入同一文件(在同一卷上)。我知道在单个主机上,docker将bind mount。我不确定的是当通过docker-compose在集群上旋转容器时,这是如何工作的。

如果我在一个服务中有多个同一图像的实例,并且它们全部共享一个卷,那么当我在一个群集中启动该实例时,容器将在单独的主机上启动吗?如果是这样,将如何在操作系统级别共享该卷?我有什么同步选项来控制并发写入?

解决方法

创建NFS卷

示例:

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,rw
        device: ":/path/to/dir"
,

docker volumes在创建它们的节点上是本地的,它们不在docker swarm节点之间共享。

在多节点swarm群集中(或在Kubernetes中运行)时,容器可以终止在群集内的任何节点上。为了共享访问docker volume(对于Kubernetes,则为PVC),该卷必须由诸如网络文件系统之类的东西支持,可以从群集内的每个节点访问该文件。

NFS版本4 implements close-to-open consistencyRFC 3530的“ 9.3。数据缓存”中提供了有关NFS v4实现的详细信息:

共享保留和记录锁定是NFS的功能 版本4协议提供了允许应用程序进行协调的功能 通过提供互斥功能进行访问。

提示 :名为docker volumesbind-mounts,这些卷在磁盘上创建(默认情况下)为/var/lib/docker/volumes,并绑定安装在docker run -v <named_docker_volume>:<container_mount_path> ...上。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...