docker|Docker学习007 -- Docker数据卷 数据卷容器

目录

1.数据卷是什么
2.容器中数据管理的方式
【docker|Docker学习007 -- Docker数据卷 数据卷容器】3.数据卷分类
3.1宿主机数据卷
3.2命名数据卷
3.3匿名的数据卷
4.数据卷容器

1.数据卷是什么 在使用docker容器时,会产生一系列的数据文件,这些数据文件会在我们删除docker时被删除,但是其中产生的部分数据时希望被保存下来做其他事情的,docker将应用与运行环境打包成容器发布,我们希望在运行过程中产生的部分数据是可以持久化的,而且容器之间能够实现数据共享。
简单的说:docker容器的数据卷可以被理解成U盘,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,docker不会再容器删除时将其挂载的数据卷删除。
特点:

  1. 数据卷可以在容器间数据共享或重用
  2. 更改可理解生效,但不包含挂载文件中的配置文件
  3. 数据更改只针对容器
  4. 数据卷默认一直存在,但是可以手动删除
  5. 生命周期会伴随着容器使用而存在
2.容器中数据管理的方式
  • 数据卷:容器内数据直接映射到宿主机环境
  • 数据卷容器:使用特定容器维护数据卷
3.数据卷分类
  • 宿主机数据卷:直接在宿主机文件系统同,但是容器可以访问
  • 命名的数据卷:磁盘上Docker管理的数据卷,但是卷有名字
  • 匿名的数据卷:磁盘上Docker管理的数据卷,无名字,docker管理这些文件
3.1宿主机数据卷 3.1.1特点:
  1. 数据可以被保存在任意位置
  2. 宿主机的目录或者文件被挂载到容器中,容器按照挂载目录或文件的绝对路径,来使用或修改宿主机的数据。宿主机挂载不需要预先创建目录
  3. 使用宿主局数据卷的容器可以再通过容器内部的进程对主机文件系统进行修改,共享CURD系统目录和文件
3.1.2宿主机数据卷实战
①先创建mysql容器
命令:
docker run
-v宿主机挂载路径 :容器路径
测试路径:-v /data/mysql:/var/lib/mysql
docker run -itd --name mysql --restart always -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.37 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

②本地连接mysql容器,并创建数据库
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

navicat连接到mysql,创建mytest数据库,新建tb_user表,并在表中新增两条数据
此时在宿主机中 /data/mysql 可以看到新建了一个mytest文件
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

③删除mysql容器
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

删除mysql容器,此时宿主机的 /data/mysql 文件仍然存在
使用navicat 访问mysql 已经访问不到了
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

④重新创建mysql容器
再次创建mysql容器
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

⑤再次查看数据库,看是否还有之前创建的数据库
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

⑥以上,实现了mysql删除后,数据仍然存在的操作。
但是存在问题:如果初始化的mysql有表数据,但是通过这种方式,会将 / data/mysql的数据覆盖mysql中的表数据
3.2命名数据卷命令
docker run
-v卷名 :容器路径
测试路径:-vtestnginx:/var/lib/mysql
docker run -itd --name nginx2 -v testnginx:/etc/nginx nginx:1.19.3-alpine

docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

通过 docker volume ls查看所有的卷
通过docker volume inspect testnginx查看卷的路径
命名数据卷没有指定路径,定义卷名,docker会在默认路径挂载路径
3.3匿名的数据卷 命令
docker run
-v容器路径
测试路径:-v/var/lib/mysql
docker run -itd --name nginx1 -v /etc/nginx nginx:1.19.3-alpine

docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片


启动一个nginx1容器,使用匿名数据卷
docker volume ls 查看所有的数据卷
docker volume inspect卷名查看数据卷地址
进入路径中,同样生成名为 _data 的文件
4.数据卷容器 之前是容器直接与宿主机挂载,现在容器先与数据卷容器挂载,数据卷容器再与宿主机挂载
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

语法:
dockerrun
data-volum 数据卷容器名称
0.使用 centos:7.8.2003作为数据卷容器
dockerpull centos:7.8.2003

①数据卷容器先与宿主机挂载,挂载目录为 nginx 和mysql两个目录
docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v /data/mysql:/var/lib/mysql centos:7.8.2003

docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

****这里注意,不需要管centos是否启动,都可以作为数据卷容器使用
docker ps 查看到centos没有启动, /data 目录生成了两个文件夹
②此时新建一个nginx容器,将容器通过volums-from 挂载到 /data/nginx目录
docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3-alpine

docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

通过ls查看目录下没有任何文件,此时通过浏览器访问nginx页面也没有内容
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

③ 在 /data/nginx 创建一个index.html 并输入内容
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

再次通过浏览器访问,可以看到index.html 的内容
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

④此时再启动一个nginx02,端口映射为81,挂载的仍是data-volum,此时通过浏览器访问nginx02,得到的页面内容也是和nginx01相同的
docker|Docker学习007 -- Docker数据卷 数据卷容器
文章图片

所以,通过数据卷容器挂载相同的目录,可以共用一个文件内容

    推荐阅读