背景:
打算使用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也不会报错