docker -- 数据持久化之卷的使用(四)

本文围绕Docker容器数据持久化展开,先解答正常停止容器数据不会丢失,但部署有状态服务仍需持久化。接着介绍一台宿主机上宿主机与容器共享数据的方式,如数据卷、绑定挂载等,并给出实验示例。还提及多台机器需用NFS、NAS等网络存储,最后展示搭建NFS实现跨宿主机容器数据共享的实验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常停止容器,容器里面的数据会丢失吗?

不会丢失,会保存。保存在/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:latest

2.进入容器并且在容器的/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.html

2.启动两个不同的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               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]#

在所有的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 -y

2.新建挂载目录,然后挂载

在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-web

4.查看卷的详细信息
[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服务器上面的。

为了安装Redis并使用Docker Compose进行持久化,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了DockerDocker Compose。如果还没有安装,您可以参考中提供的命令来安装。 2. 创建一个目录来存储Redis的持久化文件和配置文件。您可以使用以下命令来创建所需的目录: ``` mkdir -p /root/redis/data /root/redis/conf ``` 3. 在您的项目中创建一个docker-compose.yml文件,并在该文件中添加以下内容来配置Redis的容器: ```yaml version: '3' services: redis: image: redis container_name: health_redis restart: always command: redis-server /usr/local/etc/redis/redis.conf ports: - 6399:6379 expose: - 6379 volumes: - ./redis.conf:/usr/local/etc/redis/redis.conf - ./redis_data/:/data/ ``` 4. 将您的自定义Redis配置文件(redis.conf)放置在与docker-compose.yml文件相同的目录中。确保在docker-compose.yml文件中的volumes部分将配置文件映射到容器中。 5. 最后,使用以下命令在后台启动Redis容器,并确保它以持久化方式运行: ``` docker-compose --compatibility up -d ``` 这样,您就成功安装了Redis,并使用Docker Compose进行了持久化配置。您的数据将存储在宿主机的redis_data目录中,并且Redis容器将在后台持续运行以保持数据持久化。请确保您的项目目录中包含了正确的redis.conf配置文件,并根据需要进行相应的自定义配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [docker-compose 安装 Redis 6.X 配置远程连接,持久化RDB AOF](https://blog.youkuaiyun.com/weixin_40461281/article/details/111291847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [docker-compose 持久化redis](https://blog.youkuaiyun.com/myth_g/article/details/86096568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值