问题描述
在码头群中使用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 consistency。 RFC 3530的“ 9.3。数据缓存”中提供了有关NFS v4实现的详细信息:
共享保留和记录锁定是NFS的功能 版本4协议提供了允许应用程序进行协调的功能 通过提供互斥功能进行访问。
提示 :名为docker volumes
为bind-mounts,这些卷在磁盘上创建(默认情况下)为/var/lib/docker/volumes
,并绑定安装在docker run -v <named_docker_volume>:<container_mount_path> ...
上。