Docker Swarm可以管理两种类型的存储:
volume
和 bind
尽管bind
Docker文档未建议这样做,因为它在本地目录(在每个群集节点上)与任务之间创建了绑定,volume
但未提及实现,因此我不了解如何在任务之间共享卷?
- Docker Swarm如何在节点之间共享卷?
- 卷保存在哪里(在一个管理器上?如果有多个管理器?)
- 如果节点在不同网络上的不同计算机上运行,节点之间是否没有问题?
- 它会创建VPN吗?
Docker Swarm可以管理两种类型的存储:
volume
和 bind
尽管bind
Docker文档未建议这样做,因为它在本地目录(在每个群集节点上)与任务之间创建了绑定,volume
但未提及实现,因此我不了解如何在任务之间共享卷?
Answers:
您要问的是一个常见问题。卷数据和该卷可以执行的功能由卷驱动程序管理。就像你可以使用不同的网络驱动器一样overlay
,bridge
或者host
,你可以用不同的音量驱动程序。
Docker和Swarm仅随附标准local
驱动程序。它对Swarm没有任何了解,它只会在计划服务任务的任何节点上为您的数据创建新卷。这通常不是您想要的。
您需要一个Swarm感知的第三方驱动程序插件,并确保您在适当的时间在正确的节点上为服务任务创建的卷可用。选项包括使用“适用于AWS / Azure的Docker”及其随附的CloudStor驱动程序,或流行的开源REX-Ray解决方案。
有许多第三方音量驱动程序,您可以在Docker Store上找到它们。
Swarm Mode本身对卷没有任何不同,它在容器运行所在的节点上运行您提供的任何Volume Mount命令。如果您的卷安装在该节点本地,那么您的数据将本地保存在该节点上。没有内置的功能可以在节点之间自动移动数据。
有一些基于软件的分布式存储解决方案,例如GlusterFS,而Docker拥有一个名为Infinit的解决方案,该解决方案尚未实现GA,其开发已经使EE中的Kubernetes集成退居二线。
典型的结果是您需要管理应用程序内存储的复制(例如,etcd和其他基于筏的算法),或者在外部存储系统上执行挂载(希望使用其自己的HA)。挂载外部存储系统有两个选项,基于块或文件。基于块的存储(例如EBS)通常具有更高的性能,但仅限于安装在单个节点上。为此,您通常将需要一个第三方卷插件驱动程序,以使您的Docker节点可以访问该块存储。基于文件的存储(例如EFS)性能较低,但具有更高的可移植性,并且可以同时安装在多个节点上,这对于复制服务很有用。
最常见的基于文件的网络存储是NFS(这与EFS使用的协议相同)。而且您可以安装它而无需任何第三方插件驱动程序。Docker附带的不幸的是命名为“本地”的卷插件驱动程序,提供了将驱动程序选项所需的任何值传递给mount命令的选项,并且没有选项,它默认将卷存储在docker目录/ var / lib /中。码头工人/卷。使用选项,您可以向其传递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"
...
如果最后使用组合文件示例,请注意,对卷的更改(例如,更新服务器路径或地址)只要存在就不会反映在现有命名卷中。您需要重命名卷或将其删除,以允许群集使用新值重新创建它。
我在大多数NFS使用中看到的另一个常见问题是在服务器上启用了“ root squash”。当以root用户身份运行的容器尝试将文件写入卷时,这会导致权限问题。您还遇到类似的UID / GID权限问题,其中容器UID / GID是需要写入卷的权限的容器,这可能需要目录所有权和权限才能在NFS服务器上进行调整。
我的适用于AWS EFS的解决方案有效:
安装nfs-common软件包:
sudo apt-get install -y nfs-common
检查您的ef是否有效:
mkdir efs测试点 须藤chmod go + rw efs-test-point
须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
触摸efs-test-point / 1.txt 须藤umount efs-test-point / ls -la efs-test-point /
目录必须为空
须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
ls -la efs-test-point/
文件1.txt必须存在
配置docker-compose.yml文件:
服务: sidekiq: 数量: -uploads_tmp_efs:/ home / application / public / uploads / tmp ... 数量: uploads_tmp_efs: 司机:本地 driver_opts: 类型:nfs o:addr = [YOUR_EFS_DNS],nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2 设备:[YOUR_EFS_DNS]:/
对于本地托管的群集,我的解决方案是:每个工作程序节点都挂载了一个nfs共享,该共享由文件服务器在上提供/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
,请参见此处:
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