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用户密码,同步成功!

相关推荐
一只鹿鹿鹿7 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
房产中介行业研习社7 小时前
2026年3月哪些房源管理系统功能全
大数据·运维·人工智能
数据库小组8 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
biubiubiu07068 小时前
Linux / Ubuntu systemd 服务使用说明
linux·运维·ubuntu
MaximusCoder9 小时前
等保测评命令——Anolis Linux
linux·运维·服务器·网络·经验分享·安全·php
田里的水稻9 小时前
ubuntu22.04_构建openclaw开发框架
运维·人工智能·python
相思难忘成疾9 小时前
《RHEL9虚拟机部署及SSH远程登录实践手册》
linux·运维·ssh·虚拟机
cg_ssh10 小时前
Vue3中样式变量的使用
linux·运维·服务器
TDengine (老段)10 小时前
TDengine IDMP 运维指南 —— 部署架构
大数据·运维·数据库·架构·时序数据库·tdengine·涛思数据
灰阳阳10 小时前
Docker镜像远程(离线)迁移教程
运维·docker·容器