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

结语

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

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2电商项目(八) 完结撒花:图片懒加载、路由懒加载、打包的map文件

一、图片懒加载 安装:npm i vue-lazyload1.3 -s (弹幕建议按1.3版本) 引入 // 引入懒加载的图片 import hlw from /assets/hulu.jpg // 引入插件 import VueLazyload from vue-lazyload // 引入插件 Vue.use(VueLazyload, {// 懒加载默认的图…

【Linux-基础IO】磁盘的存储管理详解

磁盘的存储管理 由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(Block Group),每个块组中包含该块组的数据存储情况以及具体的数据 假设有一个8…

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…

Linux中的网络指令:ping、netstat、watch、pidof、xargs

目录 Ping指令 netstat指令 watch指令 pidof指令 xargs指令 Ping指令 功能:检测两台主机间的网络连通性 语法:ping [选项] 目标主机的IP地址 (192.168.1.1)或域名(google.com) 常见选项&#xff1a…

P1010 [NOIP1998 普及组] 幂次方 Python题解

[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示。例如 137 2 7 2 3 2 0 1372^7 2^3 2^0 137272320。 同时约定次方用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)。 由此可知, 137 137 137 可表示…

华为 HCIP-Datacom H12-821 题库 (33)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.VLAN Pool 只要通过一个 SSID 就能够同时支持多个业务 VLAN,从而缩小广播域&#…

draw.io 设置默认字体及添加常用字体

需求描述 draw.io 是一个比较好的开源免费画图软件。但是其添加容器或者文本框时默认的字体是 Helvetica,一般的期刊、会议论文或者学位论文要求的英文字体是 Times New Roman,中文字体是 宋体,所以一般需要在文本字体选项里的下拉列表选择 …

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下: 跨源资源共享(CORS,Cross Origin Resource Sharing。或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自…

线性代数入门

线性代数入门 线性代数(Linear Algebra)是数学的重要分支之一,广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说,掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先,你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式,这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议。它用于在计算机网络中传输文件,特别适用于在网络设备(如开发板和Linux系统下)代码调试等操作。TFTP使用UDP(User Da…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一:内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定义任务描述及创建任务触发器3.…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点:2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

程序员日志之DNF手游女鬼剑异界套选择思路

目录 传送门正文日志1、概要2、剑宗3、剑豪4、剑魔5、暗帝 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyBatis框架(精品) MyBatis-Plus Sp…

STM32 OLED

文章目录 前言一、OLED是什么?二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念(1)索引、文档、字段(2)映射(3)DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式(1)深度分页(fromsize&#xff09…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作(不敢称为项目)代号,其中3表示是第3种数据库。 多年前,对在役民航客机中的某型机载导航数据库的二进制文件进行分析,弄明白它的数据结构后做了几个工具&#xff0c…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业,每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游,但是由于跳得比较慢,它们的愿望难以实现。这时,小C听说有一种叫做火车的交通工具,在铁路上跑得很快&#x…