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

2022-12-01 15:06:01 浏览数 (1)

目录
  • 容器数据卷介绍
  • 使用数据卷
    • MySQL 数据同步
    • 具名挂载和匿名挂载
    • 初始Dockerfile
    • 数据卷容器
  • 最后总结

容器数据卷介绍

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

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

使用数据卷

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

代码语言:javascript复制
docker run -it -v 主机目录:容器内目录

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

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

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

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

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

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

重新启动容器

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

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

MySQL 数据同步

① 拉取MySQL镜像到本地

② 运行容器挂载数据

代码语言:javascript复制
 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 容器内路径 (不指定主机名,只指定容器内路径)

代码语言:javascript复制
docker run -d -P --name nginxtest -v /etc/nginx nginx

查看所有 volume 信息

代码语言:javascript复制
docker volume ls

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

具名挂载

-v 卷名:容器内路径

代码语言:javascript复制
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

查看数据卷具体的位置

代码语言:javascript复制
docker volume inspect 名称

Docker中所有的数据卷,如果没有指定目录的情况下,都在/var/lib/docker/volumes/ 目录下。

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

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

拓展

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

代码语言:javascript复制
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脚本 (指令都是大写)

代码语言:javascript复制
FROM centos

VOLUME ["volume1","volume2"]

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

CMD /bin/bash

② 构建镜像

代码语言:javascript复制
docker build -f dockerfile全路径 -t 镜像名称 .

构建成功,生成镜像

③ 启动容器

代码语言:javascript复制
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实现数据共享

代码语言:javascript复制
 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实现容器之间的数据共享,数据同步
  • 容器之间配置信息的传递,数据卷容器的生命后期一直持续到没有容器为止!

0 人点赞