二、docker容器数据持久化存储机制
1、Docker容器数据持久化存储介绍
-
物理机或虚拟机数据持久化存储
- 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,亦或者也可以通过使用额外的存储系统(NFS、GlusterFS、Ceph等)来完成数据持久化存储。
-
Docker容器数据持久化存储
- 由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。
- 由于Docker容器属于“用后即焚”型计算资源,因此Docker容器不适合做数据持久化存储
2、Docker容器数据持久化存储方式
Docker提供三种方式将数据从宿主机挂载到容器中:
-
docker run -v
- 运行容器时,直接挂载本地目录至容器中
-
volumes
- Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
- 是Docker默认存储数据方式
-
bind mounts
- 将宿主机上的任意位置文件或目录挂载到容器中
- 将宿主机上的任意位置文件或目录挂载到容器中
3、Docker容器数据持久化存储方式应用案例演示
1、docker run -v
1.未挂载本地目录
运行一个容器,未挂载本地目录
[root@mydocker /]# docker run -d -p 8801:80 --name xiaowei-nginx nginx
b576ebcf210f7626d01a5f900d297a2d83ffdb3912d90ee560e223bc75558c05
[root@mydocker /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b576ebcf210f nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:8801->80/tcp, :::8801->80/tcp xiaowei-nginx
[root@mydocker /]#
使用curl命令访问容器xiaowei-nginx
[root@mydocker /]# curl 172.22.69.63:8801
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@mydocker /]#
查看容器中/usr/share/nginx/html目录中目录或子目录
[root@mydocker /]# docker exec -it xiaowei-nginx bash
root@b576ebcf210f:/# cd /usr/share/nginx/html/
root@b576ebcf210f:/usr/share/nginx/html# ls
50x.html index.html
2.bind mounts挂载本地目录
创建本地目录
[root@mydocker /]# mkdir myweb
[root@mydocker /]# cd myweb/
[root@mydocker myweb]# ls
向本地目录中添加index.html文件
[root@mydocker myweb]# echo "hello hello xiaowei">index.html
[root@mydocker myweb]# ls
index.html
[root@mydocker myweb]# cat index.html
hello hello xiaowei
[root@mydocker myweb]#
运行xiaowei-nginx-1容器,把/myweb目录挂载到/usr/share/nginx/html目录中
[root@mydocker myweb]# docker run -d -p 8802:80 --name xiaowei-nginx-1 -v /myweb:/usr/share/nginx/html nginx
a078a4227e51778beb75c20535be82448b26d90c68a1f8307fe9009b73de2a37
[root@mydocker myweb]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a078a4227e51 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8802->80/tcp, :::8802->80/tcp xiaowei-nginx-1
b576ebcf210f nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:8801->80/tcp, :::8801->80/tcp xiaowei-nginx
[root@mydocker myweb]#
使用curl访问容器
[root@mydocker myweb]# curl 172.22.69.63:8802
hello hello xiaowei
[root@mydocker myweb]# echo hello>> index.html
[root@mydocker myweb]# curl 172.22.69.63:8802
hello hello xiaowei
hello
[root@mydocker myweb]#
2、volumes
1.创建数据卷
创建一个名称为nginx-vol的数据卷
[root@mydocker myweb]# docker volume create nginx-vol
nginx-vol
查看已经创建数据卷
[root@mydocker myweb]# docker volume ls
DRIVER VOLUME NAME
local 0ab30679bf7a14a54dfc11ba8a09ef9014f90cd4b3279e49eaea5959dc56f9b0
local nginx-vol
local xiaowei
[root@mydocker myweb]#
查看数据卷详细信息
[root@mydocker myweb]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2022-11-13T16:39:59+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
[root@mydocker myweb]#
确认数据卷创建后的位置
[root@mydocker myweb]# ls /var/lib/docker/volumes/
0ab30679bf7a14a54dfc11ba8a09ef9014f90cd4b3279e49eaea5959dc56f9b0 metadata.db xiaowei
backingFsBlockDev nginx-vol
[root@mydocker myweb]#
向/var/lib/docker/volumes/nginx-vol/_data/添加index.html文件
[root@mydocker myweb]# cd /var/lib/docker/volumes/nginx-vol/_data/
[root@mydocker _data]# ls
[root@mydocker _data]# echo "hello myweb"> index.html
[root@mydocker _data]# ls
index.html
[root@mydocker _data]# cat index.html
hello myweb
[root@mydocker _data]#
2.使用数据卷
[root@mydocker _data]# docker run -d -p 8803:80 --name xiaowei-nginx-2 -v nginx-vol:/usr/share/nginx/html nginx
00047c054995184df8fb9be9197694e9a1038b6414dd251c2bbbfa8552bb5c87
或
[root@mydocker _data]# docker run -d -p 8804:80 --name xiaowei-nginx-3 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
9a229d3ea114b748edf4bba3ec78122d8083ddb6e6d44d88465130ace7c0a30a
使用curl命令访问容器
[root@mydocker _data]# curl 172.22.69.63:8803
hello myweb
[root@mydocker _data]# curl 172.22.69.63:8804
hello myweb
[root@mydocker _data]#
修改index.html文件内容,再次访问
[root@mydocker _data]# echo "nihao"> index.html
[root@mydocker _data]# curl 172.22.69.63:8803
nihao
[root@mydocker _data]# curl 172.22.69.63:8804
nihao
[root@mydocker _data]#
4、搭建NFS服务器
NFS服务:
network file system 网络文件系统: 作用是可以实现多台机器之间的文件共享多台机器之间共享数据
1、服务器端的操作
一.安装软件包
[root@nfs-server ~]# yum install nfs-utils -y
二、启动服务,并设置开机自启
[root@nfs-server ~]# systemctl start nfs
[root@nfs-server ~]# systemctl enable nfs
三、查看rpcbind的端口和nfs进程
[root@nfs-server web]# ps aux | grep nfs
root 1113 0.0 0.0 0 0 ? S< 16:57 0:00 [nfsd4_callbacks]
root 1118 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1119 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1120 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1121 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1123 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1124 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1125 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1127 0.0 0.0 0 0 ? S 16:57 0:00 [nfsd]
root 1510 0.0 0.0 112824 972 pts/0 S+ 17:19 0:00 grep --color=auto nfs
[root@nfs-server web]# ss -anplut | grep rpcbind
udp UNCONN 0 0 *:111 *:* users:(("rpcbind",pid=690,fd=6))
udp UNCONN 0 0 *:856 *:* users:(("rpcbind",pid=690,fd=7))
udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=690,fd=9))
udp UNCONN 0 0 [::]:856 [::]:* users:(("rpcbind",pid=690,fd=10))
tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",pid=690,fd=8))
tcp LISTEN 0 128 [::]:111 [::]:* users:(("rpcbind",pid=690,fd=11))
[root@nfs-server web]#
rpcbind和nfs的关系
nfsd进程将监听端口的活外包给了rpcbind进程
四、创建nfs共享目录
[root@nfs-server ~]# mkdir /web
[root@nfs-server ~]# cd /web
[root@nfs-server web]# echo "welcome to sanchuang changsha nongda" >index.html
[root@nfs-server web]# ls
index.html
[root@nfs-server web]#
五、编辑/etc/exports文件 **修改配置文件需要重新加载配置文件( exportfs -arv)
/web 192.168.1.0/24(rw,sync,all_squash)
/web 共享的目录的路径
192.168.17.0/24 允许能访问的机器的网段
(rw,sync,all_squash) 拥有的权限 rw 可以读写 sync 在host上修改了数据,里面同步到nfs服务器
all_squash 任何机器上的任何用户连接过来都看成一个普通的用户nobody对待
[root@nfs-server web]# cat /etc/exports
/web 192.168.17.0/24(rw,sync,all_squash)
[root@nfs-server web]# exportfs -av 让共享目录生效
exporting 192.168.17.0/24:/web
六.设置共享目录的权限
[root@nfs-server web]# chown nfsnobody:nfsnobody /web
[root@nfs-server web]# ll -d /web/
drwxr-xr-x. 2 nfsnobody nfsnobody 24 11月 13 17:21 /web/
[root@nfs-server web]#
七、关闭防火墙
[root@nfs-server web]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@nfs-server web]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@nfs-server web]# getenforce
Disabled
[root@nfs-server web]#
2、客户端的操作
一、安装软件
[root@docker-one /]# yum install nfs-utils -y
[root@docker-two /]# yum install nfs-utils -y
二、新建挂载目录,然后挂载
[root@docker-one /]# mkdir /nfs-web -p
[root@docker-one /]# cd /nfs-web/
[root@docker-one nfs-web]# mount 192.168.17.146:/web /nfs-web/
[root@docker-two /]# mkdir /nfs-web -p
[root@docker-two /]# cd /nfs-web/
[root@docker-two nfs-web]# mount 192.168.17.146:/web /nfs-web/
三、查看是否挂载成功,并查看挂载效果
[root@docker-one nfs-web]# df -Th | grep nfs
192.168.17.146:/web nfs4 17G 1.7G 16G 10% /nfs-web
[root@docker-one nfs-web]# mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
192.168.17.146:/web on /nfs-web type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.17.143,local_lock=none,addr=192.168.17.146)
[root@docker-one nfs-web]#
[root@docker-two nfs-web]# df -Th|grep nfs
192.168.17.146:/web nfs4 17G 1.7G 16G 10% /nfs-web
[root@docker-two nfs-web]# mount | grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
192.168.17.146:/web on /nfs-web type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.17.145,local_lock=none,addr=192.168.17.146)
[root@docker-two nfs-web]#
四、查看index.html文件的内容
[root@docker-one nfs-web]# cat index.html
welcome to sanchuang changsha nongda
[root@docker-one nfs-web]#
[root@docker-two nfs-web]# cat index.html
welcome to sanchuang changsha nongda
[root@docker-two nfs-web]#
效果完成,内容和nfs机器中的内容相同。
服务器修改index.html,会立马同步到两台客户机。
[root@nfs-server web]# echo "123" >> index.html
[root@nfs-server web]# cat index.html
welcome to sanchuang changsha nongda
123
[root@nfs-server web]#
[root@docker-two nfs-web]# cat index.html
welcome to sanchuang changsha nongda
123
[root@docker-two nfs-web]#
[root@docker-one nfs-web]# cat index.html
welcome to sanchuang changsha nongda
123
[root@docker-one nfs-web]#
3、创建一个容器共享nfs-server中/web目录
1、直接挂载目录
直接挂载目录客户机的/nfs-web即可共享nfs-server中/web目录
docker run -d -p 8809:80 -v /nfs-web:/usr/share/nginx/html --name xiaowei-nginx nginx
2、使用卷进行挂载
docker volume create --driver local
–opt type=nfs
–opt o=addr=<NFS服务器地址>,nolock,soft,rw,sync
–opt device=:<共享目录全路径>
<卷名>
一、创建卷
[root@docker-one /]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.17.146,nolock,soft,rw,sync --opt device=:/web nfs-web-6
nfs-web-6
[root@docker-one /]# docker volume ls
DRIVER VOLUME NAME
local 7dcbe8447d76d4dcd1b3b6401dea41e986657094166c63d3e8ba33f02066c24b
local 7e2ac2c847772725234bb937c3916abf1934be16f04b7e566a687564056cd01b
local 4570f0555c2ab49c9448b0712e917d4509f1d2e8fee91b14bbf9f405a369421d
local a79d94afd6f7e282d709a61ad672f53cff85d2f61df574e893b1e60698da2c34
local nfs-web-6
local nginx-web
[root@docker-two /]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.17.146,nolock,soft,rw,sync --opt device=:/web nfs-web-6
nfs-web-6
[root@docker-two /]# docker volume ls
DRIVER VOLUME NAME
local nfs-web-6
二、查看卷的休息信息
[root@docker-one /]# docker volume inspect nfs-web-6
[
{
"CreatedAt": "2022-11-13T17:57:45+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfs-web-6/_data",
"Name": "nfs-web-6",
"Options": {
"device": ":/web",
"o": "addr=192.168.17.146,nolock,soft,rw,sync",
"type": "nfs"
},
"Scope": "local"
}
]
三、创建容器使用卷
[root@docker-one /]# docker run -d -p 8818:80 -v nfs-web-6:/usr/share/nginx/html --name xiaowei-nginx nginx
38d12b9c22f3ada56208281544b0f39d24ee93a2a63de410afacf95a23db7e5f
[root@docker-one /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38d12b9c22f3 nginx "/docker-entrypoint.…" 10 seconds ago Up 8 seconds 0.0.0.0:8818->80/tcp, :::8818->80/tcp xiaowei-nginx
[root@docker-one /]# curl 192.168.17.143:8818
welcome to sanchuang changsha nongda
123
[root@docker-one /]#
5、NFS、SAN和NAS
使用nfs来实现文件共享解决方案是比价low的,是最廉价的解决方案
1、随便一台linux服务器,安装nfs服务,可以共享数据,对磁盘,cpu,内存要求极低,
2、使用的是传统的TCP/IP网络,容易受网络状况影响
3、nfs在网络不稳定的情况下,很容易丢失数据
存储区域网络(Storage Area Network ): SAN
存储区域网络 (Storage Area Network, SAN) 是企业最常用的存储网络架构,要求高吞吐量和低延迟的业务关键型业务往往采用这类架构运行。如今,采用全闪存存储的 SAN 部署数量增速迅猛。与旋转磁盘相比,全闪存存储可提供更出色的性能、稳定一致的低延迟以及更低的总成本。SAN 将数据存储在集中式共享存储中,使企业能够运用一致的方法和工具来实施安全防护、数据保护和灾难恢复
网络附加存储 (Network Attached Storage):NAS
网络存储基于标准网络协议实现数据传输,为网络中的windows,linux,mac os,等各种不同操作系统的计算机提供文件共享和数据备份