如何在 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 中主要有两种类型的卷:
绑定挂载
卷
绑定挂载允许您将主机系统上的文件或目录挂载到容器中,而卷由 Docker 管理并存储在主机系统上的单独位置。
要创建 Docker 中的卷,您可以使用 docker volume create 命令,如下所示:
$ 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 的各种场景中都很有用,包括:
存储持久数据 - 通过将数据存储在卷中,您可以确保在容器停止或删除时不会丢失数据。此类型对于存储数据库、日志或需要长期保留的其他数据类型很有用。
在服务之间共享数据 - 通过在多个服务之间共享卷,您可以允许它们访问和修改相同的数据。此类型对于共享文件、缓存数据或需要多个服务访问的其他类型的数据很有用。
在环境之间迁移数据 - 通过使用支持在远程服务器上存储卷的卷驱动程序,您可以轻松地在不同的环境之间迁移数据,例如从开发环境到生产环境。
在 Docker Swarm 中使用卷共享时,还有一些挑战和注意事项需要牢记,例如:
性能 - 根据卷驱动程序和存储后端,卷性能可能会有所不同。例如,使用 NFS 等网络卷驱动程序可能会导致比本地卷驱动程序更慢的性能。
数据一致性 - 当多个服务或容器访问和修改卷中的相同数据时,务必确保数据保持一致且不会损坏。可以通过使用适当的锁定机制或将单个服务指定为数据的主要写入器来实现这种一致性。
结论
在这里,我们解释了卷以及它们如何在 Docker Swarm 中使用。我们还提供了卷共享如何在不同场景中发挥作用的示例。