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

news2024/11/25 2:35:21

文章目录

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

结语

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

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打卡第四天 P1081 [NOIP2012 提高组] 开车旅行

今天是我打卡第四天,做个省选/NOI−题吧(#^.^#) 原题链接:[NOIP2012 提高组] 开车旅行 - 洛谷 题目描述 输入格式 输出格式 输入输出样例 输入 #1 4 2 3 1 4 3 4 1 3 2 3 3 3 4 3 输出 #1 1 1 1 2 0 0 0 0 0 输入 #2 10 4 5 6 1 …

k8s 中存储之 hostPath 卷

目录 1 hostPath 卷介绍 2 hostPath 卷实际应用操作 2.1 创建 pod 资源类型 2.2 修改清单文件增加 hostPath 对应的参数配置 2.3 查看是否创建 卷 和 pod 2.4 创建发布文件测试是否正常访问 1 hostPath 卷介绍 EmptyDir中数据不会被持久化,它会随着Pod的结束而销…

每日一题|2187. 完成旅途的最少时间|二分法、计数器

本题的一个思路是从小到大遍历全部可能的t,并分别计算当前每一辆车所能够行驶的最多trips数量。 但是如果从1开始,结束在最不理想的情况是max(time) * totalTrip,在数据很大的时候很容易time out。 所以不妨对每一个可能的t重新思考性质。随…

STL的位图:bitset

引言 在C标准模板库(STL)中,bitset是一种用于表示固定大小序列的位集合的容器。每个位(bit)可以被独立地设置或清除,即它可以单独地表示0或1。bitset在处理二进制数据时非常有用,尤其是在需要节…

linux安装百度网盘

版本20.04 下载 deb:debian系列,Ubuntu下载这个 rpm:redhat系列 安装 在Downloads中找到,打开终端,使用命令安装 sudo dpkg -i 名称 //dpkg:Debian package在所有文件中找到。

Linux相关概念和易错知识点(12)(命令行参数、环境变量、本地变量)

1.命令行参数 (1)main函数的参数int argc和char* argv[]是什么? main函数可以带参数,即int main(int argc, char* argv[]),(int argc, char* argv[])叫做命令行参数列表,int argc叫参数的个数&a…

【YOLO学习】YOLOv3详解

文章目录 1. 网络结构1.1 结构介绍1.2 改进 2. 训练与测试过程3. 总结 1. 网络结构 1.1 结构介绍 1. 与 YOLOv2 不同的是,YOLOv3 在 Darknet-19 里加入了 ResNet 残差连接,改进之后的模型叫 Darknet-53。在 ImageNet上 实验发现 Darknet-53 相对于 ResN…

VSCODE驯服日记(三):配置C++环境

1. 下载mingw64,解压后把bin并添加到环境变量 1>编译器介绍 mingw:专为windowsgcc:多平台msvc :windows,且配合vs使用更佳 注意与调试器gdb和lldb的区别 2. 安装vscode插件: 安装C/C插件 安装code ru…

力扣之1322.广告效果

题目: sql建表语句: Create table If Not Exists Ads (ad_id int,user_id int,action ENUM (Clicked, Viewed, Ignored) ); Truncate table Ads; insert into Ads (ad_id, user_id, action) values (1, 1, Clicked); insert into Ads (ad_id, use…

Sublime Text 下载地址分享

Sublime Text官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Sublime Text最新版正式版官方版绿色版下载,Sublime Text安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123684.com/s/kPxoTd-dCnxHSublime Text官方版下载丨最新版下…

双十一可以买什么物品?重磅推荐五款好用品牌!

距离今年的双十一盛典仅剩数十日,您是否已将心爱商品添加至购物车中了呢?还在犹豫未满载的朋友也无需焦虑,特意为您精选了五款好用的宝贝推荐,旨在为您的购物清单增添几分灵感与便捷,期待能为您的双十一购物之旅增添一…

GPU 是否有朝一日可以取代 CPU?

讨论 GPU 是否能够取代 CPU,需要从两者的基本架构、设计目的、性能表现、应用领域等多个方面进行分析。虽然你提到的4060显卡的核心频率接近服务器 CPU 的频率,这看起来似乎有一些相似性,但 GPU 和 CPU 的设计思路和适用场景差异显著&#xf…

18448 最小生成树

### 思路 使用Kruskal算法求解图的最小生成树。Kruskal算法通过对所有边按权值排序,然后逐步选择最小权值的边,确保不会形成环,直到构建出最小生成树。 ### 伪代码 1. 读取输入的结点数n和边数m。 2. 读取每条边的信息,存储在边列…

羊城杯2024WP

羊城杯-2024 web web2 进题信息搜集一下,dirsearch发现了login路由可访问,先随便点一下,发现了一个文件读取: http://139.155.126.78:30148/lyrics?lyricsRain.txt 我尝试了一下: http://139.155.126.78:30148/lyrics…

【教学类-77-02】20241007青花瓷纹理纸(手工)

背景需求: 大班《我是中国人》主题下,有一个“青花瓷”的主题,各种平面绘画 这些青花瓷花瓶、盘子都是平面的,我想能不能做个立体的,所以前期设计了“青花瓷立体卡”【教学类-77-01】20241005青花瓷立体书-CSDN博客文…

构建 10 万卡 GPU 集群的技术挑战

构建 10 万卡 GPU 集群的技术挑战 摘要 揭示AI训练集群关键基础设施挑战,探讨突破现有AI瓶颈的必要性与10万GPU集群(如OpenAI、Meta)建设所面临挑战与需求。 构建网络拓扑,需权衡多层交换机成本、带宽与维护。本文对比Ethernet与…

JDBC 快速入门

JDBC 快速入门 搭建步骤代码实现数据库java 代码 搭建步骤 准备数据库官网下载数据库连接驱动jar 包。https://downloads.mysql.com/archives/c-j/创建 java 项目,在项目下创建 lib 文件夹,将下载的驱动 jar 包复制到文件夹里选中 lib 文件夹右键 ->…

通信工程学习:什么是ICP网络内容服务商

ICP:网络内容服务商 ICP,全称Internet Content Provider,即网络内容服务商,是指那些通过互联网向用户提供各种类型内容服务的组织或个人。ICP在数字化时代扮演着至关重要的角色,它们不仅是信息的传播者,更是…

微服务获取用户信息和OpenFeign传递用户

问题一: 网关已经完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时,微服务又该如何获取用户身份呢? 由于网关发送请求到微服务依然采用的是Http请求,因此我们可以将用户信息以请求头的方式传递到下游微服务…

机器人技术基础(1-3章坐标变换)

位置矢量的意思是B坐标系的原点O相对于A坐标系的平移变换后的矩阵: 齐次坐标最后一个数表示缩放倍数: 左边的是T形变换矩阵,右边的是需要被变换的矩阵:T形变换矩阵的左上角表示旋转,右上角表示平移,左下角最…