目录
一、数据卷简介
1、引言
docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除docker,或者重新启动时,之前的更改将会消失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
2、什么是数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性: – 数据卷可以在容器之间共享和重用 – 对数据卷的修改会立马生效 – 对数据卷的更新,不会影响镜像 – 数据卷默认会一直存在,即使容器被删除 Docker中提供了两种挂载方式,-v和-mount
3、为什么使用数据卷?
Docker的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。
- 容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问
- 多个容器之间的数据无法共享
- 当删除容器时,容器产生的数据将丢失
为了解决这些问题,Docker引入了数据卷(volume)机制。volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。
- volume在容器创建时就初始化,在容器运行时就可以使用其中的文件
- volume能在不同的容器之间共享和重用
- 对volume中的数据的操作会马上生效
- 对volume中数据操作不会影响到镜像本身
- volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除
二、数据卷的基本使用
1、创建数据卷
docker volume create mydata
2、查看所有数据卷
docker volume ls
3、查看数据卷信息
docker volume inspect mydata
MountPoint为数据在本机存放的位置
三、Docker安装nginx并使用数据卷配置同步映射
这里可以参考我的另一篇博客
Docker安装nginx并使用数据卷配置同步映射.
四、Docker 安装MySQL并使用数据卷实现数据持久化
这里可以参考我的另一篇博客
Docker 安装MySQL并使用数据卷实现数据持久化.
五、具名和匿名挂载
1、匿名挂载
-v 容器内路径
docker run -d -P --name nginx02 -v /ect/nginx nginx
这种就是匿名挂载,-v 只写了容器内的路径,没有写容器外的路径
2、具名挂载
通过 -v 卷名:容器内路径
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
所有的docker容器内的卷,没有指定目录的情况下 都在 /var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便找到我们的一个卷,因此大多数情况下使用具名挂载
3、具名挂载、匿名挂载和指定路径挂载如何区分
- 匿名挂载
-v 容器内路径
- 具名挂载
-v 卷名:容器内路径
- 指定路径挂载
-v /宿主机路径:容器内路径
4、拓展
- 通过 -v 容器内路径: ro rw 改变读写权限
只读:ro readonly
可读可写 : rw readwite
- 一旦设置了容器权限,容器挂载出来的内容就有限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!
六、数据卷之DockerFile
1、创建dockerfile文件
输入 i 进入编辑模式
文件中的内容 指令(大写)
按Esc返回,输入 :wq 退出并保存
vim dockerfile1
文件中的每个命令,就是镜像的一层!
2、生成镜像
docker build -f dockerfile1 -t lyp/centos .
3、运行自己创建的镜像
这个卷和外部一定有一个同步的目录
4、查看容器信息
5、查看一下卷挂载的路径
6、测试一下刚才的文件是否同步出去
这种方式使用十分多,因为通常要自己构建镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
七、数据卷容器
1、运行镜像,容器命名为docker01
docker run -it --name docker01 [镜像ID]
2、运行镜像,容器命名为docker02,并使用数据卷实现容器间数据共享
docker run -it --name docker02 --volumes-from docker01 lyp/centos
3、在容器docker01中新建文件
4、运行容器docker03,继续测试
- 此时docker01与docker02容器都在运行中
- 在容器docker03中新建文件
- 进入docker01和docker02中进行查看
显然这三个容器通过 –volume-from 实现了数据同步
5、退出docker01,并删除,测试数据是否还同步
exit
docker ps
docker ps -a
docker rm -f [容器ID]
- 查看docker01与docker02的数据是否还存在
测试依旧可以访问
结论:
- 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
- 如果持久化到了本地,这个时候,本地的数据是不会删除的!
6、多个MySQL实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:8.0
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-from mysql01 mysql:8.0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122969.html