Docker和DevOps:13.Docker的持久化存储和数据共享

195 阅读4分钟

Docker的持久化存储和数据共享

一、基本介绍

1.镜像Image和容器Container

在这里插入图片描述
插入的数据存放在容器层,一旦将容器删除,插入的数据也会随着被删除,造成数据丢失。

2.Docker持久化方案
  • 基于本地文件系统的Volume(文件集)
    可以在执行docker run时,通过-v参数将主机的目录作为容器的数据卷。
  • 基于第三方的文件集,例如NAS。不需要了解。
3.基于本地文件系统的Volume的类型
  • Data Volume
    docker管理的文件集,由docker自动创建。
  • Bind Mounting
    绑定挂载的文件集,具体挂载位置可以由用户指定。

二、Data Volume

1.基本介绍
  • 在dokerfile中可以使用volume参数指定一个路径为待映射路径,docker会对这个待映射路径进行管理。
  • 当容器创建时,docker会为该容器在/var/lib/docker/volumes/目录下创建一个volume,名字默认为一串字符xxxxxx。
  • 存储到容器中的待映射路径中的内容都会被转存到/var/lib/docker/volumes/xxxxxx/下
    在这里插入图片描述
2.以mysql为例查看docker自动创建的volume
  • 查看mysql的dockerfile
    docker hub中的mysql镜像的dockerfile中有一个VOLUME配置项,指定了mysql服务的默认存储路径(/var/lib/mysql)为volumn,这个容器中的该路径就会交由docker管理,存到该路径下的内容就会被存储到docker自动创建的volume中。
    在这里插入图片描述
  • 创建mysql容器
docker run -d --name=mysql_1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:latest

在这里插入图片描述

  • 查看docker自动创建的volume
docker volume ls

在这里插入图片描述

  • 查看volume的详细信息
docker volume inspect [volume名字]

在这里插入图片描述

  • 再创建一个mysql容器并查看volume
    在这里插入图片描述
  • 清理容器
docker stop mysql_1 mysql_2
docker rm mysql_1 mysql_2
--删除容器并不会删除volumn,所以需要手动删除
docker volume rm [volume名称]

在这里插入图片描述

2.友好的volume名称

上面可以发现docker自动创建的volumn名称并不是特别友好,我们可以指定volumn名称。

  • 指定volume名称
docker run -d --name=mysql_1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:latest

添加-v [volume名称]:[dockerfile中volume的路径]来指定volume的名称

  • 查看docker创建的volume
    在这里插入图片描述
3.持久化存储和数据共享
  • 登录容器中的mysql
    在这里插入图片描述
  • 查看已有数据库
    在这里插入图片描述
  • 创建数据库
    在这里插入图片描述
  • 强制停止并删除容器mysql_1
docker rm -f [容器名称]

在这里插入图片描述

  • 创建容器mysql_2,并指定volume名称仍使用mysql
docker run -d --name=mysql_2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:latest

在这里插入图片描述

  • 登录容器mysql_2中的mysql
    在这里插入图片描述
  • 查看数据库
    会发现之前创建的docker数据库依然存在,也就是做到了持久化存储和数据共享。
    在这里插入图片描述

三、Bind Mounting

1.基本介绍
  • Data Volume需要在dockerfile中使用VOLUME参数指定一个待映射路径,docker才能进行管理。
  • Bind Mounting不需要在dockerfile中做修改,在启动容器时直接指定本机的一个路径与容器内的一个路径做映射即可,容器内的该路径下有文件变更时,本机的映射路径下的文件也会同时做出改变。
    在这里插入图片描述
2.指定文件夹映射
  • 在本机创建一个文件夹
    下面就把容器中的文件夹与本机这个/root/docker/share文件夹做映射
    在这里插入图片描述
  • 构建容器
    编写一个dockerfile,基于centos,创建/app/share/excel目录:
FROM centos:latest
WORKDIR /app/share/excel

基于dockerfile构建镜像
在这里插入图片描述

  • 启动容器并指定文件夹映射
docker run -dit --name=docker_share -v /root/docker/share:/app/share/excel docker_share_test:latest

在这里插入图片描述
使用-v [本机路径]:[容器内路径]参数将两个文件夹互相映射起来

3.验证文件夹映射是双向的
  • 在容器内的路径新增文件
    在容器内的/app/share/excel目录下新增文件test.txt
    在这里插入图片描述
    在本机的映射路径下查看,发现在本机也有了一个test.txt
    在这里插入图片描述
  • 在本机的路径新增文件
    在本机的/root/docker/share/路径下新增文件test2.txt
    在这里插入图片描述
    登入容器中查看映射路径下,也有了该文件
    在这里插入图片描述
    这说明他们的映射关系是双向的。