文章目录
- 存储卷的含义
- 存储卷的分类
- 存储卷的作用
- 存储卷的使用
- 存储卷实际使用案例 ---- MySQL灾难恢复
- 存储卷的局限
Docker 基础使用(0)基础认识
Docker 基础使用 (1) 使用流程概览
Docker 基础使用(2) 镜像与容器
Docker 基础使用(3) 存储卷
存储卷的含义
存储卷中指的是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系,当在容器中的对应目录下写入数据时,容器会将其内容直接写入到宿主机上的对应目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。 卷(机制)的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
存储卷的分类
管理卷:管理卷是由 Docker 维护和管理的卷,它们可以在容器之间共享和重用。这种类型的卷对于需要持久化数据的场景非常有用,因为它们可以更容易地进行备份、迁移和扩展。
解释:管理卷默认映射到宿主机的/var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系. 这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录
绑定数据卷:绑定数据卷允许将主机上的文件或目录直接挂载到容器中,从而使容器可以访问主机文件系统中的数据。这种方式非常灵活,但也增加了对主机文件系统的依赖。
解释:绑定数据卷映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,使两个已知的路径建立关联关系。
临时数据卷:临时数据卷是在容器运行时创建的卷,用于存储临时数据。一旦容器被删除,临时数据卷也会被删除,因此适合于临时性的数据存储需求。
解释:映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储
存储卷的作用
- 满足容器内业务数据持久化的需求。
- UnionFS 对于修改删除等,一般效率非常低, 使用存储卷可以提高效率。
- 方便容器与宿主机的通信
- 方便同一宿主机上容器间的通讯
存储卷的使用
先看基础指令(无需记忆随用随查)
创建存储卷
docker volume create
查看卷详细信息
docker volume inspect
列出卷
docker volume ls
删除卷,需要容器不被使用的情况下
docker volume rm
删除不使用的本地卷
docker volume prune
创建存储卷,创建存储卷的两种常见方式
docker volume create my_volume创建一个使用 my_volume 存储卷的容器,并将存储卷挂载到容器中的 /path/in/container 路径上
docker run -d --name my_container -v my_volume:/path/in/container my_image
存储卷实际使用案例 ---- MySQL灾难恢复
- 拉取mysql 镜像
- 启动容器
docker container run --name mysql-demo
-e MYSQL_ROOT_PASSWORD=wsk -itd
-v /data/myworkdir/mysql-data:/var/lib/mysql mysql:5.7
这条命令的含义是创建一个名为mysql-demo的Docker容器,使用MySQL 5.7镜像。其中-e MYSQL_ROOT_PASSWORD=wsk 指定了MySQL的root用户密码为"wsk",-v /data/myworkdir/mysql-data:/var/lib/mysql将本地主机的/data/myworkdir/mysql-data目录挂载到容器内的/var/lib/mysql目录,以持久化存储MySQL数据。 -itd参数分别表示以交互模式运行,并且在后台以守护进程模式运行容器。
- 查看挂载信息
docker container inspect mysql-demo | grep "Mounts" -A 10
这条命令的含义是使用docker container inspect
命令来获取名为mysql-demo的Docker容器的详细信息,并通过grep
命令筛选出包含"Mounts"关键词的行及其后续10行的信息。这样可以查看容器中挂载的文件系统信息,包括挂载的源路径、目标路径等。
- 连接 MySQL 的 shell, 创建数据库与表结构(建库建表省略)
docker container exec -it mysql-demo /bin/bash
docker container exec -it mysql-demo /bin/bash
这条命令的含义是在名为mysql-demo的Docker容器中以交互模式执行/bin/bash
命令,即进入容器的bash shell环境,以便在容器内部进行命令操作和调试。
进入bash shell环境,提示符发生改变,输入指令进入mysql。
5 . 在宿主机中查看 volume
- 模拟MySQL容器意外终止并删除
docker stop mysql-demo
docker rm mysql-demo
- 再此启动新的demo并验证数据是否恢复成功
发现数据任然存在。
完整指令为
docker container run --name mysql-demo -e MYSQL_ROOT_PASSWORD=wsk -itd -v /data/myworkdir/mysql-data:/var/lib/mysql mysql:5.7
docker container inspect mysql-demo | grep "Mounts" -A 10
docker container exec -it mysql-demo /bin/bash
mysql -u root -p
在数据库中插入数据docker stop mysql-demo
docker rm mysql-demodocker container run --name new-mysql-demo -e MYSQL_ROOT_PASSWORD=wsk -itd -v /data/myworkdir/mysql-data:/var/lib/mysql mysql:5.7
docker container exec -it new-mysql-demo /bin/bash
mysql -u root -p
查看数据
存储卷的局限
1. 不能跨主机(物理上的宿主机)
docker 存储卷是使用其所在的宿主机上的本地文件系统目录,也就是宿主机有一块磁盘,这块磁盘并没有共享给其他的 docker 主机,容器在这宿主机上停止或删除,是可以重新再创建的,但是不能调度到其他的主机上,这是 docker 本身没有解决的问题
2. 启动流程复杂
从前面的实操过程中可以看出,容器有一个问题,容器的启动一般与进程的启动不太一样,就是容器启动时选项比较多,如果下次再启动时,很容器会忘记它启动时的选项,所以最好有一个文件来保存容器的启动。
这就需要容器编排工具的引入。一般情况下,是使用命令来启动操作 docker, 但是可以通过文件来读,也就读文件来启动,读所需要的存储卷等,但是它也只是操作一个容器,如果要几十上百个容器操作,就需要专业的容器编排工具。
对于有状态要持久的集群化组件,如 mysql 的主从。部署维护一个 Mysql 主从需要运维知识、经验整合进去才能实现所谓的部署,扩展或缩容,出现问题后修复,必须要了解集群的规模有多大,有多少个主节点,有多少个从节点,主节点上有多少个库,这些都要一清二楚,才能修复故障,这些就强依赖于运维经验这种复杂的场景往往还是需要人力,很难有完美的工具出现。