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": ""
  }
]
 
 

最新文章

  1. #VSTS定制#全新的模版定制能力
  2. ThinkPHP讲解(十一)——验证码和文件上传
  3. 将SQL Azure数据库备份到本地SQL Server 2012
  4. LeetCode15 3Sum
  5. Cadence PCB层的概念
  6. 图像处理特征不变算子系列之Moravec算子(一)
  7. hdu2222Keywords Search (特里)
  8. hdu_4787_GRE Words Revenge(在线AC自动机)
  9. tyflow车撞墙测试
  10. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
  11. Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
  12. mysql用户授权、数据库权限管理、sql语法详解
  13. 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)
  14. Jmeter(三十八)while控制器实现ssh三次重连
  15. 剑指offer--2.替换空格
  16. python并发(阻塞、非阻塞、epoll)
  17. Java获取当前运行方法所在的类和方法名
  18. java内存模型知识点汇总
  19. CF1143D/1142A The Beatles
  20. volley2--volley的使用和架构

热门文章

  1. State Threads之编程注意事项
  2. 极光推送报错time_to_live value should be a non-negative integertime_to_live value should be a non-negative integer
  3. JDBC——JDBC基础
  4. zeppelin 无法连接一个已有的standalone模式的spark集群
  5. TensorFlow 学习(6)———TensorFlow运作方式
  6. ORACLE PSU SPU (2015-11-04)
  7. 日志框架之Logger
  8. iOS 应用"无法安装应用程序 因为证书无效"的解决方案
  9. Java Web使用过滤器防止Xss攻击,解决Xss漏洞
  10. [zookeeper]ZooInspector的使用