1.什么是Dokcer容器数据卷?
数据卷是一个或多个容器中专门指定的目录,它能够绕过联合文件系统
卷被设计用作数据持久化、并且是独立于容器的生命周期的
docker是一个分层文件系统,性能比较差,生命周期和容器是相同的,容器删除,里面的内容就没有了
数据卷是mount到宿主机上的,这就绕开了分层的文件系统,和主机的磁盘性能是相同的,而且容器删除后,文件会依然保留,但这个仅限于本地磁盘,不能随容器去迁移
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的
docker官方提供两种卷:
bind mount,直接在宿主机的文件系统中但是容器可以访问;
docker managed volume磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件
数据卷是在(如果没有网络文件系统等情况下)宿主机文件系统里面的,
第一种是在宿主机内的特定目录下,
第二种在docker管理的目录下/var/lib/docker/volumes/
2.数据卷特点
(1)数据卷可以在容器之间共享或重用数据
(2)数据卷中的更改可以直接生效
(3)数据卷中的更改不会包含在镜像的更新中
(4)数据卷的生命周期一直持续到没有容器使用它为止
3.bind mount数据卷演示
bind mount:将主机上的目录或文件直接mount到容器里
(1)挂载文件到容器
docker run -d --name web1 -p 80:80 -v /opt/website: /usr/share/nginx/html nginx ##容器里/usr/share/nginx/html是nginx 的默认发布目录
curl localhost ##当前无资源,出现403报错
docker exec web1 mount ##在容器里执行mount命令,不进入容器中
##可以看到/dev/mapper/rhel-root(根目录),挂接到容器的/usr/share/nginx/html上
vim /opt/website/index.html ##编辑nginx 的默认发布主页
curl localhost ##可以访问到资源内容
(2)在容器内修改挂载内容
docker container attach web1 ##应用容器不能这样进,会卡住,这是因为ubuntu会给你一个交互式shell,nginx只是打开了nginx,并没有给你交互式的shell
docker history ubuntu:latest
docker history nginx:latest
docker start web1 ##开启web1容器
docker exec -it web1 bash ##以交互方式给它执行一个bash命令,bash表示在容器内执行操作,打开一个bash ,在容器中修改
curl localhost ##数据已经更改,达到预期效果
注意:
在容器内更改的数据事实上是宿主机上的数据
这种方式,不存在的目录会自动建立(无论容器还是宿主机),但是会以宿主机为准,绑定挂接到容器后,容器中的对应目录如果有数据,就会被覆盖
(3)指定挂载时是只读挂载
bind mount方式挂载时默认权限是rw,现在指定在挂载时只读ro
docker run -it --name vm1 -v /opt/data1:/data1 -v /opt/data2:/data2:ro ubuntu ##这些目录在宿主机和容器内都是没有的 ,data1读写挂载,data2只读挂载
cd data1/
touch file1 ##可以建立文件
cd ../data2
touch file2 ##不可以建立