Service 的容器副本会 scale up/down ,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有要管理的数据,那么这些数据应该如何存放呢?
 
选项一:打包在容器里
    显然不行,除非数据不会发生变化,否则,如何在多个副本间保持同步呢
 
选项二:数据放在Docker主机的本地目录中,通过 volume 映射到容器中
    位于同一个主机的副本倒是可以共享这个volume,但是不同主机中的副本该如何同步呢?
 
选项三:利用 Docker 的 volume driver ,由外部的storage provider 管理和提供 volume,所有Docker 主机的volume将挂载到各个副本。
    这是目前最好的方案了,volume 不依赖docker主机和容器,生命周期由storage provider 管理,volume 的高可用和数据有效性也全权由provider负责,Docker只管使用。
 
下面我们以 nfs 来实践第三种方案
 
host01    10.12.31.211    nfs-client
host02    10.12.31.212    nfs-client
host03    10.12.31.213    nfs-client + nfs-server(/var/nfs)
 
安装和配置 nfs-server
 
root@host03:~# apt install -y nfs-kernel-server
root@host03:~# mkdir /var/nfs
root@host03:~# cat /etc/exports
/var/nfs * (rw,sync,no_root_squash)
root@host03:~# systemctl restart nfs-kernel-server.service
 
安装和配置 nfs-client (需要在每台host都创建一遍 volume)
 
root@host01:~# apt install -y nfs-common
root@host01:~# docker volume create --driver local --opt type=nfs --opt o=addr=10.12.31.213,rw --opt device=:/var/nfs volume-nfs
root@host01:~# docker volume ls
DRIVER              VOLUME NAME
local               volume-nfs
 
root@host02:~# apt install -y nfs-common
root@host02:~# docker volume create --driver local --opt type=nfs --opt o=addr=10.12.31.213,rw --opt device=:/var/nfs volume-nfs
root@host01:~# docker volume ls
DRIVER              VOLUME NAME
local               volume-nfs
 
root@host03:~# apt install -y nfs-common
root@host03:~# docker volume create --driver local --opt type=nfs --opt o=addr=10.12.31.213,rw --opt device=:/var/nfs volume-nfs
root@host01:~# docker volume ls
DRIVER              VOLUME NAME
local               volume-nfs
 
 
创建Service 并挂载nfs 的volume,并验证
 
root@host03:~# docker service create --name my_web --publish 80:80 --mount type=volume,source=volume-nfs,destination=/usr/local/apache2/htdocs --replicas 2 httpd
z3ojyj6n5ibpyh4ab49664pvn
overall progress: 2 out of 2 tasks
1/2: running   
2/2: running   
verify: Service converged
 
root@host03:~# cat /var/nfs/index.html
docker swarm nfs volume test
root@host03:~# curl http://10.12.31.211
docker swarm nfs volume test
root@host03:~# curl http://10.12.31.212
docker swarm nfs volume test
root@host03:~# curl http://10.12.31.213
docker swarm nfs volume test
 
root@host03:~# docker service ps my_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
a2v73m955o9j        my_web.1            httpd:latest        host01              Running             Running 4 minutes ago                       
uzdfouv3s2bz        my_web.2            httpd:latest        host02              Running             Running 4 minutes ago
 
root@host01:~# docker exec -it my_web.1.a2v73m955o9js3fbihf0dwei6 cat /usr/local/apache2/htdocs/index.html
docker swarm nfs volume test
root@host01:~# docker volume inspect volume-nfs
[
    {
        "CreatedAt": "2019-05-15T21:11:42+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/volume-nfs/_data",
        "Name": "volume-nfs",
        "Options": {
            "device": ":/var/nfs",
            "o": "addr=10.12.31.213,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
root@host01:~# docker inspect my_web.1.a2v73m955o9js3fbihf0dwei6 | jq .[0].Mounts
[
  {
    "Type": "volume",
    "Name": "volume-nfs",
    "Source": "/var/lib/docker/volumes/volume-nfs/_data",
    "Destination": "/usr/local/apache2/htdocs",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]
 
 
 
root@host02:~# docker exec -it my_web.2.uzdfouv3s2bz0ohyahjeeyqao cat /usr/local/apache2/htdocs/index.html
docker swarm nfs volume test
root@host02:~# docker volume inspect volume-nfs
[
    {
        "CreatedAt": "2019-05-15T21:11:42+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/volume-nfs/_data",
        "Name": "volume-nfs",
        "Options": {
            "device": ":/var/nfs",
            "o": "addr=10.12.31.213,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
root@host02:~# docker inspect my_web.2.uzdfouv3s2bz0ohyahjeeyqao | jq .[0].Mounts
[
  {
    "Type": "volume",
    "Name": "volume-nfs",
    "Source": "/var/lib/docker/volumes/volume-nfs/_data",
    "Destination": "/usr/local/apache2/htdocs",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]
 
 

103、Swarm如何管理存储数据?(Swarm10)的更多相关文章

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

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

  2. Lync Server 2013中央管理存储:自动收集配置数据失败

    Lync Server 2013在安装本地配置存储到配置中央管理存储的本地副本时候提示错如信息:自动收集配置数据失败. 打开Lync Shell,输入Get-CsConfigurationStoreL ...

  3. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

    用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的. 首先: 1.网易新闻用CoreData存储了 ...

  4. MongoDB如何存储数据

    想要深入了解MongoDB如何存储数据之前,有一个概念必须清楚,那就是Memeory-Mapped Files. Memeory-Mapped Files 下图展示了数据库是如何跟底层系统打交道的. ...

  5. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  6. android开发中的5种存储数据方式

    数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...

  7. [ Android 五种数据存储方式之三 ] —— SQLite存储数据

    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...

  8. .net core2.0下使用Identity改用dapper存储数据

    前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...

  9. 一个Web项目中实现多个数据库存储数据并相互切换用过吗?

    最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...

随机推荐

  1. 【编程漫谈】用JAVA画多边形

    一门语言只要带图形库就可以编程画图了,用JAVA画图有两种方式,一是在内存中画好然后生成图片,就可以看到画图的效果了.另一个就是在窗口界面上直接画,可以实时看到程序的运行效果.刚开始学编程的时候,我加 ...

  2. SprintBoot日志

    yml配置 #logging logging.file: "logs/app.log" logging: level: root: debug file: max-size: 10 ...

  3. 3.MapReduce原理和Yarn

    1.MapReduce原理 2.MapReduce执行时间 3.MapReduce开发 4.Yarn

  4. 理解Dubbo

    1.Dubbo应用场景 2.Dubbo支持的协议 3.Dubbo性能比较 4.负载均衡策略 5.容错方案 6.Dubbo vs SpringCloud 7.深入Dubbo需要的技能

  5. Statement、 PreparedStatement 、CallableStatement 区别和联系

    Statement. PreparedStatement .CallableStatement 区别和联系 1. Statement.PreparedStatement和CallableStateme ...

  6. Mysqlfunc.c

    int rc;int db_connection;char *server = "192.168.139.207"; // 数据库的ip地址char *user = "c ...

  7. MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer”,如何解决?

    MongoDB 日志中出现“UserNotFound: Could not find user ceilometer@ceilometer” 问题描述 MongoDB(版本 3.2.9) 服务启动后, ...

  8. padding的计算方法

    转自https://blog.csdn.net/qq_34599526/article/details/83755275 VALID:如果卷积核超出特征层,就不再就计算,即卷积核右边界不超出Featu ...

  9. 【转】Linux curl命令详解

    [From]https://www.cnblogs.com/duhuo/p/5695256.html 命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一 ...

  10. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...