service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢?
选项一:打包在容器里。
显然不行。除非数据不会发生变化,否则,如何在多个副本直接保持同步呢?
选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里。
位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢?
选项三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,所有 Docker 主机 volume 将挂载到各个副本。
这是目前最佳的方案。volume 不依赖 Docker 主机和容器,生命周期由 storage provider 管理,volume 的高可用和数据有效性也全权由 provider 负责,Docker 只管使用。
我们将以 Rex-Ray 为例来实践第三种方案。
Rex-Ray
Rex-Ray 是开源的容器存储管理解决方案。支持主流的容器编排引擎 Docker Swarm、 Kubernetes 和 Mesos,为容器集群提供自动化的存储编排功能。
在《每天5分钟玩转Docker容器技术》的数据管理章节中已经详细讨论了 Rex-Ray 如何跨 Docker 主机管理 data volume,本节内容也是建立在这些基础知识之上。为节省篇幅,建议大家先阅读这些内容,然后回到这里继续实践。
我们将在部署如下的 Rex-Ray 实验环境:
-
swarm 中的所有 node 都安装部署 Rex-Ray。
-
Rex-Ray 使用 VirtualBox backend。
-
具体的安装部署方法请参考前面 Docker 数据管理章节,这里不再赘述。
实践
接下来,我们将:
-
创建 httpd 服务,并使用 Rex-Ray data volume。
-
修改 volume 中的数据,并验证更新同步到所有副本。
-
验证 failover 发生时,更新的数据不会丢失。
创建 service
执行如下命令:
docker service create --name my_web \
--publish 8080:80 \
--mount "type=volume,volume-driver=rexray,source=web_data,target=/usr/local/apache2/htdocs" \
httpd
-
--mount
指定数据卷的volume-driver
为rexray
。 -
source
指定数据卷的名字为web_data
,如果不存在,则会新建。 -
target
指定将数据卷 mount 到每个副本容器的/usr/local/apache2/htdocs
,即存放静态页面的目录。

访问 service:
权限有些问题,需要进容器修改 /usr/local/apache2/htdocs 的权限。
service 已经可以访问了:
当前 Rex-Ray volume web_data
被挂载到 node swarm-worker1
。
mount 到 /var/lib/libstorage/volumes/web_data/data
目录。
通过 docker inspect my_web.1.2j7dgzuyk9hodseej707t97su
可以确认 /var/lib/libstorage/volumes/web_data/data
已经映射到容器目录 /usr/local/apache2/htdocs
当前的实验环境如图所示:
下一节我们验证在故障情况 Volume 的持久性。
书籍:
1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义