Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)

devtools/2024/10/21 3:21:19/

文章目录

    • Docker的数据持久化是什么?
    • 1.数据卷(Data Volumes)
      • 使用Docker 创建数据卷
        • 创建数据卷
        • 创建一个容器,将数据卷挂载到容器中的 /data 目录。
        • 进入容器,查看数据卷内容
        • 停止并重新启动容器,数据卷中的数据仍然存在
        • 再次进入容器,检查文件是否存在
      • 使用 Docker Compose 创建数据卷
        • 编写docker-compose.yml 文件
        • 启动 Docker Compose
        • 进入容器,创建测试文件
        • 停止并重新启动容器,进行测试
        • 再次进入容器,检查文件是否存在
    • 2.挂载主机目录(Bind Mounts)
        • 在主机上创建一个目录,用于挂载到容器
      • 使用Docker
        • 创建一个容器,并将主机目录挂载到容器中。
        • 进入容器,查看挂载目录的内容
        • 容器内,创建一些测试文件
        • 退出容器
        • 在主机上查看挂载目录中的内容
        • 停止并重新启动容器进行测试
        • 进入容器,检查文件是否存在
      • 使用 Docker Compose
        • 编写docker-compose.yml
        • 启动 Docker Compose
        • 进入容器,创建一些测试文件
        • 退出容器
        • 在主机上查看挂载目录中的内容
        • 停止并重新启动容器进行测试
        • 再次进入容器,检查文件是否存在
    • 3.使用数据卷容器(Volumes from Containers)
      • 使用Docker
        • 创建一个数据卷容器
        • 创建另一个容器,并使用 --volumes-from 参数挂载数据卷容器中的数据卷
        • 进入数据卷容器
        • 容器内,创建一些测试文件
        • 退出容器
        • 进入另一个容器
        • 在另一个容器中查看挂载的数据卷
        • 重新启动容器
        • 并检查文件是否存在
      • 使用 Docker Compose
        • 编写一个docker-compose.yml文件
        • 启动
        • 进入数据卷容器,创建一些测试文件
        • 退出容器
        • 进入另一个容器中查看挂载的数据卷
        • 停止并重新启动容器进行测试
        • 再次进入容器,检查文件是否存在
    • 4.NFS(Network File System)挂载
        • 什么是 NFS?
        • 安装并配置 NFS 服务器
      • 使用Docker ,在 Docker 容器中挂载 NFS 共享
        • 创建并启动容器
        • 进入容器
        • 挂载 NFS 共享
        • 容器内检查挂载情况
        • 容器内创建文件
        • 退出容器
        • 在 NFS 服务器上查看挂载目录中的内容
      • 使用 Docker Compose 管理 NFS 挂载
        • 编写docker-compose.yml文件
        • yml文件解释说明
        • 启动 Docker Compose
        • 进入容器,检查挂载情况
    • 5.使用第三方存储解决方案
    • 结语
        • 欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

Docker的数据持久化是什么?

  • 简单理解,就是为了数据安全-不易丢失。
  • 容器运行过程中产生的数据能够被保存下来,即使容器停止或重启后这些数据也不会丢失。

1.数据卷(Data Volumes)

数据卷是一种容器间共享和持久化数据的机制。数据卷直接绕过Union File System,因此对数据卷中的任何变更都会立即生效,不会受到容器内运行程序的影响。
创建数据卷非常简单,可以通过docker volume create命令创建一个新卷,或者在启动容器时通过-v选项指定一个已存在的卷。

使用Docker 创建数据卷

创建数据卷
docker volume create my-data-volume
创建一个容器,将数据卷挂载到容器中的 /data 目录。
docker run -d --name my-container -v my-data-volume:/data nginx:latest
进入容器,查看数据卷内容
docker exec -it my-container bash
停止并重新启动容器,数据卷中的数据仍然存在
docker stop my-container
docker start my-container
再次进入容器,检查文件是否存在
docker exec -it my-container bash
cd /data
cat test.txt

使用 Docker Compose 创建数据卷

dockercomposeyml__38">编写docker-compose.yml 文件
version: '3'services:web:image: nginx:latestvolumes:- my-data-volume:/dataports:- "80:80"volumes:my-data-volume:
启动 Docker Compose
docker-compose up -d
进入容器,创建测试文件
docker exec -it web bash
cd /data
touch test.txt
echo "I am xiaojin." > test.txt
停止并重新启动容器,进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it web bash
cd /data
cat test.txt

2.挂载主机目录(Bind Mounts)

可以将宿主机上的目录挂载到容器内部作为一个数据卷。这种方式下,数据实际上是存储在宿主机上的某个目录中,因此容器删除后数据仍然存在。
使用-v选项可以将宿主机的一个绝对路径目录挂载到容器内的一个绝对路径目录上。

在主机上创建一个目录,用于挂载到容器
mkdir -p /mnt/data

使用Docker

创建一个容器,并将主机目录挂载到容器中。
docker run -d --name my-container \-v /mnt/data:/data \nginx:latest

这里 -v /mnt/data:/data 表示将主机上的 /mnt/data 目录挂载到容器内的 /data 目录。

进入容器,查看挂载目录的内容
docker exec -it my-container bash
容器内,创建一些测试文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在主机上查看挂载目录中的内容
ls -l /mnt/data
cat /mnt/data/test.txt
停止并重新启动容器进行测试
docker stop my-container
docker start my-container
进入容器,检查文件是否存在
docker exec -it my-container bash
cd /data
cat test.txt

使用 Docker Compose

dockercomposeyml_132">编写docker-compose.yml
version: '3'services:web:image: nginx:latestvolumes:- /mnt/data:/dataports:- "80:80"
启动 Docker Compose
docker-compose up -d
进入容器,创建一些测试文件
docker exec -it web bash
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在主机上查看挂载目录中的内容
ls -l /mnt/data
cat /mnt/data/test.txt
停止并重新启动容器进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it web bash
cd /data
cat test.txt

3.使用数据卷容器(Volumes from Containers)

  • 数据卷容器是一种特殊的容器,它主要用于共享数据卷。这种机制允许你在多个容器之间共享数据卷,而不需要显式地创建和管理数据卷。
  • 这种方法是指将一个容器的整个文件系统作为另一个容器的数据卷挂载点。当两个容器共享同一个数据卷容器时,它们之间就可以共享数据。
    通过–volumes-from参数可以实现这一功能。

使用Docker

创建一个数据卷容器

创建 data-container 容器,里边有一个名为 /data 的数据卷。

docker run -d --name data-container -v /data nginx:latest
创建另一个容器,并使用 --volumes-from 参数挂载数据卷容器中的数据卷
docker run -d --name app-container --volumes-from data-container nginx:latest

其中-v /data 表示将数据卷容器 data-container 中的 /data 目录挂载到 app-container 中的相同位置。

进入数据卷容器
docker exec -it data-container bash
容器内,创建一些测试文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
进入另一个容器
docker exec -it app-container bash
在另一个容器中查看挂载的数据卷
cd /data
ls -l
cat test.txt
重新启动容器
docker stop app-container
docker start app-container
并检查文件是否存在
docker exec -it app-container bash
cd /data
cat test.txt

使用 Docker Compose

dockercomposeyml_236">编写一个docker-compose.yml文件
version: '3'services:data-container:image: nginx:latestvolumes:- /dataapp-container:image: nginx:latestvolumes_from:- data-containerports:- "80:80"
启动
docker-compose up -d
进入数据卷容器,创建一些测试文件
docker exec -it data-container bash
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
进入另一个容器中查看挂载的数据卷
docker exec -it app-container bash
cd /data
ls -l
cat test.txt
停止并重新启动容器进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it app-container bash
cd /data
cat test.txt

4.NFS(Network File System)挂载

  • 对于需要跨多台主机共享数据的情况,可以考虑使用NFS来挂载远程服务器上的文件系统作为数据存储位置。这种方式需要在宿主机层面配置NFS客户端,并将NFS共享目录挂载到容器中。
  • 关于非常详细的图文并茂步骤以及讲解,请参考我的另外一篇文章2分钟教会你NFS文件服务器及客户端挂载
什么是 NFS?
  • NFS(Network File System)网络文件系统
  • 目标:实现计算机之间通过网络共享资源
  • 将NFS主机分享的目录,挂载到自己电脑,我们就可以用自己电脑使用NFS的硬盘存储资源
  • 大白话说,就像百度云盘差不多哦~~
安装并配置 NFS 服务器

关于非常详细的安装并配置 NFS 服务器图文并茂步骤以及讲解,请参考我的另外一篇文章2分钟教会你NFS文件服务器及客户端挂载,文中包含以下详细步骤:

  • NFS实现原理是什么?
  • 服务器端(共享硬盘方)安装NFS
  • 安装NFS 和 rpcbind
  • 通过systemctl 设置服务自启动(RPC要先于NFS启动)
  • 查看应用进程(使用 linux 的 ps aux |grep 命令)
  • 验证是否自启动
  • NFS定义共享文件目录
  • 通过/etc/exports文件定义共享目录,vi编辑exports文件,这个步骤一定要使用root权限,否则无法编辑
  • 修改后重启或者 重新加载共享文件列表
  • 查看共享目录
  • 查看NFS服务器共享目录,挂载情况
  • 客户端挂载
  • 客户端环境准备
  • 新建挂载点
  • 挂载
  • 设置开机挂载
  • 将挂载命令加入文件即可
  • 验证挂载

使用Docker ,在 Docker 容器中挂载 NFS 共享

创建并启动容器
  • 假如192.168.1.10 是你的 NFS 服务器,/mnt/nfs 是你的共享目录。
  • 这里 -v /mnt/nfs:/data 表示将 NFS 服务器上的 /mnt/nfs 目录挂载到容器内的 /data 目录
docker run -d --name nfs-container \-v /mnt/nfs:/data \-e NFS_SERVER=192.168.1.10 \-e NFS_PATH=/mnt/nfs \ubuntu:latest
进入容器
docker exec -it nfs-container bash
挂载 NFS 共享
mkdir -p /datamount -t nfs 192.168.1.10:/mnt/nfs /data
容器内检查挂载情况
df -h
容器内创建文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在 NFS 服务器上查看挂载目录中的内容
ls -l /mnt/nfs
cat /mnt/nfs/test.txt

执行后,会发现容器中创建的文件也出现在了 NFS 服务器的共享目录中

使用 Docker Compose 管理 NFS 挂载

dockercomposeyml_364">编写docker-compose.yml文件
version: '3'services:nfs-container:image: ubuntu:latestenvironment:NFS_SERVER: 192.168.1.10NFS_PATH: /mnt/nfsvolumes:- type: bindsource: ${NFS_SERVER}:${NFS_PATH}target: /datacommand: >sh -c "mkdir -p /data && mount -t nfs ${NFS_SERVER}:${NFS_PATH} /data &&tail -f /dev/null"
yml文件解释说明

volumes

  • 定义数据卷
  • type: bind: 指定这是一个绑定挂载。
  • source: N F S S E R V E R : {NFS_SERVER}: NFSSERVER:{NFS_PATH}: 指定源路径为环境变量 NFS_SERVER 和 NFS_PATH 组合而成的 NFS 共享路径。
  • target: /data: 指定目标路径为容器内的 /data 目录。

command

  • 定义容器启动时执行的命令。
  • mkdir -p /data: 创建容器内的 /data 目录(如果不存在)。
  • mount -t nfs N F S S E R V E R : {NFS_SERVER}: NFSSERVER:{NFS_PATH} /data: 将 NFS 共享路径挂载到容器内的 /data 目录。
  • tail -f /dev/null: 让容器持续运行,不立即退出。
启动 Docker Compose
docker-compose up -d
进入容器,检查挂载情况
docker exec -it nfs-container bash
cd /data
ls -l
cat test.txt

5.使用第三方存储解决方案

  • 如Minio, Google Cloud Storage等云存储服务也可以用来持久化存储容器中的数据。这种方式通常用于备份或者需要高可用性的场景。
  • 这种情况使用不太多,这里就不再赘述啦~~小伙伴们可以自由选择

结语

  • 今天就写到这里啦~
  • 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

http://www.ppmy.cn/devtools/122926.html

相关文章

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…

Spring Boot驱动的足球青训俱乐部管理解决方案

1 绪论 1.1研究背景 随着科技的发展,计算机的应用,人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷,网络也遍及到我们生活的每个角落,二十一世纪信息化时代的到来,随着社会科技的不断…

系统架构设计师-论文题(2018年下半年)

1.论软件开发过程RUP及其应用RUP(Rational Unified Process)是IBM公司一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一个普遍…

“衣依”服装销售平台:Spring Boot技术应用与优化

3系统分析 3.1可行性分析 通过对本“衣依”服装销售平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本“衣依”服装销售平台采用JAVA作为开发语言&#xff…

Python知识点:如何使用Edge Impulse与Python进行机器学习模型部署

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 使用Edge Impulse与Python进行机器学习模型部署 在物联网和边缘计算领域&#x…

《Spring Microservices in Action, 2nd Edition》读后总结

总体来说有种时过境迁的感觉,有些章节的内容已经跟不上现在,特别对于云原生大行其道的当下, 越来越多东西下沉到基础设施层,然后应用层尽量轻量化成了一种新趋势;当然任何事物都具有多面性,云原生那套也要投…

无人机单目+激光+IMU复杂弧形(隧道)退化场景SLAM技术详解

无人机在复杂弧形(如隧道)退化场景中的SLAM(同时定位与地图构建)技术,结合单目相机、激光雷达(LiDAR)和惯性测量单元(IMU)时,能够显著提升定位与建图的准确性…

Qt C++设计模式->责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象有机会处理请求,而不需要明确指定哪个对象处理。通过将这些对象连成一条链,请求沿着链传递,直到有对象处理它为止。该模式…