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

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

目录
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 创建数据卷
编写docker-compose.yml 文件
version: '3'

services:
web:
image: nginx:latest
volumes:

  - my-data-volume:/data
ports:
  - "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
编写docker-compose.yml
version: '3'

services:
web:
image: nginx:latest
volumes:

  - /mnt/data:/data
ports:
  - "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
编写一个docker-compose.yml文件
version: '3'

services:
data-container:
image: nginx:latest
volumes:

  - /data

app-container:
image: nginx:latest
volumes_from:

  - data-container
ports:
  - "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 /data

mount -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 挂载
编写docker-compose.yml文件
version: '3'

services:
nfs-container:
image: ubuntu:latest
environment:
NFS_SERVER: 192.168.1.10
NFS_PATH: /mnt/nfs
volumes:

  - type: bind
    source: ${NFS_SERVER}:${NFS_PATH}
    target: /data
command: >
  sh -c "mkdir -p /data && 
         mount -t nfs ${NFS_SERVER}:${NFS_PATH} /data &&
         tail -f /dev/null"

yml文件解释说明
volumes

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

定义容器启动时执行的命令。
mkdir -p /data: 创建容器内的 /data 目录(如果不存在)。
mount -t nfs ${NFS_SERVER}😒{NFS_PATH} /data: 将 NFS 共享路径挂载到容器内的 /data 目录。
tail -f /dev/null: 让容器持续运行,不立即退出。
启动 Docker Compose
docker-compose up -d
进入容器,检查挂载情况
[kod.xinanfuzhuang.com)
[kod.youmishiguang.com)
[kod.yts9.com)
[kod.jersey8.com)
[kod.economistbook.com)
[kod.ibcgj.com)
[kod.caihui315.com)
[kod.dddpb.com)
docker exec -it nfs-container bash
cd /data
ls -l
cat test.txt
5.使用第三方存储解决方案
如Minio, Google Cloud Storage等云存储服务也可以用来持久化存储容器中的数据。这种方式通常用于备份或者需要高可用性的场景。
这种情况使用不太多,这里就不再赘述啦小伙伴们可以自由选择
结语
今天就写到这里啦~
小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦

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

在这里插入图片描述

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

相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
164 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
978 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
735 9