Docker Swarm可以管理两种类型的存储:volume和bind虽然Docker Documentation没有建议使用bind,因为它在本地目录(在每个群节点上)和任务之间创建了一个绑定,但没有提到volume实现,所以我不明白任务之间如何共享卷?
volume
bind
icnyk63a1#
群集模式本身不会对卷执行任何不同的操作,它会运行您在运行容器的节点上提供的任何卷装载命令。如果卷装载在该节点的本地,则数据将保存在该节点的本地。没有在节点之间自动移动数据的内置功能。有一些基于软件的分布式存储解决方案,如GlusterFS、Rook、Ceph和Longhorn,其中许多都专注于与Kubernetes的集成,这对Swarm没有帮助。通常的结果是,您要么需要管理应用程序内的存储复制(例如etcd和其他基于raft的算法),或者您在外部存储系统上执行装载(希望它本身具有高可用性)。挂载外部存储系统有两个选项,基于数据块或基于文件。(例如EBS)通常具有较高的性能,但仅限于安装在单个节点上。因此,您通常需要一个第三方卷插件驱动程序,以给予Docker节点访问该块存储。基于文件的存储(例如EFS)的性能较低,但可移植性更强,并且可以同时安装在多个节点上,这对于复制服务非常有用。最常见的基于文件的网络存储是NFS(这和EFS使用的协议是一样的)。而且你可以在没有任何第3方插件驱动程序的情况下挂载它。Docker附带的不幸命名为“本地”卷插件驱动程序给你提供了一个选项,可以将任何你想要的值传递给带有驱动程序选项的mount命令,而没有选项,它默认将卷存储在docker目录/var/lib/docker/volumes中。使用选项,您可以向它传递NFS参数,它甚至会对NFS主机名执行DNS查找(这是NFS通常不具备的)。下面是使用本地卷驱动程序挂载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 # or from the docker run command $ docker run -it --rm \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \ foo # or to create a service $ docker service create \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \ foo # inside a docker-compose file ... volumes: nfs-data: driver: local driver_opts: type: nfs o: nfsvers=4,addr=192.168.1.1,rw device: ":/path/to/dir" ...
如果你在最后使用合成文件的例子,请注意,对卷的更改(例如更新服务器路径或地址)不会反映在现有的命名卷中,只要它们存在。你需要重命名你的卷,或删除它,以允许swarm用新的值重新创建它。我在大多数NFS使用中看到的另一个常见问题是在服务器上启用了“root squash”。当以root身份运行的容器试图将文件写入卷时,这会导致权限问题。您还遇到类似的UID/GID权限问题,其中容器UID/GID需要写入卷的权限,这可能需要在NFS服务器上调整目录所有权和权限。
6g8kf2rb2#
您所问的是一个常见问题。卷数据和卷的功能由卷驱动程序管理。就像您可以使用不同的网络驱动程序(如overlay、bridge或host)一样,您也可以使用不同的卷驱动程序。Docker和Swarm只附带了标准的local驱动程序。它对Swarm没有任何感知,它只会在您的服务任务计划所在的任何节点上为您的数据创建新卷。这通常不是您想要的。您需要一个支持Swarm的第三方驱动程序插件,并确保您为服务任务创建的卷在正确的时间在正确的节点上可用。选项包括使用“Docker for AWS/Azure”及其附带的CloudStor驱动程序,或流行的开源REX-Ray解决方案。有很多第三方卷驱动程序,你可以在Docker Store上找到。
overlay
bridge
host
local
fslejnso3#
我对本地托管群的解决方案是:每个工作节点都安装了一个nfs共享,由/mnt/docker-data上的文件服务器提供。当我在服务组合文件中定义卷时,我将设备设置为/mnt/docker-data下的某个路径,例如:
/mnt/docker-data
volumes: traefik-logs: driver: local driver_opts: o: bind device: /mnt/docker-data/services/traefik/logs type: none
使用这个解决方案,Docker在每个节点上创建卷,服务被部署到并且-令人惊讶的是-已经有数据了,因为它是另一个节点上的卷所使用的相同路径。如果您仔细查看节点文件系统,您会发现到我的文件服务器挂载的挂载是在/var/lib/docker/volumes下创建的,请参见此处:
/var/lib/docker/volumes
root@node-3:~# df -h Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf [...] fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs 194G 141G 53G 73% /var/lib/docker/volumes/traefik_traefik-logs/_data
byqmnocz4#
我针对AWS EFS的解决方案非常有效:
sudo apt-get install -y nfs-common
mkdir efs-test-point sudo chmod go+rw efs-test-point
sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
touch efs-test-point/1.txt sudo umount efs-test-point/ ls -la efs-test-point/
目录必须为空
ls -la efs-test-point/文件1.txt必须存在1.配置Docker-compose. yml文件:
ls -la efs-test-point/
services: sidekiq: volumes: - uploads_tmp_efs:/home/application/public/uploads/tmp ... volumes: uploads_tmp_efs: driver: local driver_opts: type: nfs o: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 device: [YOUR_EFS_DNS]:/
mxg2im7a5#
默认情况下,swarm总是查找本地卷驱动程序,因此最好的方法是1.创建nfs共享,即yum -y install nfs-utils1.将其导出到/etc/exports中,如下所示,/root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)1.打开所需的端口,在我的情况下,我做了下面,firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp1.在Docker worker节点上挂载新创建的共享,然后
yum -y install nfs-utils
/root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
5条答案
按热度按时间icnyk63a1#
群集模式本身不会对卷执行任何不同的操作,它会运行您在运行容器的节点上提供的任何卷装载命令。如果卷装载在该节点的本地,则数据将保存在该节点的本地。没有在节点之间自动移动数据的内置功能。
有一些基于软件的分布式存储解决方案,如GlusterFS、Rook、Ceph和Longhorn,其中许多都专注于与Kubernetes的集成,这对Swarm没有帮助。
通常的结果是,您要么需要管理应用程序内的存储复制(例如etcd和其他基于raft的算法),或者您在外部存储系统上执行装载(希望它本身具有高可用性)。挂载外部存储系统有两个选项,基于数据块或基于文件。(例如EBS)通常具有较高的性能,但仅限于安装在单个节点上。因此,您通常需要一个第三方卷插件驱动程序,以给予Docker节点访问该块存储。基于文件的存储(例如EFS)的性能较低,但可移植性更强,并且可以同时安装在多个节点上,这对于复制服务非常有用。
最常见的基于文件的网络存储是NFS(这和EFS使用的协议是一样的)。而且你可以在没有任何第3方插件驱动程序的情况下挂载它。Docker附带的不幸命名为“本地”卷插件驱动程序给你提供了一个选项,可以将任何你想要的值传递给带有驱动程序选项的mount命令,而没有选项,它默认将卷存储在docker目录/var/lib/docker/volumes中。使用选项,您可以向它传递NFS参数,它甚至会对NFS主机名执行DNS查找(这是NFS通常不具备的)。下面是使用本地卷驱动程序挂载NFS文件系统的不同方法的示例:
如果你在最后使用合成文件的例子,请注意,对卷的更改(例如更新服务器路径或地址)不会反映在现有的命名卷中,只要它们存在。你需要重命名你的卷,或删除它,以允许swarm用新的值重新创建它。
我在大多数NFS使用中看到的另一个常见问题是在服务器上启用了“root squash”。当以root身份运行的容器试图将文件写入卷时,这会导致权限问题。您还遇到类似的UID/GID权限问题,其中容器UID/GID需要写入卷的权限,这可能需要在NFS服务器上调整目录所有权和权限。
6g8kf2rb2#
您所问的是一个常见问题。卷数据和卷的功能由卷驱动程序管理。就像您可以使用不同的网络驱动程序(如
overlay
、bridge
或host
)一样,您也可以使用不同的卷驱动程序。Docker和Swarm只附带了标准的
local
驱动程序。它对Swarm没有任何感知,它只会在您的服务任务计划所在的任何节点上为您的数据创建新卷。这通常不是您想要的。您需要一个支持Swarm的第三方驱动程序插件,并确保您为服务任务创建的卷在正确的时间在正确的节点上可用。选项包括使用“Docker for AWS/Azure”及其附带的CloudStor驱动程序,或流行的开源REX-Ray解决方案。
有很多第三方卷驱动程序,你可以在Docker Store上找到。
fslejnso3#
我对本地托管群的解决方案是:每个工作节点都安装了一个nfs共享,由
/mnt/docker-data
上的文件服务器提供。当我在服务组合文件中定义卷时,我将设备设置为/mnt/docker-data
下的某个路径,例如:使用这个解决方案,Docker在每个节点上创建卷,服务被部署到并且-令人惊讶的是-已经有数据了,因为它是另一个节点上的卷所使用的相同路径。
如果您仔细查看节点文件系统,您会发现到我的文件服务器挂载的挂载是在
/var/lib/docker/volumes
下创建的,请参见此处:byqmnocz4#
我针对AWS EFS的解决方案非常有效:
1.安装nfs-common包:
sudo apt-get install -y nfs-common
1.检查efs是否正常工作:
目录必须为空
ls -la efs-test-point/
文件1.txt必须存在
1.配置Docker-compose. yml文件:
mxg2im7a5#
默认情况下,swarm总是查找本地卷驱动程序,因此最好的方法是
1.创建nfs共享,即
yum -y install nfs-utils
1.将其导出到/etc/exports中,如下所示,
/root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
1.打开所需的端口,在我的情况下,我做了下面,
firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
1.在Docker worker节点上挂载新创建的共享,然后
docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
1.在上面的示例中,我在www.example.com主机上创建了nfshare,并使用/etc/exports文件导出 192.168.1.8 host & exported using /etc/exports file
1.已启动后台进程
systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
1.将fs-r导出到更改生效
1./root/nfshare有我自己的index.html 10.仔细检查卷驱动器条目,它也可以是外部的&哇,它为我工作
1.更多参考https://docs.docker.com/storage/volumes/