docker -数据卷技术

背景

如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据要求 持久化

MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

数据卷技术 :是 数据共享的技术。提供了数据实时更新,保证容器即使在删除状态下,数据也不会丢失

提示:挂载是实现数据卷技术的手段/具体的实现方式

挂载的作用:

将容器的数据,同步到本地(宿主机)保证数据的持久化,避免容器启动过程中出现意外,导致数据丢失

方式一:直接使用命令来挂载

我来解读一些"挂载"的含义

"挂载"就是将 本地文件夹/文件 挂靠到docker 容器的文件夹/文件上,实现双向实时映射与同步

保证 "一方修改,另一方实时更新"

保证数据的一致性。举一个例子:假设你使用docker命令 ,开启mysql 容器,进行数据库操作,如果容器启动过程中,出现意外,导致之前操作的数据比如建的表,操作的数据丢失。如果有一个开关,当我启动时,将容器中正在操作的数据,时时同步到宿主机,这样就避免了 即使容器出现问题,也可以保证数据的一致性。这里有点像 mysql 三大特性中的 持久性

  • MySQL 通过relog日志保证数据落地,Docker 挂载通过宿主机目录保证容器数据脱离容器生命周期持久化"

**命令:**将主机目录挂载到容器的指定目录下(命令操作逻辑),实现主机和容器目录的双向实时同步(核心效果)

**补充:**虽然从命令执行角度 将主机目录挂靠到容器目录更好理解,但其实也

可以把主机的文件 / 配置传给容器使用,也能将容器目录的产生的数据持久化到主机目录中

这两种并不矛盾,究其根本,还是实现容器和本地数据同步,不必过多纠结!

  • source(源):宿主机侧的存储位置(可以是 Docker 数据卷、宿主机自定义目录);

  • target(目标):容器内的业务目录(必须是容器内实际存储数据的目录,比如 MySQL 的 /var/lib/mysql)。

    docker run -it -v 主机目录:容器内目录

实操示例:将本地 dj/test 文件夹挂载到 MySQL 容器的 dj 文件夹

  • 使用 docker run -it -v 命令实现数据的挂载

示例(将本地的dj/test 文件夹挂靠到mysql bash环境下的dj文件夹下,实现数据同步更新)

如下图所示,mysqlbash环境中,使用ls命令并没有 dj文件夹

如下图所示,home目录下dj文件夹下是空的

1 清理旧容器,避免干扰

在启动mysql容器之前,先删除所有正在启动的容器避免干扰

复制代码
docker rm -f $(docker ps -aq)
2.启动 MySQL 容器并实现挂载

根据下面的注释,看懂我写的这个命令

复制代码
docker run  # 核心命令:创建并启动一个Docker容器
-it         # 给容器分配交互式伪终端(保留和容器的交互能力,支持Ctrl+P+Q退出)
-d          # 让容器在后台以守护进程模式运行(不占用当前终端,日志不直接打印)
-v /home/dj/test:/dj  # 数据卷挂载:把宿主机的/home/dj/test目录,和容器内的/dj目录双向绑定(容器和宿主机该目录下的数据实时同步)
--name mysql02  # 给容器起一个自定义名字叫mysql02(后续操作容器直接用名字,不用记随机ID)
-p3306:3306  # 端口映射:把宿主机的3306端口,映射到容器内的3306端口(宿主机访问localhost:3306就能连接容器里的MySQL)
-e MYSQL_ROOT_PASSWORD=123  # 设置环境变量:初始化MySQL的root用户密码为123(MySQL容器启动的必选配置)
mysql:latest  # 指定启动容器使用的镜像:最新版的MySQL官方镜像

docker run -it -d -v /home/dj/test:/dj --name mysql02 -p3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:latest
3.进入容器终端,验证容器内 dj 文件夹是否创建成功

回到mysql bash环境,可以看到新建的dj 文件夹/文件

4 使用 "docker inspect 容器id " 验证挂载配置是否生效

接下来通过,使用 docker inspect 容器id 查看上面的操作是否成功

也就是将容器存储数据的文件/文件夹,和映射的宿主机文件/文件夹进行深度绑定,保持数据一致性

可以通过使用 docker inspect 容器id 查看容器的完整配置和状态元数据,比如容器 ID、创建时间、网络配置、挂载信息(查看将指定容器的文件 和映射文件的具体信息)

**查看重点:**在输出的 JSON 中找到Mounts节点,能看到Source=/home/dj/test、Target=/dj,说明挂载配置生效。

可以注意到,容器中 /dj 目录的数据变化会同步到宿主机 /home/dj/test" 。

这种绑定挂载(bind mount)的特点就是宿主机和容器的目录的数据是双向同步的,宿主机修改该目录内容也会同步到容器里。

5.证明:宿主机和容器的目录的数据是双向同步
验证 1:容器内创建文件 → 宿主机同步

接下来,我将在 mysql bash环境的dj文件夹下 创建一个 test1.sql 的文件夹,观察 宿主机这边是否会同步出现

验证2:宿主机 删除test1.sql 文件--> 容器同步删除

错误示例

我最开始直接使用 rm test1.sql 删除该文件,但是日志显示 没有对应的权限

在powershell 管理员权限打开命令行,设置root用户密码,同步成功!

相关推荐
~黄夫人~6 小时前
Linux 权限管理:用户组 + 特殊权限 + ACL 解析
linux·运维·计算机·学习笔记·权限管理
2501_907136826 小时前
手搓仓库管理系统Senbar-1.0.4(附带财务管理板块)
运维·服务器·软件需求
盟接之桥8 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造
时空潮汐8 小时前
神卓N600 NAS身份核验功能深度解析
linux·运维·网络·神卓nas·神卓n600 pro·家庭轻nas
小李独爱秋8 小时前
模拟面试:用自己的话解释一下lvs的工作原理
linux·运维·面试·职场和发展·操作系统·lvs
百锦再9 小时前
Jenkins 全面精通指南:从入门到脚本大师
运维·后端·python·servlet·django·flask·jenkins
隔壁老王的代码9 小时前
Jenkins的流水线详解
运维·servlet·jenkins
珹洺9 小时前
Java-servlet(五)手把手教你利用Servlet配置HTML请求与相应
java·运维·服务器·前端·servlet·html·maven
一路往蓝-Anbo9 小时前
第 8 章:M33 领航——引导 A35 加载 U-Boot 与 Linux 内核
linux·运维·服务器·stm32·单片机·嵌入式硬件·网络协议
何中应10 小时前
从零搭建JumpServer
运维·堡垒机·jumpserver