如何实现不同主机上的Docker容器共享存储卷?
跨Docker Swarm节点共享文件的可行解决方案
针对你的场景,以下是几个可落地的解决方案:
方案1:使用NFS分布式存储卷(最直接的跨节点共享方案)
本地Docker持久化卷仅支持单节点,改用NFS卷可以实现Swarm集群跨节点共享:
- 在主机
199上搭建NFS服务,将iSpy保存文件的目录设置为共享目录(具体步骤参考对应系统的NFS配置,比如Ubuntu下安装nfs-kernel-server,配置/etc/exports) - 在Swarm集群中创建NFS类型的持久化卷:
docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.x.199,rw \ --opt device=:/path/to/ispy/save/directory \ ispy_shared_volume
- 更新iSpy容器的部署配置,将该卷挂载到iSpy的文件保存目录;同时更新Node-red容器的部署配置,将同一卷挂载到Node-red可访问的路径下。
方案2:通过HTTP文件服务实现跨节点文件访问
在主机199上部署轻量文件服务容器,让Node-red通过HTTP请求获取文件:
- 在Swarm中部署一个nginx服务,调度到
199节点,挂载iSpy的文件目录到nginx的静态文件目录:
version: '3.8' services: ispy-file-server: image: nginx:alpine deploy: placement: constraints: - node.hostname == 199 volumes: - /path/to/ispy/save/directory:/usr/share/nginx/html networks: - your-overlay-network networks: your-overlay-network: external: true
- 在Node-red的流程中,通过
http request节点访问http://ispy-file-server/[文件名]获取文件,再交给deepstack处理。
方案3:在Node-red容器内直接挂载SMB共享
之前的问题是未在容器内部正确挂载SMB,改用Docker CIFS卷实现容器内直接访问:
- 创建SMB类型的Docker卷:
docker volume create --driver local \ --opt type=cifs \ --opt o=username=your_smb_user,password=your_smb_pass,addr=192.168.x.199 \ --opt device=//192.168.x.199/ispy_smb_share \ ispy_smb_volume
- 将该卷挂载到Node-red容器的指定路径(比如
/data/ispy-files),Node-red即可直接读取该路径下的文件。
内容的提问来源于stack exchange,提问作者Jonathon Isham
相关产品推荐
相关产品推荐

