当前位置: 首页 > news >正文

docker_持久化存储

Docker Volumes 单机部署

要在 Docker 中使用 Volumes(卷) 来实现持久化存储,步骤非常简单。以下是具体的操作方法:

  1. 创建一个 Docker Volume
    你可以通过 Docker CLI 来创建卷。执行以下命令创建一个名为 my_volume 的卷:
# 这将创建一个卷,Docker 会自动管理它的存储位置。
[root@localhost my-flask-app]# docker volume create my_volume
my_volume# 可以通过这个命令查看创建的卷的信息
[root@localhost my-flask-app]# docker volume inspect my_volume
[{"CreatedAt": "2024-09-12T19:06:24+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/my_volume/_data","Name": "my_volume","Options": null,"Scope": "local"}
]
  1. 将 Volume 挂载到容器中
    在启动容器时,可以通过 -v 选项将卷挂载到容器的指定目录。假设你要启动一个 Nginx 容器,并将卷挂载到 /usr/share/nginx/html 目录来存储网页文件:
# 这意味着容器内的 /usr/share/nginx/html 目录会与宿主机上 Docker 管理的 my_volume 挂载在一起,容器内对这个目录的写操作将会保存到卷中。
[root@localhost my-flask-app]# docker run -d --name my_nginx -v my_volume:/usr/share/nginx/html nginx
31c4848c29a99d9d60edde46772d2fc610edaa4816332320d6833e4ae4ad6606
  1. 在容器中操作数据
    进入容器并在挂载的目录中操作数据:
# 然后进入 /usr/share/nginx/html 目录,创建文件或修改内容,这些数据都会保存在卷中。
# docker exec:用于在一个正在运行的容器中执行命令。
# -it:是两个选项的组合:#-i:表示“interactive”(交互式),保持 STDIN(标准输入)打开,这样你可以在容器中进行交互操作。
#-t:表示“tty”(伪终端),为容器分配一个伪终端,这样你可以使用命令行界面。
#my_nginx:这是容器的名称或 ID,指定要在哪个容器中执行命令。
#/bin/bash:在容器中执行的命令,这里是启动 Bash shell。/bin/bash 是大多数 Linux 系统中 Bash shell 的路径,用于在容器内部打开一个命令行界面。
[root@localhost my-flask-app]# docker exec -it my_nginx /bin/bash
root@31c4848c29a9:/# cd /usr/
root@31c4848c29a9:/# cd /usr/share/nginx/html/
50x.html    index.html  
root@31c4848c29a9:/# cd /usr/share/nginx/html/
root@31c4848c29a9:/usr/share/nginx/html# echo "test Docker Volume" > index.html 
  1. 查看卷内容
    你可以通过以下命令在宿主机上查看 my_volume 中的数据路径(Docker 会将卷保存在默认存储位置,但它对用户透明):
[root@31c4848c29a9:/usr/share/nginx/html# exit
exit
[root@localhost my-flask-app]# cd /var/lib/docker/volumes/my_volume/_data
[root@localhost _data]# ls
50x.html  index.html
[root@localhost _data]# cat index.html 
test Docker Volume

该命令会显示卷的详细信息,包括宿主机上实际存储的路径。你也可以直接查看宿主机上的数据(卷通常存储在 /var/lib/docker/volumes/ 下)。

关闭容器后文件还是在

[root@localhost _data]# docker stop my_nginx
my_nginx
[root@localhost _data]# docker ps
CONTAINER ID   IMAGE      COMMAND            CREATED       STATUS       PORTS                                       NAMES
a869bd32ff54   my-flask   "python3 app.py"   9 hours ago   Up 9 hours   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   flamboyant_brattain
[root@localhost _data]# cat index.html 
test Docker Volume

NFS 配置和 Docker 持久化存储的需求

NFS 服务端配置脚本
实现步骤:

  1. 安装 NFS 工具:确保服务端安装了 rpcbind 和 nfs-utils。
  2. 启动服务:启动并启用 rpcbind 和 NFS 服务。
  3. 验证服务状态:检查 NFS 服务是否启动成功。
  4. 创建共享目录:在服务端创建共享目录并设置权限。
  5. 配置共享目录:将共享目录配置添加到 /etc/exports。
  6. 导出目录:导出配置并重新启动 NFS 服务。
  7. 重新验证:确保 NFS 服务正确运行。

NFS 客户端配置脚本
实现步骤:

  1. 安装 NFS 客户端工具:确保客户端安装了 nfs-utils。
  2. 创建挂载目录:在客户端创建挂载点目录并设置权限。
  3. 配置挂载信息:将挂载信息添加到 /etc/fstab,避免重复添加。
  4. 挂载 NFS 共享:手动挂载 NFS 共享并验证挂载状态。
  5. 创建 Docker 卷:创建 Docker 卷并指定 NFS 驱动。
  6. 启动 Docker 容器:启动 Docker 容器并挂载 NFS 卷。
    注意事项:
    ----确保 /mnt/nfs_client_share 目录在客户端存在且权限正确。
    /etc/fstab 中的挂载信息应确保格式正确,避免挂载冲突。
    创建 Docker 卷时确保使用正确的 NFS 配置。
    检查 Docker 容器是否正确启动,并且能够访问 NFS 卷

实操:
nfs主机 这里用脚本一键部署:

#!/bin/bash# 函数:验证 NFS 服务状态
nfs_status() {if systemctl is-active --quiet nfs || [[ $(systemctl is-active nfs) == "exited" ]]; thenecho "NFS 服务启动成功"elseecho "NFS 服务启动失败,请检查配置和日志"sudo systemctl status nfsexit 1fi
}# 安装 NFS 服务端工具
sudo yum -y install rpcbind nfs-utils# 启动并启用 rpcbind 和 NFS 服务
sudo systemctl start rpcbind
sudo systemctl enable rpcbind
sudo systemctl start nfs
sudo systemctl enable nfs# 验证 NFS 服务是否已启动
nfs_status# 创建共享目录并设置权限
sudo mkdir -p /mnt/nfs_share
sudo chmod 777 /mnt/nfs_share  # 允许所有人读写# 配置共享目录权限到 /etc/exports
if ! grep -q "/mnt/nfs_share" /etc/exports; thenecho "/mnt/nfs_share 192.168.29.0/24(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports
fi# 导出共享目录并刷新配置
sudo exportfs -r
sudo exportfs -v  # 显示当前的导出配置# 重启 NFS 服务以应用新配置
sudo systemctl restart nfs# 验证 NFS 服务是否已启动
nfs_status# 输出完成信息
echo "NFS 服务端配置完成,并已启动。共享目录已导出。"

docker 客户机:注意 下面脚本 包含了 客户主机的nfs挂载,不止是容器,我给总结到一起了,如果不需要可以删除

#!/bin/bash# 安装 NFS 客户端工具
sudo yum -y install nfs-utils# 创建客户端挂载点目录
sudo mkdir -p /mnt/nfs_client_share
sudo chmod 777 /mnt/nfs_client_share# 确保不重复添加挂载信息到 /etc/fstab
if ! grep -q "192.168.29.188:/mnt/nfs_share" /etc/fstab; thenecho "192.168.29.188:/mnt/nfs_share /mnt/nfs_client_share nfs defaults 0 0" | sudo tee -a /etc/fstab
fi# 手动挂载 NFS 共享
sudo mount -t nfs 192.168.29.188:/mnt/nfs_share /mnt/nfs_client_share# 验证挂载是否成功
if mount | grep -q "/mnt/nfs_client_share"; thenecho "NFS 共享挂载成功"
elseecho "NFS 共享挂载失败"exit 1
fi# 创建 Docker 卷并挂载 NFS
# --driver local:使用本地驱动程序来管理卷。
# --opt type=nfs:指定该卷使用 NFS 类型。
# --opt o=addr=192.168.29.188,rw:配置 NFS 服务器的地址,并设置挂载选项(读写)。
# --opt device=:/mnt/nfs_share:指定 NFS 共享目录。
#  my_nfs_volume:卷的名称。
# 检查是否已经存在 Docker 卷
if docker volume ls | grep -q "my_nfs_volume"; thenecho "Docker 卷 'my_nfs_volume' 已存在,跳过创建。"
else# 创建 Docker 卷docker volume create --driver local \--opt type=nfs \--opt o=addr=192.168.29.188,rw \--opt device=:/mnt/nfs_share \my_nfs_volume# 验证卷是否创建成功if ! docker volume ls | grep -q "my_nfs_volume"; thenecho "Docker 卷创建失败,请检查配置和日志。"exit 1fi
fi# 检查是否已经存在 Docker 容器
if docker ps -a | grep -q "my_nginx"; thenecho "Docker 容器 'my_nginx' 已存在,跳过创建。"
else# 启动 Docker 容器docker run -d --name my_nginx \-v my_nfs_volume:/usr/share/nginx/html \nginx# 验证容器是否启动成功if ! docker ps | grep -q "my_nginx"; thenecho "Docker 容器启动失败,请检查配置和日志。"exit 1fi
fiecho "Docker 容器已启动并挂载了 NFS 卷"

验证并查看docker容器:

[root@localhost shell]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS     NAMES
cc20937da7cc   nginx     "/docker-entrypoint.…"   21 seconds ago   Up 20 seconds   80/tcp    my_nginx
[root@localhost shell]# docker exec -it my_nginx /bin/bash
root@cc20937da7cc:/# cd /usr/share/nginx/html/
root@cc20937da7cc:/usr/share/nginx/html# ls
50x.html  index.html
root@cc20937da7cc:/usr/share/nginx/html# touch aa.html
root@cc20937da7cc:/usr/share/nginx/html# ls
50x.html  aa.html  index.html

查看nfs服务端共享目录:

[root@localhost shell]# cd /mnt/nfs_share/
[root@localhost nfs_share]# ls
50x.html  aa.html  index.html

done

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024年06月中国电子学会青少年软件编程(图形化)等级考试试卷(二级)答案 + 解析
  • 工商银行银企直联接口清单
  • Linux开发工具的使用
  • 深度解读MySQL意向锁的工作原理机制与应用场景
  • 简单比较 http https http2,我们要如何把http升级为https
  • 科研绘图系列:R语言宏基因组PCoA图(PCoA plot)
  • 常见 Mermaid 图表类型的 prompt 编写
  • Github 2024-09-13 Java开源项目日报 Top10
  • SpringBoot用kafka.listener监听接受Kafka消息
  • 计算机图形系统发展的前世今生
  • 计算机毕业设计 基于SpringBoot的课程教学平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 【深度学习】【onnxruntime】C++调用onnx
  • 三维动画|创意无限,让品牌传播更精彩!
  • 2024年第十五届蓝桥杯青少组国赛撞期GESP认证、放弃那个?
  • C语言:刷题日志(3)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Angularjs之国际化
  • Codepen 每日精选(2018-3-25)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Django 博客开发教程 8 - 博客文章详情页
  • JavaScript 基础知识 - 入门篇(一)
  • JS函数式编程 数组部分风格 ES6版
  • ng6--错误信息小结(持续更新)
  • Node + FFmpeg 实现Canvas动画导出视频
  • Redux 中间件分析
  • scala基础语法(二)
  • Spring Cloud Feign的两种使用姿势
  • vagrant 添加本地 box 安装 laravel homestead
  • 分布式任务队列Celery
  • 手写一个CommonJS打包工具(一)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 详解NodeJs流之一
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在weex里面使用chart图表
  • ionic入门之数据绑定显示-1
  • Java性能优化之JVM GC(垃圾回收机制)
  • #考研#计算机文化知识1(局域网及网络互联)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $jQuery 重写Alert样式方法
  • (1)虚拟机的安装与使用,linux系统安装
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)PySpark3:SparkSQL编程
  • (二十四)Flask之flask-session组件
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (学习总结16)C++模版2
  • (原)本想说脏话,奈何已放下
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***测试-HTTP方法
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .md即markdown文件的基本常用编写语法
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET CLR Hosting 简介
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .net访问oracle数据库性能问题