Docker核心:深入理解Docker容器数据卷

举报
百思不得小赵 发表于 2022/11/08 16:32:51 2022/11/08
【摘要】 Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。**例如:容器中部署了MYSQL数据库,如果有一天将部署MySQL数据库的容器删除了,存放的数据也就丢失**。为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。

容器数据卷介绍

Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。例如:容器中部署了MYSQL数据库,如果有一天将部署MySQL数据库的容器删除了,存放的数据也就丢失。为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。

因此,容器的持久化和同步操作!容器间数据也是可以共享的!

使用数据卷

方式一:使用命令进行挂载数据 -v

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

测试一下:
将主机/home/ceshi与容器中的/home目录进行绑定

在这里插入图片描述

查看当前容器的详细信息:docker inspect 容器ID

在这里插入图片描述

① 在容器内创建了一个test.java文件,自动同步到了主机内:

在这里插入图片描述

② 在主机内创建了一个haha.java然后自动同步到容器内:

在这里插入图片描述

③ 退出容器,此时容器停止运行

在这里插入图片描述

修改主机上的test.java文件,添加如下内容

在这里插入图片描述

重新启动容器

在这里插入图片描述

查看容器中的test.java文件,发现数据依然同步成功!

在这里插入图片描述

这时就实现了主机与容器数据的同步和共享!!

MySQL 数据同步

① 拉取MySQL镜像到本地

在这里插入图片描述

② 运行容器挂载数据

 docker run -d -p 3306:3306  -v /home/mysql/conf:/etc/mysql/conf.d
 -v /home/mysql/data:/var/lib/mysql 
 -e MYSQL_ROOT_PASSWORD=123456 
   --name mysql01 mysql:5.7

在这里插入图片描述

③ 启动成功,使用数据库连接工具进行连接

在这里插入图片描述

连接成功

在这里插入图片描述

④ 查看本地主机,数据挂载成功

在这里插入图片描述
⑤ 使用数据库连接工具创建数据库

在这里插入图片描述

主机数据同步成功

在这里插入图片描述

⑥ 测试删除容器,数据是否存在

在这里插入图片描述

数据依旧存在:

在这里插入图片描述
MySQL数据本地持久化测试成功!!

具名挂载和匿名挂载

匿名挂载

-v 容器内路径 (不指定主机名,只指定容器内路径)

docker run -d -P --name nginxtest -v /etc/nginx nginx

在这里插入图片描述

查看所有 volume 信息

docker volume ls

在这里插入图片描述

在之前只指定容器内路径,没有写容器外路径,这就是匿名数据卷,类似于上图的格式。

具名挂载

-v 卷名:容器内路径

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

在这里插入图片描述

查看数据卷具体的位置

docker volume inspect 名称

在这里插入图片描述
Docker中所有的数据卷,如果没有指定目录的情况下,都在/var/lib/docker/volumes/ 目录下。

如何确定是具名挂载匿名挂载指定路径挂载

-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /主机路径:容器内路径 指定路径挂载

拓展

通过 -v 容器内路径:ro ( rw ) 改变读写权限
ro readonly 只读
rw readwrite 可读可写
一旦设置容器权限,容器对挂载出的内容就有限定

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

初始Dockerfile

方式二:Dockerfile挂载数据卷

Dockerfile就是用来构建docke镜像的构建文件,是一段命令脚本,通过脚本可以生成镜像,镜像是一层一层的,脚本是一行一行的命令,每个命令都是一层!!

① 编写dockerfile脚本 (指令都是大写)

FROM centos

VOLUME ["volume1","volume2"]

CMD echo "-----end-----"

CMD /bin/bash

② 构建镜像

docker build -f dockerfile全路径 -t 镜像名称 .

在这里插入图片描述
构建成功,生成镜像

在这里插入图片描述

③ 启动容器

docker run -it 8eb8e022a7af /bin/bash

在这里插入图片描述

生成的数据卷与外部一定有一个同步的目录。

在容器中创建一个文件`container.txt

在这里插入图片描述

在这里插入图片描述

查看数据卷挂载的路径:

在这里插入图片描述

查看在容器中创建的 文件是否同步到主机

在这里插入图片描述
发现数据同步成功!!

数据卷容器

容器和容器之间的数据进行同步!

在这里插入图片描述

① 启动3个容器
启动docker01

在这里插入图片描述
启动docker02

在这里插入图片描述
② 在docker01中volume1目录下创建docker01文件

在这里插入图片描述
③ 查看docker02中volume1目录下是否存在docker01文件

在这里插入图片描述
docker01中的数据挂载到了docker02上,实现数据同步,docker01叫做数据卷容器!

④ 启动docker03容器挂载docker01

在这里插入图片描述
⑤ 在docker03中创建数据,在docker01中查看也是存在的。

在这里插入图片描述在这里插入图片描述
⑥ 删除docker01容器,数据依旧可以访问!

⑦ 多个mysql实现数据共享

 docker run -d -p 3306:3306  -v /etc/mysql/conf.d
 -v /var/lib/mysql 
 -e MYSQL_ROOT_PASSWORD=123456 
   --name mysql01 mysql:5.7

 docker run -d -p 3306:3306  -v /home/mysql/conf:/etc/mysql/conf.d
 -v /home/mysql/data:/var/lib/mysql 
 -e MYSQL_ROOT_PASSWORD=123456 
   --name mysql02 --volumes-from mysql01 mysql:5.7

最后总结

  • 容器数据卷的本质就是实现数据的持久化、数据的共享!
  • 三种实现方式:1.手动-v 命令。2.使用Dockerfile构建镜像,自动挂载数据。3.使用--volumes-from实现容器之间的数据共享,数据同步
  • 容器之间配置信息的传递,数据卷容器的生命后期一直持续到没有容器为止!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。