文章目录
- 文件分层
- 数据卷挂载的含义
- 数据卷挂载实践
- 数据卷挂载案例
- 数据卷挂载方式
- 数据卷常用命令
- 容器间数据共享
更多相关内容可查看
文件分层
例:拉取mysql5.7的镜像,在继续拉取mysql5.8的镜像,会出现一部分文件已存在的现象
这种分层技术 是 docker 强大的功能点之一 会减少很多的冗余文件 每一个镜像 都设置为宝塔形,进行分层 当某一个镜像依赖于另一个镜像的分层 时会先判断 该层是否已存在 如果存在 则不下载 ,仅仅下载镜像所需的额外部分。 类似于盖楼房 一层一层的堆积上层依赖于下层。 那么当删除镜像的时候呢 ,也会查看自己构成镜像的所有层 如果 自己的某层级在被另一个镜像所依赖(使用)则会忽略删除该层。
数据卷挂载的含义
个人理解:将容器跟服务器进行绑定,改容器的东西,服务器挂载的文件也随之改变,反之亦可
主要用途有:
- 数据持久化:容器的生命周期结束后,其中的数据会被删除。如果你希望容器的数据能够持久保存,就需要使用数据卷挂载。
- 数据共享:如果你希望多个容器能够共享同一份数据,也可以使用数据卷挂载。
数据卷挂载实践
- 在run 镜像的时候 使用-v 参数 来实现 宿主目录与虚拟机目录进行挂载映射(前提是在你的本地根目录新建一个test文件)
docker run -d -p 6888:6379 --name aaa -v /test:/data redis
命令解析
- docker run:这是 Docker 的一个命令,用于运行一个容器。
- -d:这个参数表示以“后台运行”的方式启动容器。
- -p 6888:6379:这个参数表示将容器的 6379 端口映射到宿主机的 6888 端口。
- –name aaa:这个参数表示将运行的容器命名为 “aaa”。
- -v /test:/data:这个参数表示将宿主机的 “/test” 目录挂载到容器的 “/data” 目录。
- redis:这是 Docker 镜像的名字,这条命令会运行一个 “redis” 的容器。
2.进入容器的data路径
docker exec -it test /bin/bash
3.重新开一个窗口,进入test路径下
4.进行测试,在data下创建,测试test中是否也会自动生成
5.进行测试,在test下创建,测试data中是否也会自动生成
总结几点:
1.将容器跟服务器进行绑定,改容器的东西,服务器挂载的文件也随之改变,反之亦可
2.删除文件 也是同步的,无论是删除宿主机上文件 还是容器内部文件都会进行同步删除
3.删除容器,不会删除外部宿主机的目录
数据卷挂载案例
本案例为:mysql 数据挂载同步验证(如果不进行挂载我们是无法访问容器内部的)
1.拉取mysql镜像
docker pull mysql:5.7.30
2.镜像挂载
注:官方指明mysql 配置文件路径:/etc/mysql/conf.d
、数据存储路径:/var/lib/mysql
docker run -d -p 7000:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30
命令解析:
- docker run:Docker 的命令,用于运行一个新的容器。
- -d:以后台模式运行容器。
- -p 7000:3306:将容器的 3306 端口映射到宿主机的 7000 端口。这样,你就可以通过宿主机的 7000 端口来访问容器中的 MySQL 服务了
- -v /docker/mysql/conf:/etc/mysql/conf.d:将宿主机的 /docker/mysql/conf 目录挂载到容器的 /etc/mysql/conf.d 目录。这样,你就可以通过修改宿主机的 /docker/mysql/conf
目录中的文件来更改 MySQL 的配置了。- -v /docker/mysql/data:/var/lib/mysql:将宿主机的 /docker/mysql/data 目录挂载到容器的 /var/lib/mysql 目录。这样,MySQL 的数据就会保存在宿主机的 /docker/mysql/data
目录,即使容器被删除,数据也不会丢失。- -e MYSQL_ROOT_PASSWORD=123456:设置环境变量 MYSQL_ROOT_PASSWORD 的值为 123456。这是 MySQL 服务的 root 用户的密码。
- mysql:5.7.30:要运行的 Docker 镜像的名称和标签。这里是 MySQL 服务的 5.7.30 版本
3.Navicat连接测试
4.用navicat创建一个新的数据库并在数据库中创建一张表并插入数据 ----然后到挂载的宿主机目录以及容器中查看
进入宿主机挂载路径查看
进入容器挂载路径查看
注:容器删除,数据不会丢失,可以重新挂载新的容器示例,所以有想删库跑路的小伙伴,要注意以下哦
数据卷挂载方式
挂载方式有: 匿名挂载,具名挂载 ,指定路径挂载
查看所有挂载卷列表
docker volume ls
- 匿名挂载
一串唯一且随机的编码 直观上看 不知道其具体的名字 以及挂载到宿主机上的路径
使用 -v 参数的时候 仅仅指定 容器内部挂载路径 不指定外部 这种命令挂载的卷 都是匿名挂载
# -v 后 未指定宿主机路径以及挂载名
docker run -d -v /data redis
2.具名挂载
即在容器与宿主机进行挂载的时候指定一个名字
#-v 参数后 指点挂载的卷名:/容器内路径
docker run -d -v names:/data --name jumingguazai redis
3.查看卷所在的宿主机位置
具名挂载的通过以下命令查询
docker volume inspect 卷名
匿名挂载的会挂载到 默认目录 /var/lib/docker/volumes/ 下
数据卷常用命令
容器间数据共享
查看容器详细信息
docker inspect 容器Id/容器别名
如图:Source是宿主机挂载路径,Destination是容器内挂载路径
容器之间使用数据卷挂载命令 --volumes-from 要挂载容器ID
docker run -it --name mysql2 --volumes-from zen_shamir mysql:5.7.30 /bin/bash
可以看到我们之前创建的数据库也挂载过来了
在创建一个mysql2的子容器 道理同理
docker run -it --name mysql3 --volumes-from mysql2 mysql:5.7.30 /bin/bash
宿主机------>mysql----->mysql2------>mysql3
宿主机跟容器之间通过-v 容器跟容器直接通过–volumes from
看到这,建议大家多动手实践,有过实践在真实的工作场景中才能得心应手!!