[docker]十一、docker nfs服务

目录

1、Swarm中使用Volume和NFS服务

1.1、为什么需要nfs服务器?nfs是什么?nfs解决了什么问题?

2、布置一台nfs服务器

2.1、客户机上能否有写的权限要看两种权限

2.2、sync(同步)和async(异步)

2.3、如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?

2.4、实现开机自动挂载

2.5、Create a service which creates an NFS volume(创建NFS卷的服务)

Share data among machines(在机器之间数据共享)

3、负载均衡(load balancing)

3.1、为什么需要负载均衡?

3.2、安装负载均衡

3.2.1、利用脚本编译安装

3.2.2、配置nginx里的负载均衡功能

3.3、负载均衡的方法


注意:本文中使用的机器都是上个文章中提到的,若是想要了解可以看这篇文章

[docker]十、docker swarm是什么?以及创建docker swarm_FanMY_71的博客-CSDN博客

1、Swarm中使用Volume和NFS服务

目的:随便访问任何一台节点服务器上的web服务,看到的页面都是一样的,即满足volume被swarm里的service使用。所有的节点服务器都到同一台文件服务器上拿网页数据就可以了。

这台文件服务器就是nfs服务,另外这台机器里也需要安装docker

1.1、为什么需要nfs服务器?nfs是什么?nfs解决了什么问题?

廉价的解决方法:nfs;有钱的解决方法:san。

1.2、san

1.2.1、san和nfs比较

nfs配置:

  1. 随便一台linux机器,安装nfs服务,就可以进行共享;对磁盘啊、cpu、内存等要求极低
  2. 使用的是传统的tcp/ip网络
  3. 磁盘的性能不是特别的好,没有定制,也没有raid(磁盘阵列),所以磁盘坏了整个服务就G了

现在企业中都不适用nfs,因为nfs很网络不稳定容易丢失数据。

san配置:

  • 通过光纤存储网络,速度快,一次性写入的数据多,容量大
  • 专业的存储服务器
  • HBA卡插到业务服务器上

1.2.2、为什么要使用nfs?不用其他的东西

用nfs主要是为了模拟企业里,所有的服务器到一台集中存放数据的服务器拿数据。nfs是最简单而且廉价的解决方案。不是不想用别的比如san,但是负担不起。

1.3、NAS

NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。

介于nfs和san之间的设备

  •  需要专业的存储设备
  • 使用传统的tcp/ip网络
  • 其他的电脑/手机/pad等设备都是可以使用的

1.4、若是不用nfs,你还可以使用那些方法

2、布置一台nfs服务器

IP:192.168.29.30 主机名:nfs-server 担任角色:nfs server

IP:192.168.29.137 主机名:manager或者nginx-kafka01 担任角色:swarm manager

IP:192.168.29.139 主机名:woker138 担任角色:swarm node1

IP:192.168.29.140 主机名:woker140 担任角色:swarm node2

IP:192.168.29.99 主机名:load-balancer 担任角色:负载均衡

第一步:安装nfs的相关软件

[root@nfs-service ~]# yum install nfs-utils -y  # 这个步骤在所有需要用nfs服务的机器都要安装,但是下面的操作只需要在作为nfs服务的机器上操作就行

第二步:启动nfs-servcer服务

[root@nfs-service ~]# service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
[root@nfs-service ~]# ps aux|grep nfs
root       2980  0.0  0.0      0     0 ?        S<   17:12   0:00 [nfsd4_callbacks]
root       2986  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2987  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2988  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2989  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2990  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2991  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2992  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       2993  0.0  0.0      0     0 ?        S    17:12   0:00 [nfsd]
root       3005  0.0  0.0 112824   988 pts/0    S+   17:13   0:00 grep --color=auto nfs

第三步:编辑/etc/exports文件

# 限制挂载文件的权限
[root@nfs-service web]# cat /etc/exports
/web 192.168.29.0/24(ro,all_squash,sync)
/download 192.168.29.137/24(rw,all_squash,sync)
[root@nfs-service ~]# mkdir /web
[root@nfs-service web]# ls
fan.gif  index.html  myself.jpg  study.html

# 往index.html输入东西能让你觉得这个网页改变了就行

2.1、客户机上能否有写的权限要看两种权限

  • 共享权限。如/etc/exports文件里的权限,例如ro、rw
  • 文件系统里的权限。/web在linux里的权限。远程客户端连接nsf服务器是通过nfsnobody这个用户连接过来的,所以需要给/web授予相应的权限以及将文件改为nfsnobody所属。

第三步:修改/web和/download文件的权限

[root@nfs-service ~]# ll -d /web /download/
drwxr-xr-x. 3 nfsnobody nfsnobody 37 4月  30 16:59 /download/
drwxr-xr-x. 2 nfsnobody nfsnobody 75 5月   1 17:47 /web


[root@nfs-service web]# exportfs -rv  # 刷新输出文件的列表,并输出详细信息

2.2、sync(同步)和async(异步)

sync:当容器往宿主机里文件写东西,会同时往另一台机器的内存和硬盘中写入。这样保证了数据的不丢失。

async:当容器往宿主机里文件写东西,要等到宿主机里的cache缓存满了之后,才会往另一台机器的内存和硬盘中写入。

第四步:建议关闭防火墙和selinux

[root@nfs-server download]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@nfs-server download]# systemctl disable firewalld
[root@nfs-server download]# getenforce 
Disabled

第五步: 在客户机上挂载nfs服务共享的/web和/download目录,manger和woker都要挂载

# 安装nfs-tils软件,方便客户机上挂载,具有了相关命令,例如:showmount
[root@worker138 ~]# yum install nfs-utils -y
# 查看nfs服务器上共享输出了哪些文件夹
[root@worker138 ~]# showmount -e 192.168.29.30
Export list for 192.168.29.30:
/download 192.168.29.140/24
/web      192.168.29.0/24

[挂载nfs服务器上的目录到本机上] 

注意:因为是copy出来的服务器,所以文件内容都是一样的,我们要把除了nfs服务的机器以外的里的/web和/download清空。但是想要本机的/web或者/download文件夹必须存在,或者你用其他的文件夹接收挂载的文件也行。

[root@worker140 web]# mount 192.168.29.30:/web   /web
[root@worker140 web]# mount 192.168.29.30:/download   /download
[root@worker140 web]# df -Th |grep nfs4
192.168.29.30:/web      nfs4       17G  8.1G  9.0G   48% /web
192.168.29.30:/download nfs4       17G  8.1G  9.0G   48% /download
# 若是在/web文件中挂载之后,要退出再进入之后才会显示挂载的内容
[root@worker140 web]# cd ..
[root@worker140 /]# cd -
/web
[root@worker140 web]# ls
fan.gif  index.html  myself.jpg  study.html

注意:所有的docker宿主机都要挂载nfs服务器的/web和/download

[取消挂载]

取消挂载要在不是那个文件夹中取消。例如,我们现在要取消挂载/web

[root@worker138 /]# df -Th|grep web
192.168.29.30:/web      nfs4       17G  8.1G  9.0G   48% /web
[root@worker138 web]# cd /  # 可以是除了/web的任何文件
[root@worker138 /]# umount /web
[root@worker138 /]# df -Th|grep web

2.3、如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?

这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

# exportfs [-aruv]

-a 全部挂载或卸载 /etc/exports中的内容

-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab

-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)

-v 在export的时候,将详细的信息输出到屏幕上。

具体例子:

# exportfs -au 卸载所有共享目录

# exportfs -rv 重新共享所有目录并输出详细信息
 

[root@worker140 web]# mkdir ww   # 这是因为挂载的时候,对/etc/exports里的文件做出权限的限制
mkdir: 无法创建目录"ww": 只读文件系统
[root@worker140 download]# mkdir hello
[root@worker140 download]# ls
hello 

2.4、实现开机自动挂载

第一种方法:修改/etc/rc.local文件

在文件中加入"mount 192.168.29.30:/web /web"

第二种方法:修改/etc/fstab文件

/etc/fstab是linux系统开机会自动根据这个文件里的内容挂载磁盘分区

加入"192.168.29.30:/web  /web  nfs  defaults 0 0"这行代码

192.168.29.30:/web 是挂载的分区,nfs的文件系统;后边这个/web是本地的挂载点;defaults,是挂载选项,使用默认;0,是否支持dump命令进行备份;0,是否开机的时候进行分区的文件系统的检查,分区的文件系统是否有问题

推荐使用第二种方法

2.5、Create a service which creates an NFS volume(创建NFS卷的服务)

NFSv3型

$ docker service create -d \
  --name nfs-service \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
  nginx:latest

NFSv4型

# 这个命令要在manager里边执行,-d,放在后台执行,建议不要放在后台执行
$ docker service create -d \
    --name nfs-service \
    --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async"' \
    --replicas  10  -p 8089:80  nginx:latest

"""
--name,指定名字
source=nfsvolume  docker宿主机上的卷的名字,若是没有可以自己创建,按自己的修改。另外这个卷名字只能使用一次
/app  容器里存放网页的目录,按自己的修改
volume-driver=local  访问本地的某个目录
volume-opt=type=nfs  volume对nfs的支持选项
volume-opt=device=:/var/docker-nfs  是nfs服务器共享的目录
volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async  挂载具体的nfs服务器的IP地址和选项
--replicas  10  副本数量
-p  8089:90 映射端口
"""
# 我执行的代码
[root@manager _data]# docker service create       --name fan-service       --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async"'     --replicas 10 -p 8089:80 nginx:latest
udx5rhb9uy89n1j3vibj9x4j8
[root@manager _data]# docker volume inspect nfsvolume
[
    {
        "CreatedAt": "2022-05-01T17:43:06+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nfsvolume/_data",
        "Name": "nfsvolume",
        "Options": {
            "device": ":/web",
            "o": "addr=192.168.29.30,rw,nfsvers=4,async",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
[root@manager ~]# cd /var/lib/docker/volumes/nfsvolume/_data
[root@manager _data]# ls
fan.gif  index.html  myself.jpg  study.html

[查看在运行的容器]

[root@manager ~]# docker service ps fan-service
ID             NAME             IMAGE          NODE          DESIRED STATE   CURRENT STATE            ERROR    
vvb9sgkpz1wy   fan-service.1    nginx:latest   nfs-service   Running         Running 26 seconds ago            
5woz1nvox22l   fan-service.2    nginx:latest   worker138     Running         Running 24 seconds ago            
q8mdxskerc30   fan-service.3    nginx:latest   manager       Running         Running 27 seconds ago            
5exfmv4lndfl   fan-service.4    nginx:latest   worker138     Running         Running 24 seconds ago            
u930lx73v6g1   fan-service.5    nginx:latest   nfs-service   Running         Running 26 seconds ago            
9w4o6xqi1rry   fan-service.6    nginx:latest   manager       Running         Running 27 seconds ago            
nex07xqefokt   fan-service.7    nginx:latest   nfs-service   Running         Running 26 seconds ago            
y74k2dr0n6t2   fan-service.8    nginx:latest   worker138     Running         Running 24 seconds ago            
zi74iqx5zrfp   fan-service.9    nginx:latest   manager       Running         Running 27 seconds ago            
r1o4b32cx46a   fan-service.10   nginx:latest   worker138     Running         Running 24 seconds ago  

[查看挂载是否成功]

我们在manager和这些node中使用以下命令

[root@worker140 ~]# docker volume inspect nfsvolume1
[
    {
        "CreatedAt": "2022-07-14T21:24:03+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nfsvolume1/_data",
        "Name": "nfsvolume1",
        "Options": {
            "device": ":/web",
            "o": "addr=192.168.29.30,rw,nfsvers=4,async",
            "type": "nfs"
        },
        "Scope": "local"
    }
]

Share data among machines(在机器之间数据共享)

参考官方文献: ​​​​​Use volumes | Docker Documentation

3、NFS的使用方法

IP:192.168.29.30 主机名:nfs-server 担任角色:nfs server

IP:192.168.29.137 主机名:manager或者nginx-kafka01 担任角色:swarm manager

IP:192.168.29.139 主机名:woker138 担任角色:swarm node1

IP:192.168.29.140 主机名:woker140 担任角色:swarm node2

IP:192.168.29.99 主机名:load-balancer 担任角色:负载均衡

3.1、方法一:使用nfs-server

步骤一到五和第2节点的一致,

6、使用通过nfs服务共享的文件

命令:docker service create       --name fan-service       --mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async"'     --replicas 10 -p 8089:80 nginx:latest

source=nfsvolume  --> docker宿主机上的卷的名字

/usr/share/nginx/html -->容器里存放网页的目录

volume-driver=local  --> 访问本地的某个目录的

volume-opt=type=nfs  --> volume对nfs的支持选项

volume-opt=device=:/web --> 是nfs服务器共享目录

volume-opt=o=addr=192.168.29.30,rw,nfsvers=4,async  挂载具体的nfs服务器的ip地址和选项

--replicas 10  副本的数量

nfsvers=4 --> nfs版本

async  --> 异步

[root@ngingx-kafka01 ~]# docker service ps fan-service1 
ID             NAME              IMAGE          NODE             DESIRED STATE   CURRENT STATE           ERROR     PORTS
uh3vxlsj33pa   fan-service1.1    nginx:latest   ngingx-kafka01   Running         Running 2 minutes ago             
4rmusskjajju   fan-service1.2    nginx:latest   ngingx-kafka01   Running         Running 2 minutes ago             
ly9iuhmhpeyr   fan-service1.3    nginx:latest   worker138        Running         Running 2 minutes ago             
6yhr443w7ivz   fan-service1.4    nginx:latest   worker140        Running         Running 2 minutes ago             
m6njajnw2hn0   fan-service1.5    nginx:latest   ngingx-kafka01   Running         Running 2 minutes ago             
jr44r7bv2oki   fan-service1.6    nginx:latest   worker140        Running         Running 2 minutes ago             
satc1bctpaws   fan-service1.7    nginx:latest   worker138        Running         Running 2 minutes ago             
vrlnftc82kl9   fan-service1.8    nginx:latest   worker140        Running         Running 2 minutes ago             
c1lekcy6kunf   fan-service1.9    nginx:latest   worker138        Running         Running 2 minutes ago             
kgox1h6hcniy   fan-service1.10   nginx:latest   worker138        Running         Running 2 minutes ago    

3.2、方法二:使用sshfg共享文件

步骤一到五和第2节点的一致,

6、客户机安装sshfs

yum install sshfs -y

7、挂载nfs-server共享文件

mkdir /download

sshfs root@192.168.29.30:/download /download

mkdir /web

sshfs root@192.168.29.30:/web /web

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FanMY_71

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值