Docker数据卷技术

体验

体验以下,类似于双向绑定的一种数据同步技术:

1
docker run -it -v /home/ceshi:/home centos /bin/bash

-v 代表挂载,宿主机文件地址:容器地址

我在centos的/home目录下创建了一个test.java,结果在我自己的服务器上的/home/ceshi里面找到了我新建的文件;

练习

第一种:使用-v

复制数据库:

1
docker run -d -p 3333:3306 -v /home/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql

我们把数据放在本地,使用 docker inspect 容器ID查询容器的挂载情况

image-20201130153525831

  • source代表的是本地目录,下面的那个菜单代表的是我们的容器地址

我们无论在哪里修改数据,在服务器或者在容器内,这样都会改变两边的数据;

第二种:使用DockerFile

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。

编写脚本:

1
2
3
4
5
6
7
vim dockerfile1
###################
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "-------end------"
CMD /bin/bash
######################

使用脚本生成镜像 挂载:

1
docker build -f /home/Docker_test/dockerfile1 -t centos .

image-20201130155003708

进入容器,发现多了两个文件夹,于是我们在里面添加和修改文件,看一下宿主机的情况如何;

使用 **docker inspect **发现挂载的文件所在地方,我们去到那个文件地址并添加一些数据,查看变化

image-20201130155221946

我在宿主机和容器里面添加了数据发现,两边都会定向修改,达到我们的目的,实现了在两个地方修改数据,数据都会同步

匿名和具名挂载

1
2
3
4
5
6
7
8
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx

上面的两种挂载方式都没有指明挂载的所在位置;

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为 数据卷容器。 我们使用上一步的镜像:centos 为模板,运行容器 saxon01,saxon02他 们都会具有容器卷

实现的目的是,docker内部的容器的数据统一,数据之间可以互用;

第一步,先建立一个根容器,里面已经挂载数据卷

1
docker run -it -d -v 

第二步,使用–volumes-from name 关联一个我们已经创建的容器

image-20201130165446082

第三步,在主容器里面添加记录

image-20201130165859908

接着查看副容器里面的数据;

image-20201130165809665

最后查看宿主机上的数据,查看二号机的数据 在查看刚才添加的数据:

image-20201130170431804

得出结论: 容器之间配置信息的传递是一种双向绑定关系,数据卷的生命周期一直持续到没有容器使用它为止。 存储在本机的文件则会一直保留!