06-Docker存储管理¶
存储管理简介¶
什么是数据卷
数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷 设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删 除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可 以只支持多个容器的访问。
数据卷的特点
1.数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
2.数据卷可以在容器之间共享和重用
3.可以对数据卷里的内容直接进行修改
4.数据卷的变化不会影像镜像的更新
5.卷会一直存在,即使挂载数据卷的容器已经被删除
构建存储数据卷¶
创建一个centos容器,挂载/data目录,挂载的时候可以指定权限,ro,rw等
创建容器(挂载单个目录)
mkdir -p /opt/data/
echo "hello world" > /opt/data/hello.txt
docker run --name centos01 -v /opt/data/:/opt/data/ -it centos:7.9.2009 /bin/bash
[root@54c01feb4551 /]# cat /opt/data/hello.txt
hello world
# 清理环境
rm -fr /opt/data/
docker rm centos01
创建容器(挂载单个目录,配置数据卷只读权限)
mkdir -p /opt/data/
echo "hello world" > /opt/data/hello.txt
docker run --name centos01 -v /opt/data/:/opt/data/:ro -it centos:7.9.2009 /bin/bash
[root@4cf7d298ce59 /]# echo "111" >> /opt/data/hello.txt
bash: /opt/data/hello.txt: Read-only file system
[root@4cf7d298ce59 /]#
# 清理环境
rm -fr /opt/data/
docker rm centos01
创建容器(挂载多个目录)
mkdir -p /opt/data01/
echo "hello world data01" > /opt/data01/hello.txt
mkdir -p /opt/data02/
echo "hello world data02" > /opt/data02/hello.txt
docker run --name centos01 -v /opt/data01/:/opt/data01/ -v /opt/data02/:/opt/data02 -it centos:7.9.2009 /bin/bash
[root@499bf4ed2a34 /]# cat /opt/data01/hello.txt
hello world data01
[root@499bf4ed2a34 /]# cat /opt/data02/hello.txt
hello world data02
# 清理环境
rm -fr /opt/data01
rm -fr /opt/data02
docker rm centos01
数据卷参数说明
-v /data 挂载data目录
-v file 挂载一个文件
-v src:dst 指定一个挂载目录,开发常用,挂载物理机代码所在目录,nginx直接使用代码
/data对应的物理机的路径
mkdir -p /opt/data/
echo "hello world" > /opt/data/hello.txt
docker run --name centos01 -d -v /opt/data/:/opt/data/ -it centos:7.9.2009 /bin/bash
[root@docker ~]# docker inspect 33d7aab48fa7 |grep -A 5 "Mounts"
"Mounts": [
{
"Type": "bind",
"Source": "/opt/data",
此物理机所在路径就是容器对应的/data路径
"Destination": "/opt/data",
"Mode": "",
# 清理环境
rm -fr /opt/data/
docker rm -f centos01
构建数据卷容器¶
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器
启动一个容器挂载/data目录,-d启动就放在后台
mkdir -p /data
echo "This is myvolume" >/data/myvolume.txt
docker run --name myvolume -v /data:/data:rw -itd centos:7.9.2009 /bin/bash
启动一个容器,挂载到刚才的容器的/data目录
[root@docker ~]# docker run -itd --name centos-myvolume --volumes-from myvolume centos
[root@docker ~]# docker exec -it centos-myvolume /bin/bash
[root@07dc24dd438b /]# cat /data/myvolume.txt
This is myvolume
[root@07dc24dd438b /]# echo "This is chris" >>/data/myvolume.txt
在物理机中创建个目录在myvolume-test容器内检查挂载情况
[root@docker ~]# docker ps |grep myvolume
4f430d56682c centos "/bin/bash" About a minute ago Up About a minute myvolume-test1
[root@docker ~]# docker inspect 4f430d56682c|grep -A 5 Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/data",
"Destination": "/data",
"Mode": "rw",
在容器宿主机执行如下命令,检查数据的写入情况:
[root@linux-bkce-node21 ~]# cat /data/myvolume.txt
This is myvolume
This is chris
数据卷的备份和还原¶
数据备份方法:
[root@linux-bkce-node21 ~]# docker exec -it myvolume /bin/bash
[root@28d5c378baa5 /]# cat /data/myvolume.txt
This is myvolume
This is chris
mkdir -p /root/backup
docker run --volumes-from myvolume -v /root/backup:/backup --name myvolume-copy centos tar zcvf /backup/myvolume-backup.tar.gz /data/
数据还原方法:
[root@linux-bkce-node21 ~]# docker exec -it myvolume /bin/bash
[root@28d5c378baa5 /]# rm -f /data/myvolume.txt
[root@28d5c378baa5 /]# ls -l /data/
total 0
[root@28d5c378baa5 /]#
docker run --volumes-from myvolume -v /root/backup/:/backup centos tar zxvf /backup/myvolume-backup.tar.gz -C /
[root@linux-bkce-node21 ~]# docker exec -it myvolume /bin/bash
[root@28d5c378baa5 /]# cat /data/myvolume.txt
This is myvolume
This is chris
清理环境
docker rm -f centos-myvolume
docker rm -f myvolume