docker swarm NFS架构测试

背景:

打算使用docker swarm,由于跨主机了,所以自然而然的,会面临两个问题,一是网络,二是数据共享。问题1,如果各个主机上的容器,不能相互通信,那会很糟糕。问题2,试想一下,以后在布署服务的时候,起初容器是在主机1(换言之所产生的有用的数据,也在主机1上),然后服务更新了,现在跑到主机2上了,那么主机2上是没有主机上1的数据。试想一下,如果容器是mysql数据库的话,那就好玩了,相当于每重启或者布署一次的话,就是个新库了,这样肯定是不行的。恩,有需求,那就有解决方案。本节只讨论问题2,即,数据共享,NFS。

需要具备的知识

1是docke swarm的安装,以及命令行的使用

2是NFS的服务端的搭建,以及客户端的挂载。

名词解释:

1、部署或启动:是指执行 docker stack deploy -c docker-compose.yml mysql 命令

2、事先创建或者提前创建:是指手工执行 docker volume create 命令创建volume。

docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.3.50,rw \ --opt device=:/share/a22 \ --name a22_volume

3、自动创建:是指volume写在docker-compose.yml里,启动时,将会自动创建volume。

4、自动挂载:是指在NFS客户端里,执行 mount -l | grep 3.50,可以看到已经成功挂载的路径

测试过程

涉及到的机器,

192.168.3.47(Manager,以及NFS客户端),

192.168.3.48( work,以及NFS客户端 ),

192.168.3.49 (work,以及NFS客户端 ),

192.168.3.50(NFS服务端)

3.50,发布的NFS路径


[root@centos7-04 share]# cat /etc/exports
/share/mysql 192.168.3.0/24(rw,async,no_all_squash,no_root_squash)
/share/test 192.168.3.0/24(rw,async,no_all_squash,no_root_squash)
/share/a22 192.168.3.0/24(rw,async,no_all_squash,no_root_squash)
[root@centos7-04 share]# 

[root@centos7-04 share]# exportfs -v
/share/mysql    192.168.3.0/24(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/share/test     192.168.3.0/24(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/share/a22      192.168.3.0/24(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)btree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) 

docker-compose.yml

version: "3.8"
services:
  mysql-01:
    image: mysql:5.7
    #    container_name: mysql-server
    command: --character-set-server=utf8  --interactive_timeout=120 --wait_timeout=120 --log_error_verbosity=1  --collation-server=utf8_bin --sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --lower_case_table_names=1
    ##  --skip-grant-tables
    #    restart: always
    environment:
      - MYSQL_USER=cpp  # 创建用户
      - MYSQL_PASSWORD=Tl12345678!  #用户密码
      - MYSQL_ROOT_PASSWORD=Tl12345678! # ROOT帐号的密码
    ports:
      - 3306:3306
    volumes:
      - mysql:/var/lib/mysql  ####事先创建的volume
      - test:/opt #  ## 事先创建的volume
      - a22:/usr/src/ # 测试事先创建的volume
      - /etc/localtime:/etc/localtime:ro
    networks:
      - cpp_net


networks:
  cpp_net:
    external: true

volumes:
  mysql:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.3.50,nolock,soft,rw"
      device: ":/share/mysql"
  test:
    driver_opts:
      type: "nfs"
      o: "addr=192.168.3.50,nolock,soft,rw"
      device: ":/share/test"
  a22:
    external: true

测试的结论

1、docker stack deploy -c ./docker-compose.yml时,会自动挂载(没有事先创建volume,直接在文件里配置)。通过 mount -l | grep 3.50可以看到。

2、不能想着NFS只发布一级目录,然后docker-compose里,映射时填写一下级目上录,不可以这样做。比如 发布的时候为/data,device里写上"/data/mysql或者其它目录",这样子是不行的。

3、device里选项,猜想只能和 【exportfs -v】里看到的路径一样。所以【不能想着以此为基础,继继写一下级目录】。

4、如果事先创建好volume(即 docker volume create)NFS类型时,docker stack deploy不会自动挂载(即 mount -l | grep 3.50无内容),需要手工挂载(即mount -t nfs 192.168.3.50:/share/mysql /挂载点,挂截点 为docker volume inspect 名称,然后定位到 Mountpoint 属性)。

5、docker-compose.yml里自动创建的volume,会在服务关闭时,自己消失。而手工创建的volume,就算服务关闭,也不会自动消失。

6、NFS架构不可用,docker也不会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值