Docker Swarm 共享卷

简介: Docker Swarm 共享卷

在很多应用中,我们可能会遇到文件上传功能(尽管现在 OSS 服务大行其道,但是仍不应该允许前端直接上传文件到 OSS 上,为了安全起见,需要服务器进行中转处理)、文件解析功能、文件生成并导出下载功能等一些列操作本地文件的功能和需求。


在单机的情况下,通过 volume 可以很容易的挂载数据卷,实现数据持久化和文件共享。


但是到了 Swarm 集群中,每个服务运行的位置可能是任何一个节点,而且文件数据需要互通。


举个实际例子:

在应用中,需要导出数据到Excel,并提供下载。由于数据量过大(通常万条起步),无法在浏览器中实现导出,所以选择在服务器中通过 Stream 从数据库中获取数据流,并流式写入到本地文件中,之后提供给前端一个文件路径地址,浏览器就可以下载了。


但是在 Swarm 集群中,每个副本所生成的文件没有特殊配置是不可互通的,因为 Docker volume 设定为本地卷,下一次前端的下载请求进来,通过 overlay 网络后无法保证一定会落到生成文件的服务中,因此就会出现 404 Not Found 错误。这个时候就要考虑如何共享文件/文件夹了。


通过多方资源查找,90%的解决方案都是NFS文件系统。因此,本篇也采用这个方案来解决需求。


思考

个人觉得这个方案可能不够严谨,如果说NFS服务器挂了,那岂不是集群就挂了?还是说NFS服务器可以做成容灾集群?但并没有找到NFS服务器做成容灾集群的方法


搭建NFS服务器

假设有5台Ubuntu 20.04 服务器,内网 IP 分别为: 10.87.23.111-115 ,选择 10.87.23.111 作为 NFS 服务器。


Step1. 安装 nfs 服务

$ sudo apt install nfs-kernel-server    # 安装
$ sudo systemctl start nfs-kernel-server.service    # 启动点击复制复制失败已复制


Step2. 建立 nfs 共享文件夹

$ sudo mkdir -p /data/nfs/docker
$ sudo chmod 777 -R /data/nfs点击复制复制失败已复制


Step3. 共享配置

修改 /etc/exports 文件,加入如下配置:

/data/nfs *(rw,insecure,no_root_squash,sync,no_wdelay,no_subtree_check)点击复制复制失败已复制

相关语法详见nfs挂载解析


Step4. 测试

在其他服务器上查看共享文件

$ showmount -e 10.87.23.111
Export list for 10.87.23.111:
/data/nfs *点击复制复制失败已复制

可以看到 /data/nfs 已经可以挂载了。


共享 volume 配置

yaml 文件中配置示例:

version: "3.8"
services:
  master:
    image: ******
    volumes:
      - master-public:/app/public
volumes:
  master-public:
    driver: local
    driver_opts:
      type: nfs4    # 注意不是nfs!
      o: "addr=10.87.23.111,rw"
      device: ":/data/nfs/docker"点击复制复制失败已复制


注意

网上很多文章都会先用 docker volume create 来创建一个数据卷,然后在写到 yaml文件 中,这个是画蛇添足的作法!因为 Docker Swarm 会根据 stack名称自动创建networkvolume 等,无需手动创建。


还有很多地方在 type 字段设置为 nfs ,那样就会默认使用 NFSv3 ,而不是最新的 NFSv4不要使用旧版!它有很大的缺陷,亲身采坑,原因是文件锁,关于版本的差别详见:NFS文件系统版本概述

目录
相关文章
|
17天前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
36 5
|
2月前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
22 6
|
2月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
33 5
|
2月前
|
调度 Docker 容器
docker swarm创建覆盖网络
【10月更文挑战第16天】
23 5
|
2月前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
30 4
|
2月前
|
Docker 容器
|
2月前
|
数据安全/隐私保护 Docker 容器
docker swarm创建网络
【10月更文挑战第15天】
22 1
|
19天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
19天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。
|
1月前
|
负载均衡 安全 调度
深入调查研究Docker Swarm
【10月更文挑战第19天】
31 0