如何在Docker Swarm中使用体积共享
简介
Docker Swarm是一个流行的容器协调平台,允许用户大规模地部署和管理容器。Docker Swarm的主要功能之一是支持卷共享,它允许容器访问和共享存储在持久性卷中的数据。在这篇文章中,我们将解释什么是卷,它们如何在Docker Swarm中使用,并展示在不同场景中如何实现卷共享的例子。
先决条件
- 对Docker和容器化的基本了解
-
熟悉Docker Swarm
-
了解Docker中的体积
-
有使用命令行的经验
什么是Docker Swarm
Docker Swarm是一个用于大规模部署和管理容器化应用程序的工具。它提供了一种简单而有效的方式,在一个节点集群上扩展应用程序。它为构建和维护高可用系统提供了一系列的功能。
要使用Docker Swarm,你需要在你的系统上安装Docker,并创建一个Swarm集群。你可以通过运行以下命令来创建一个Swarm集群 —
$ docker swarm init --advertise-addr 192.145.43.78 --listen-addr 0.0.0.0
输出
Swarm initialized: current node (xi0zolslqrszt94yed0wglxxo) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4phd8znfpiprjuijltfdlz62bq5yghdmwhnpj0rf8f7kyv-bgpelv8wu5n2rzdmexhsc8wvq 192.168.43.97:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这将创建一个单节点的Swarm集群,由当前节点作为管理器。然后,你可以通过在其他节点上运行docker swarm join命令,并指定管理器的IP地址和端口号,向Swarm中添加其他节点。
什么是Docker中的卷
卷是在Docker中存储数据的一种方式,与容器的镜像或文件系统分开。它们可以用来在容器重启之间保持数据,在容器之间共享数据,或在环境之间迁移数据。
在Docker中主要有两种类型的卷 —
- 捆绑式安装
-
volumes
绑定挂载允许你将文件或目录从主机系统挂载到容器中,而卷则由Docker管理,并存储在主机系统的一个单独位置。
要在Docker中创建一个卷,你可以使用docker卷创建命令,像这样 –
$ docker volume create my-volume
输出
my-volume
这个命令将创建一个名为 “my-volume “的新卷,任何容器都可以使用。你也可以创建一个卷,并同时将其挂载到一个容器上,在运行容器时使用-v标志 –
$ docker run -d --name my-container -v my-volume:/container/data Ubuntu
输出
4f463a1c36ce692b973d4590e0f3a2cc738aa8aeda76f619bc14eb07a2bf2231
这个命令将基于Ubuntu镜像创建一个名为 “my-container “的新容器,并将 “my-volume “卷挂载到容器内的/container/data目录。
Docker Swarm是如何实现体积共享的
在Docker Swarm中,卷是由处理卷的创建、管理和移除的卷驱动器或插件来管理的。Docker Swarm内置了一个名为 “local “的卷驱动,它将卷存储在主机系统上,但你也可以使用其他卷驱动,如NFS、GlusterFS或Ceph。
要在Swarm中创建一个卷,你可以使用docker service create命令,像这样—-。
$ docker service create --name my-service --mount type=volume,source=my-volume,target=/usr/local/apache2/htdocs/ httpd
输出
3xhufnsysxmvzbm0p60nwkokd
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
这个命令将基于httpd镜像创建一个名为 “my-service “的新服务,并将 “my-volume “卷挂载到属于该服务的容器内的/usr/local/apache2/htdocs/目录。
您也可以在创建卷的时候指定使用卷的驱动程序,使用`–mount
--mount type=volume,source=my-volume,target=/app/data,volume-driver=nfs
这个选项将使用NFS卷驱动器创建一个卷,它允许你在一个远程NFS服务器上存储卷。
要在Swarm中的多个服务之间共享一个卷,你可以在创建额外的服务时使用-mount标志,并指定相同的卷名和目标路径。例如 –
$ docker service create --name my-service-2 --mount type=volume,source=my-volume,target=/app/data ubuntu
这个命令将创建一个名为 “my-service-2 “的新服务,与 “my-service “服务共享 “my-volume “卷。两个服务中的容器都可以访问和修改卷中的数据。
您也可以使用docker volume inspect命令来查看Swarm中卷的细节,包括它的驱动程序、挂载点和大小。
$ docker volume inspect my-volume
输出
该命令将输出关于 “my-volume “卷的信息,例如以下内容
[{
"CreatedAt": "2022-12-31T00:00:00Z",
"Driver": "local", "Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
"Name": "my-volume",
"Options": {},
"Scope": "local"
}]
Docker Swarm中体积共享的用例
卷共享在Docker Swarm的各种场景中都很有帮助,包括
- 存储持久性数据 – 通过在卷中存储数据,你可以确保在容器停止或移除时数据不会丢失。这种类型对于存储数据库、日志或其他需要长期保留的数据类型很有帮助。
-
在服务之间共享数据 – 通过在多个服务之间共享一个卷,你可以允许它们访问和修改相同的数据。这种类型在共享文件、缓存数据或需要被多个服务访问的其他类型的数据时可能很有帮助。
-
在环境之间迁移数据 – 通过使用支持在远程服务器上存储卷的卷驱动器,你可以轻松地在不同的环境之间迁移数据,例如从开发环境到生产环境。
-
性能 – 取决于卷驱动器和存储后端,卷的性能可能有所不同。例如,使用联网的卷驱动,如NFS,可能会导致比本地卷驱动更慢的性能。
-
数据一致性 – 当多个服务或容器访问和修改卷中的相同数据时,确保数据保持一致和不被破坏是至关重要的。这种一致性可以通过使用适当的锁定机制或指定一个服务作为数据的主要写入者来实现。
结论
在这里,我们解释了卷以及如何在Docker Swarm中使用它们。我们还提供了一些例子,说明卷的共享在不同的情况下是如何发挥作用的。