docker数据卷——数据卷管理(bind mount+docker managed volume )

1.docker数据卷的介绍

1.为什么用数据卷?
docker分层文件系统性能差,生命周期与容器相同(容器删除,文件也丢失)
而docker数据卷是mount到宿主机中,绕开了分层文件系统,和主机磁盘性能相同,容器删除后依然保留,但是仅限本地磁盘,不能随容器迁移。

docker官方提供两种卷:
1.bind mount
2.docker managed volume

2.bind mount

bind mount:将主机上的目录或文件直接mount到容器里,使用直接,高效

2.1 bind mount挂载文件到容器

docker run -d --name web1 -p 80:80 -v /opt/website: /usr/share/nginx/html nginx容器里/usr/share/nginx/html是nginx 的默认发布目录
curl localhost
docker exec web1 mount 在容器里执行mount命令
看到/dev/mapper/rhel-root,也就是我们的根目录,挂接到容器的/usr/share/nginx/html
vim /opt/website/index.html 编辑nginx 的默认发布主页
curl localhost


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.2 在容器内修改挂载内容

docker container attach web1 应用容器不能这样,这样操作会卡住,ctrl+c后容器会自动退出
docker start web1开启web1容器
docker exec -it web1 bash -it是exec的选项,bash表示在容器内执行的操作,打开一个bash ,在容器中修改
curl localhost 数据也已经更改


在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在容器内更改的数据其实就是宿主机上的数据。
这种方式,不存在的目录会自动新建(无论容器还是宿主机),但是会以宿主机为准,绑定挂接到容器后,容器中的对应目录如果有数据,就会被覆盖。


2.3 只读挂载

bind mount方式挂载时默认权限是rw,可以在挂载时指定只读(ro)
docker run -it --name vm1 -v/ opt/data1:/data1 -v /opt/data2:/data2:ro ubuntu 这些目录在宿主机和容器内都是没有的 ,data1读写挂载,data2只读挂载
cd /opt/data2
touch file2可以建立文件
docker container attach vm1 可以看到 file2

在这里插入图片描述


2.4 挂载yum源

docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo rhel7 bash 挂载yum源,注意要给一个 bash
也可以
docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo:ro rhel7 bash 加上只读选项,让yum源不能被更改

在这里插入图片描述


3.docker managed volume(docker管理卷)

bind mount必须指定宿主机文件系统路径,移植性差(如果容器在A主机上crash掉,B主机上如果没有对应路径,无法进行移植)

docker managed volume不需要指定宿主机文件系统路径,docker自动为容器创建,默认数据卷目录都在 /var/lib/docker/volumes
如果挂载时指向容器内已有的目录,原数据会被复制到volume中

3.1 docker managed volume挂载文件

docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx
curl localhost 发现可以访问,看到nginx主页
docker inspect web1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3.2 指定数据卷目录

docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
curl localhost
docker inspect web2
在这里插入图片描述
在这里插入图片描述


3.3 删除容器及数据卷

docker rm -f web2 删除之前的容器
docker volume ls查看卷,发现容器删除了,数据还在
docker volume rm b29ea012d9b02b3fc410834c6da4d0bd4bca3e1cf4ae95e5b3bda71cfe0e85a1删除
docker volume prune 删除所有没有被容器使用的卷,如果容器较多,一个一个删除麻烦

在这里插入图片描述


3.4 删除容器恢复数据卷

docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
docker rm -f web2 删除之前的容器
docker volume ls查看卷,发现容器删除了,数据还在
docker volume create webdata 创建一个数据卷
cp /var/lib/docker/volumes/website2/_data/* /var/lib/docker/volumes/webdata/_data/拷贝数据
docker run -d --name web2 -p 80:80 -v webdata:/usr/share/nginx/html nginx创建web2依然可以使用web1的数据
curl localhost 可以访问
echo linux > /var/lib/docker/volumes/webdata/_data/index.html更改发布面也可以访问

在这里插入图片描述在这里插入图片描述
在这里插入图片描述


3.5 多个容器挂载同一个目录

还可以使用这种方式让多个容器挂载同一个目录
docker run -d --name web3 -v webdata:/usr/share/nginx/html nginx再新建一个容器,去掉端口映射
docker inspect web3
curl 172.17.0.3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述只要数据卷在,再次启动容器数据依然保留。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章