正常停止容器,容器里面的数据会丢失吗?
不会丢失,会保存。保存在/var/lib/volumesz中
可以使用linux命令ls查看,也可以使用docker命令docker volume ls查看
那么,容器如果重启后数据是可以保留的话为什么还需要容器的持久化?
来看看大家的回答吧。
容器数据持久化对应的应用场景是使用容器部署有状态的服务, 这些应用要求的是容器被删除数据不丢失而不仅仅是容器重启后数据不丢失。Docker容器天生设计就是为了应用的运行环境打包,启动,迁移,弹性拓展,所以Docker容器一个最重要的特性就是disposable, 是可以被丢弃处理,稍瞬即逝的。而应用访问的重要数据可不是disposable的,这些重要数据需要持久化的存储保持。容器数据持久化的相关技术就是为了技能保证容器的灵活性原则, 又能兼容有状态服务的数据持久化需求。
总结容器数据持久化好处
- 使容器在删除和重新创建后仍然保存有之前的数据
- 部署有状态的服务
- 保证数据的安全性(将数据备份宿主机或者远程)
- 还可以实现多个docker之间的数据共享
实现数据持久化的方式
一台宿主机上宿主机与容器的共享
- 数据卷(Volumes):数据卷是一种特殊的目录,可以绕过容器文件系统并将数据存储在宿主机上。数据卷可以被一个或多个容器共享,并且在容器之间持久存在。使用数据卷可以方便地备份、恢复和迁移数据。
- 绑定挂载(Bind Mounts):绑定挂载允许将宿主机上的文件或目录直接挂载到容器中。这样,容器可以访问宿主机文件系统中的数据,并且对数据的修改也会反映到宿主机上。
- 命名卷(Named Volumes):命名卷是一种具有名称的数据卷,可以在多个容器之间共享,并且可以方便地管理和使用。通过为卷指定名称,可以在创建容器时直接引用该名称,并且 Docker 会自动创建和管理卷。
- 数据卷容器(Data Volume Containers):数据卷容器是一种特殊类型的容器,用于存储和管理数据卷。其他容器可以通过
--volumes-from
选项挂载这些数据卷容器,从而实现数据的共享和持久化。
实验:一个容器简单使用卷
起一个容器挂载到一个卷(没有会自己创建)
在容器里面存数据会将数据保存到对应的卷中 容器删除后卷里面的数据也被删除了
1.起一个容器,将容器里面/app文件下的所有内容挂载到/var/lib/volumes/myvol2里面
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \ # -->(另一种方式) -v myvol2:/app \
nginx:latest2.进入容器并且在容器的/app里面新建文件
[root@sc-docker volumes]# docker exec -it devtest bash
root@63d773e8dd96:/# ls
app boot docker-entrypoint.d etc lib media opt root sbin sys usr
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
root@63d773e8dd96:/# cd app
root@63d773e8dd96:/app# ls
root@63d773e8dd96:/app# mkdir zhou ---> 在容器中建文件
root@63d773e8dd96:/app# exit
exit
3.在/var/lib/volumes里面查看
[root@sc-docker volumes]# ls
01aa1afcb674fc1d8a8ea4e286019fb83fa2ba634d9aa3881c39ac4e67f76edf backingFsBlockDev zhou
6ef3d6d4cec95c733ca893f7df204bc6628384dcae3bfe795ea37f8d2b0775cc metadata.db
822495a76faac4bdb0d948b00961f4a7b14f32ca0129c8a532c6b38b2ee33b73 myvol2
[root@sc-docker volumes]# cd myvol2/
[root@sc-docker myvol2]# ls
_data
[root@sc-docker myvol2]# cd _data
root@sc-docker _data]# ls --> 查看卷里面
zhou
实验:同一个宿主机里面的不同容器挂载同一个卷
1.创建卷sc并且放置好index.html文件
[root@sc-docker _data]# docker volume create sc
sc
[root@sc-docker _data]# cd ..
[root@sc-docker myvol2]# cd ..
[root@sc-docker volumes]# cd sc
[root@sc-docker sc]# ls
_data
[root@sc-docker sc]# echo "welcome sc" >>index.html
[root@sc-docker sc]# ls
_data index.html
[root@sc-docker sc]# mv index.html ./_data/index.html2.启动两个不同的nginx容器使用卷,将卷与nginx首页文件挂载在一起,暴露容器的5080和5081端口
[root@sc-docker sc]# docker run -d --name zhou-nginx-1 -p 5080:80 -v sc:/usr/share/nginx/html nginx --->/usr/share/nignx/html是nginx网页默认存放目录
ad067aee7eec718b13e06c1f84d39b7a8b4d2b01a8526968b27fe4e2ddabcc33[root@sc-docker sc]# docker run -d --name zhou-nginx-2 -p 5081:80 -v sc:/usr/share/nginx/html nginx
d3de45fb4e882f290b140ee7af349c5307ad6331c4de009aed8b381c2508f291
测试结果:访问本地ip地址的不同端口号
如果是多台机器,背后需要使用NFS、NAS、SAN、云存储等网络存储解决
NFS
优:
搭建服务器非常方便 对硬件要求不高 配置方便
缺:
性能一般,依赖传统的tcp/ip网络 、对带宽有要求 、有丢失数据和卡顿的风险、在局域网里使用
NAS
NAS(Network Attached Storage)网络存储基于标准网络协议实现数据传输,为网络中的Windows / Linux / Mac OS 等各种不同操作系统的计算机提供文件共享和数据备份。
使用传统的网络,实现文件存储和共享
1.需要专业的存储设备
2.使用传统的tcp/ip网络
3.其他的电脑/手机/pad等设备都可以使用
4.支持很多网络传输协议:nfs,ftp,ssh,http等,软硬件结合
优:
存取速度快 数据不丢失 安全性高
缺:
成本高
SAN
使用的是光纤网络
存储区域网络 (Storage Area Network, SAN) 是企业最常用的存储网络架构,要求高吞吐量和低延迟的业务关键型业务往往采用这类架构运行。如今,采用全闪存存储的 SAN 部署数量增速迅猛。与旋转磁盘相比,全闪存存储可提供更出色的性能、稳定一致的低延迟以及更低的总成本。SAN 将数据存储在集中式共享存储中,使企业能够运用一致的方法和工具来实施安全防护、数据保护和灾难恢复。
1.专业的存储服务器
2.专业的光纤交换机
3.HBA卡插到业务服务器上
优:
存取速度快
缺:
成本极高
必须在局域网里,距离比较近的数据集中存储共享
云存储
优:
直接购买,不需要自己搭建 大概率保障不丢失数据
可以保障存取速度 iops
各地服务器都可以使用
缺:
数据存在云里 数据安全性
上面的内容只是粗略介绍,更加详细的介绍请自己再次查阅哦~
实验:搭建nfs实现跨宿主机的容器之间的数据共享
架构图
在192.168.106.134搭建nfs服务器
一.安装软件包
yum install -y nfs-utils
二、启动服务、设置开机启动
[root@nfs-server ~]# systemctl start nfs
[root@nfs-server ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@nfs-server ~]#三、查看rpcbind的端口和进程
[root@nfs-server ~]# ps aux|grep nfs
root 1919 0.0 0.0 0 0 ? S< 17:24 0:00 [nfsd4_callbacks]
root 1925 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1926 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1927 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1928 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1929 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1930 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1931 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1932 0.0 0.0 0 0 ? S 17:24 0:00 [nfsd]
root 1964 0.0 0.0 112824 972 pts/0 S+ 17:25 0:00 grep --color=auto nfs
[root@nfs-server ~]# ss -anplut|grep rpcbind
udp UNCONN 0 0 *:797 *:* users:(("rpcbind",pid=1894,fd=7))
udp UNCONN 0 0 *:111 *:* users:(("rpcbind",pid=1894,fd=6))
udp UNCONN 0 0 [::]:797 [::]:* users:(("rpcbind",pid=1894,fd=10))
udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=1894,fd=9))
tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",pid=1894,fd=8))
tcp LISTEN 0 128 [::]:111 [::]:* users:(("rpcbind",pid=1894,fd=11))
[root@nfs-server ~]#
nfsd进程将监听端口的活外包给了rpcbind进程四、创建nfs共享目录,并且设置好index.html页面内容
[root@nfs-server ~]# mkdir /web
[root@nfs-server ~]# cd /web
[root@nfs-server web]# echo "welcome to sc 123" >index.html
[root@nfs-server web]# ls
index.html
[root@nfs-server web]#五、编辑/etc/exports文件
注意:修改配置文件后需要重新加载配置文件( exportfs -arv)
/web 192.168.106.0/24(rw,sync,all_squash)/web 共享的目录的路径
192.168.106.0/24 允许能访问的机器的网段
(rw,sync,all_squash) 拥有的权限rw 可以读写 sync 在host上修改了数据,里面同步到nfs服务器
all_squash 任何机器上的任何用户连接过来都看成一个普通的用户nobody对待
no_root_squash 只有root用户过来当做root用户对待
让共享目录生效
[root@nfs-server web]# exportfs -av
exporting 192.168.106.0/24:/web
[root@nfs-server web]#六、设置共享目录的权限
共享权限:linux系统里的权限
[root@localhost web]# cat /etc/passwd|grep nfs
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost web]#
[root@nfs-server web]# chown nobody:nobody /web
[root@nfs-server web]# ll -d /web
drwxr-xr-x 2 nobody nobody 24 8月 26 17:28 /web
[root@nfs-server web]#七、关闭防火墙和SELINUX
[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 destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@nfs-server web]# getenforce
Disabled[root@nfs-server web]#
在所有的docker:192.168.106.131、192.168.106.133上面
1.在两台docker上面安装软件
[root@sc-docker _data]# yum install nfs-utils -y
[root@sc-docker2 /]#yum install nfs-utils -y2.新建挂载目录,然后挂载
在docker1上面
[root@sc-docker ~]# mkdir /nfs-web[root@sc-docker ~]# mount 192.168.106.134:/web /nfs-web/
[root@sc-docker ~]# df -Th|grep nfs
192.168.106.134:/web nfs4 17G 1.5G 16G 9% /nfs-web在docker2上面
[root@sc-docker2 ~]# mkdir /nfs-web
[root@sc-docker2 ~]# mount 192.168.106.134:/web /nfs-web/
[root@sc-docker2 ~]# df -Th|grep nfs
192.168.106.134:/web nfs4 17G 1.5G 16G 9% /nfs-web在docker1上面查看是否已经有了nfs挂载点的内容
[root@sc-docker ~]# cd /nfs-web/
[root@sc-docker nfs-web]# ls
index.html
[root@sc-docker nfs-web]# cat index.html
welcome to sc 123[root@sc-docker nfs-web]# mount|grep nfs
192.168.106.134:/web on /nfs-web type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.106.131,local_lock=none,addr=192.168.106.134)在docker2上面查看是否已经有了nfs挂载点的内容
[root@sc-docker2 ~]# cd /nfs-web/
[root@sc-docker2 nfs-web]# ls
index.html
[root@sc-docker2 nfs-web]# cat index.html
welcome to sc 123
[root@sc-docker2 nfs-web]#[root@sc-docker2 nfs-web]# mount|grep nfs
192.168.106.134:/web on /nfs-web type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.106.133,local_lock=none,addr=192.168.106.134)
[root@sc-docker2 nfs-web]#=========
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=<NFS服务器地址>,nolock,soft,rw,sync \
--opt device=:<共享目录全路径> \
<卷名>3.创建一个卷底层挂载到nfs服务器192.168.106.134上的共享目录/web里
[root@sc-docker nfs-web]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.106.134,nolock,soft,rw,sync --opt device=:/web nfs-web-1
nfs-web-1
[root@sc-docker nfs-web]# docker volume ls
DRIVER VOLUME NAME
local 2f1f1ac5ccdde7a9d80e277a974eeb3c2b6ff98b7126349f52caaef0042bbf9f
local 5103a4c07fe6745fba25c88320cc42a385c1e44b9cd461ed6b7be894e77bf357
local b9eeeb4fc5d95a184919ad9dbdb6a329771950a85a98e3729ad911107eb681d4
local nfs-web
local nfs-web-2
local nfs-web-1
local nginx-web[root@sc-docker2 nfs-web]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.106.134,nolock,soft,rw,sync --opt device=:/web nfs-web-1
nfs-web-1
[root@sc-docker2 nfs-web]# docker volume ls
DRIVER VOLUME NAME
local 2f1f1ac5ccdde7a9d80e277a974eeb3c2b6ff98b7126349f52caaef0042bbf9f
local 5103a4c07fe6745fba25c88320cc42a385c1e44b9cd461ed6b7be894e77bf357
local b9eeeb4fc5d95a184919ad9dbdb6a329771950a85a98e3729ad911107eb681d4
local nfs-web
local nfs-web-2
local nfs-web-1
local nginx-web4.查看卷的详细信息
[root@sc-docker nfs-web]# docker volume inspect nfs-web-1
[
{
"CreatedAt": "2022-08-26T18:24:33+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfs-web-1/_data",
"Name": "nfs-web-1",
"Options": {
"device": ":/web",
"o": "addr=192.168.106.134,nolock,soft,rw,sync",
"type": "nfs"
},
"Scope": "local"
}
]
[root@sc-docker nfs-web]#5.创建一个nginx容器使用nfs-web-1卷,将nginx首页文件index.html关联到nfs-web-1上并且启动容器
docker1上面
docker run -d --name zhou-web-1 -p 5588:80 -v nfs-web-1:/usr/share/nginx/html nginx
docker2上面
docker run -d --name zhou-web-1 -p 5588:80 -v nfs-web-1:/usr/share/nginx/html nginx
结果:windows机器上访问两个docker对应宿主机的本地ip地址:5588端口号
在这个实验中,我们采用的是创建一个卷远程挂载在nfs服务器上面,再将启动两个容器使用这个创建好的卷,这个创建好的卷将被保存在每个容器的/var/lib/docker/volumes/nfs-web-1/_data里面。
不知道大家有没有注意到,在这个过程中,我们还建立了容器内部本地挂载点/nfs-web挂载到nfs服务器/web上面,所以当我们对nfs:/web 、docker1: /nfs-web 、docker1:/var/lib/docker/volumes/nfs-web-1/_data、docker 2:/nfs-web、docker2:/var/lib/docker/volumes/nfs-web-1/_data中任意数据修改时,这几个地方都会同步修改。
其实,docker1: /nfs-web、docker 2:/nfs-web这个挂载操作可以不用做的,不过在此演示一下不在docker中是怎样挂载到nfs服务器上面的。