如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

时间:2022-08-30 17:07:17

从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。

无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器。

有状态是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器。

简单来讲,状态(state)就是数据,如果容器需要处理并存储数据,它就是有状态的,反之则无状态。

对于有状态的容器,如何保存数据呢?

前面在 Docker 存储章节我们学习到 data volume 可以存储容器的状态,不过当时讨论的 volume 其本质是 Docker 主机 本地 的目录。

本地目录就存在一个隐患:如果 Docker Host 宕机了,如何恢复容器?

一个办法就是定期备份数据,但这种方案还是会丢失从上次备份到宕机这段时间的数据。更好的方案是由专门的 storage provider 提供 volume,Docker 从 provider 那里获取 volume 并挂载到容器。这样即使 Host 挂了,也可以立刻在其他可用 Host 上启动相同镜像的容器,挂载之前使用的 volume,这样就不会有数据丢失。

本章将详细讨论如何实现跨 Docker 主机管理 data volume。

从一个例子开始

假设有两个 Dokcer 主机,Host1 运行了一个 MySQL 容器,为了保护数据,data volume 由 storage provider 提供,如下图所示。

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

当 Host1 发生故障,我们会在 Host2 上启动相同的 MySQL 镜像,并挂载 data volume。

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

Docker 是如何实现这个跨主机管理 data volume 方案的呢?

答案是 volume driver。

任何一个 data volume 都是由 driver 管理的,创建 volume 时如果不特别指定,将使用 local 类型的 driver,即从 Docker Host 的本地目录中分配存储空间。如果要支持跨主机的 volume,则需要使用第三方 driver。

目前已经有很多可用的 driver,比如使用 Azure File Storage 的 driver,使用 GlusterFS 的 driver,完整的列表可参考 https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

我们这里将选择 Rex-Ray driver,其原因是:

  1. Rex-Ray 是开源的,而且社区活跃。

  2. 支持多种 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。

  3. 支持多种操作系统,Ubuntu、CentOS、RHEL 和 CoreOS。

  4. 支持多种容器编排引擎,Docker Swarm、Kubernetes 和 Mesos。

  5. Rex-Ray 安装使用方法非常简单。

下一节我们开始实践 Rex-Ray。

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)的更多相关文章

  1. Weave Scope 多主机监控 - 每天5分钟玩转 Docker 容器技术(81)

    除了监控容器,Weave Scope 还可以监控 Docker Host. 点击顶部 HOSTS 菜单项,地图将显示当前 host. 与容器类似,点击该 host 图标将显示详细信息. host 当前 ...

  2. 一张表搞懂各种 Docker 监控方案 - 每天5分钟玩转 Docker 容器技术(86)

    前面我们已经介绍了ps/top/stats.Sysdig.Weave Scope.cAdvisor 和 Prometheus 多种容器监控工具和方案,是时候做一个比较了.下面将从五个方面来对比它们之间 ...

  3. 【Docker】(9)---每天5分钟玩转 Docker 容器技术之镜像

    镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器.为什么我们要讨论镜像的内部结构? 如果只是使用镜像,当然不需要了解,直接通过 docker 命令下载和运行就可以了. 但如 ...

  4. docker managed volume - 每天5分钟玩转 Docker 容器技术(40)

    docker managed volume 与 bind mount 在使用上的最大区别是不需要指定 mount 源,指明 mount point 就行了.还是以 httpd 容器为例: 我们通过 - ...

  5. Docker 镜像小结 - 每天5分钟玩转 Docker 容器技术(21)

    本节我们对 Docker 镜像做个小结. 这一部分我们首先讨论了镜像的分层结构,然后学习了如何构建镜像,最后实践使用 Docker Hub 和本地 registry. 下面是镜像的常用操作子命令: i ...

  6. 跨主机使用 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(77)

    上一节我们在 docker1 上的 MySQL 容器中使用了 Rex-Ray volume mysqldata,更新了数据库.现在容器已经删除,今天将演示在 docker2 中重新使用这个卷. 在 d ...

  7. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...

  8. 验证 Swarm 数据持久性 - 每天5分钟玩转 Docker 容器技术(104)

    上一节我们成功将 Rex-Ray Volume 挂载到了 Service.本节验证 Failover 时,数据不会丢失. Scale Up 增加一个副本: docker service update ...

  9. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

    在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这 ...

  10. 如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)

    Rex-Ray 是一个优秀的 Docker volume driver,本节将演示其安装和配置方法. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很简单, ...

随机推荐

  1. SVN常用问题汇总

    参考文档.http://www.cnblogs.com/newsea/archive/2012/04/28/2474818.html 1.客户端取消记住用户名和密码. 2.汉化后设置为中文

  2. java-Date、String、Calendar转化

    1.Calendar 转化 String //获取当前时间的具体情况,如年,月,日,week,date,分,秒等 Calendar calendat = Calendar.getInstance(); ...

  3. Linux下安装setup tools小工具

    1, 最小化的linux系统(centos\redhat)默认都是没有安装setup图形小工具的,你输入setup命令会提示 command not found . 如果要使用这个命令安装方法 1.安 ...

  4. Matlab代码备忘

    1.Matlab写入文件  set(hp1,'xdata',bbb(1,:),'ydata',bbb(2,:),'zdata',bbb(3,:)); M=size(bbb,2); name=strca ...

  5. 函数参数选项的处理getopt getopt_long getopt_long_only

    转载:http://blog.chinaunix.net/uid-20321537-id-1966849.html   在头文件中int getopt(int argc,char *argv[], c ...

  6. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  7. spark2&period;1操作json(save&sol;read)

    建筑物配置信息: case class BuildingConfig(buildingid: String, building_height: Long, gridcount: Long, gis_d ...

  8. go的基本数据类型

    一,数据类型的介绍 在go语言中,数据类型是用于声明函数和变量的:数据类型是为了把数据分成所需内存不同大小的数据,除了在需要使用大数据的时候才会申请大内存,这样就会充分的使用内存 Go 语言按类别有以 ...

  9. 背水一战 Windows 10 &lpar;100&rpar; - 应用间通信&colon; 分享

    [源码下载] 背水一战 Windows 10 (100) - 应用间通信: 分享 作者:webabcd 介绍背水一战 Windows 10 之 应用间通信 分享 示例1.本例用于演示如何开发一个分享的 ...

  10. Git基本命令 -- 历史

    历史. 收先需要了解一下git log命令, 使用git的帮助看看: git help log: 执行该命令后, 我的win10弹出来一个html页面, 里面是git log命令的帮助: 首先看看gi ...