背景
如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据要求 持久化
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用户密码,同步成功!

