docker容器数据持久化存储机制

二、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 1113 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,等各种不同操作系统的计算机提供文件共享和数据备份
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pod️

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

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

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

打赏作者

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

抵扣说明:

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

余额充值