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. Location of Docker images in all Operating Systems (Linux, Windows, Redhat, Mac OS X)

    原文:http://www.scmgalaxy.com/tutorials/location-of-dockers-images-in-all-operating-systems/ Location ...

  2. 【南工程开源计划】南京工程学院 信息与通信工程学院 课程设计说明书(论文) 宽带接入技术--WLAN接入设计

    文章目录 蓝奏云文件存放地址 一.课程设计目的 二.课程设计要求 三.课程设计网络环境 四.课程设计内容 4.1 WLAN接入设计 4.1.1设计拓扑 4.1.2设计原理 1)WLAN 2)RADIU ...

  3. 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式

    package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...

  4. fiddler过滤指定的请求

    需要过滤的请求如图: 设置过滤: 正则表达式(REGEX:\.(js|css|google|favicon\?.*)+)

  5. Initializer for conditional binding must have Optional type, not 'String'

    今天看到问Swift问题:  Initializer for conditional binding must have Optional type, not 'String' 以前没遇到过这个问题, ...

  6. 3-2 LInux文件管理

    LInux文件管理 文件系统目录结构 Linux中目录结构是有一定的约定的FHS /bin:存放二进制程序 /boot:启动相关 /dev:设备文件 /etc:配置文件 /home:用户家目录 /li ...

  7. caoz的梦呓:信息安全攻防杂谈

    猫宁!!! 参考链接:https://mp.weixin.qq.com/s/O0zLvuWPRPIeqnRooNEFYA 旧文我提过一句话,信息安全防御这事,在业内,三分靠技术,七分靠人脉. 在知识星 ...

  8. Cobalt Strike DLL用于永恒之蓝注入

    PDF下载:blob:https://www.52stu.org/9afe109c-f95f-4cb3-a180-90d469a1d001 我们在对存在MS17010的漏洞主机进行DLL注入的时候,一 ...

  9. php 二维数据排序 排行榜

    php 二维数据排序 排行榜 $rateCount = array(); foreach($groupUsers as $user){ $rateCount[] = $user['rate']; } ...

  10. VBNET 文件信息和目录管理(判断,创建,删除,移动,复制)

    1.判断文件/目录是否存在 Try ' 先判断文件是否存在. If Not File.Exists(TextBox4.Text) Then File.CreateText(TextBox4.Text) ...