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

news/2024/12/21 23:11:33/文章来源:https://www.cnblogs.com/sugartang/p/18445322

@

目录
  • 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: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

编写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

编写一个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 挂载

编写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: ${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

进入容器,检查挂载情况

docker exec -it nfs-container bash
cd /data
ls -l
cat test.txt

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

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

结语

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

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

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808822.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于simulink的风轮机发电系统建模与仿真

1.课题概述使用simulink实现风轮机发电系统建模与仿真,包括风速模型(基本风+阵风+阶跃风+随机风组成),风力机模型,飞轮储能模块等。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a风速模块:风力机模块 整体模型4.系统原理简介 4.1 风速模型风速模型在风力发电和其他…

2024-10-06 闲话

2024-10-06 闲话坐在电脑前 1 小时也什么都写不出来。 比如我现在住的地方(在一个房子里面)旁边有一个大冰块,因为这个大冰块在吸热所以我在家里感受到了无尽的寒冷。 于是我读了几本古圣先贤的书,合成了能烧来取暖的蜂窝煤。我又拿了根钻头把蜂窝煤点着了,尾气全部排到房…

报错集

报错集弹性云服务器ECS + 自动分配IP地址 + 配置安全组规则 + 配置并创建桶1.另外一个冲突的操作当前正作用在这个资源上,请等待一段时间后重试。 A conflicting conditional operation is currently in progress against this resource.Please try again 解决方案:桶的名称重…

云锵投资 2024 年 9 月简报

季报摘要行情:双重底结束,牛市启动;未来:长线看多; 期权策略:研发成功。节后正式上线,是未来的主要现金流策略; 微盘策略:非主流策略,三月连涨,未来长持; 本季度量化基金策略业绩:15.89%,优,全国排名:1858/11684;平均 Beta:1.00; 本季度量化股票策略业绩:3…

激活 Ultra Mobile Paygo

淘宝买一张 Ultra Mobile Paygo 电话卡(也叫做美国紫卡)(可选)在 NumberBarn 购买一个手机号。Plan 记得选 Port Away。打开 paygo.ultra.me/activate,填入卡面上的激活码,然后继续。填写相关信息。如果购买了手机号,选择 Transfer an Existing Number。未完待续

OJ在线判题系统项目

我的OJ在线判题系统介绍在线代码测评系统 开源地址 https://gitee.com/xj-oj/oj-project/tree/master 开发环境Java版本:Jdk 17 数据库:MySQL 8.0、Redis 6.2.6 开发工具 :IntelliJ IDEA、Maven 3.8.6采用技术Spring Boot、MyBatis-Plus、redis vue3、Axios、Element Plus部…

Trie

835. Trie字符串统计 模板题: 维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x; Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,所有输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。 输入格式 第一行包含整数 N,表示操作数。 接下来…

#2024-2025-1学号20241309《计算机基础与程序设计》第二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第二周作业这个作业的目标作业正文 2024-2025-1学号20241309《计算机基础与程序设计》第二周学习总结教材学习内容总结 《计算机科学概论》第一章 1.计算系统…

Ubuntu20.04安装LabelImg 以及出现(ModuleNotFoundError: No module named libs.resources)错误

安装 Ubuntu系统安装labelImg: sudo apt install pyqt5-dev-tools接下来,通过 GitHub 下载 LabelImg: git clone https://github.com/tzutalin/labelImg.git cd labelimg-master cd requirements/ sudo pip3 install -r requirements-linux-python3.txt -i https://pypi.tun…

shctf 有感

当我打ezapk的时候 见到了这个代码我看的出这是先进行key异或加密后再转base64和目标对比(其实我漏了一个要先转UTF-8,但是我只会用C语言写base64解码,不会UTF-8解码),百思不得其解怎么写shellcode,听了某大跌建议,直接咨询AI,然后被喂了个python代码,ctrlc+ctrlcv就解…

三千字长文:我知道的输入法技巧都在这了

这些技巧能让你打字更快、更好。这些技巧能让你打字更快、更好。 ‍ 官方设置 目前市面上有很多输入法软件,其中很多功能都是共有的,因为都是基础功能。因此,当选择了一款输入法好,可以先打开设置页面,好好地了解有什么功能。 此外,还可以看输入法官网文档,例如搜狗输入…

通过图片中信息得出地点

图片中会隐藏信息,比如右下角的小票将它翻转,可以看到 erbang Alaf Restaurant,Bangunan,Jalan SS21/39,Selang,这些字眼,于是直接用浏览器搜索 Gerbang正好填补了没看到的缺角, 地址上的Bangunan,Jalan SS21/39符合小票上的字,说明这就是图中的餐厅 作者想说,当要发布照…