docker容器的数据管理
- Kubernetes
- 2024-04-24
- 1858热度
- 0评论
docker容器的数据管理
什么是数据卷?
数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷 设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。
数据卷的特点:
1.数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
2.数据卷可以在容器之间共享和重用
3.可以对数据卷里的内容直接进行修改
4.数据卷的变化不会影像镜像的更新
5.卷会一直存在,即使挂载数据卷的容器已经被删除
操作:
为容器添加数据卷
docker run -itd --name volume -v /datavolume:/data centos /bin/bash
参数 | 解释 |
---|---|
-v | 在容器内创建一个挂载点,并将本地主机上的目录或文件挂载到容器内部。其语法为 -v <主机路径>:<容器路径> |
/datavolume | 本地主机上的目录,不需要提前创建 |
/data | 容器内的目录,即正在运行的容器中的文件系统 |
为数据卷添加访问权限
[root@docker-master ~]# docker run --name volume1 -v /datavolume1:/data:ro -itd centos /bin/bash
12cce6604549c6aeeb51154e06bb1c7bf3e56128f022963589796e3e28043030
在物理机目录下创建文件
[root@docker-master ~]# touch /datavolume1/1.txt
登录容器,查看目录是否已经被挂载
[root@12cce6604549 /]# ls /data/
1.txt
尝试创建和删除文件,提示失败
[root@12cce6604549 /]# touch /data/2.txt
touch: cannot touch '/data/2.txt': Read-only file system
[root@12cce6604549 /]# rm /data/1.txt
rm: remove regular empty file '/data/1.txt'? y
rm: cannot remove '/data/1.txt': Read-only file system
dockerfile 构建包含数据卷的镜像
创建volume目录,切换到目录内,编写dockerfile
[root@docker-master ~]# mkdir /volume
[root@docker-master ~]# cd /volume/
[root@docker-master volume]# vim dockerfile
FROM centos
VOLUME ["datavolume3","datavolume4"]
CMD /bin/bash
构建镜像,启动容器
[root@docker-master volume]# docker build -t="volume" .
[+] Building 0.1s (5/5) FINISHED
...省略部分输出...
[root@docker-master volume]# docker run -itd --name volume-2 volume
e1bcd416ba07509b1350e6ce97d9cccda969517df14031237893b3ac483376a1
进入容器内部,查看是否有两个目录,/datavolume3 和/datavolume4
[root@docker-master volume]# docker exec -it volume-2 /bin/bash
[root@e1bcd416ba07 /]# ls | grep data
datavolume3
datavolume4
docker 的数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷 容器
挂载数据卷容器的方法
docker run --volumes-from [container name]
通过刚才创建的volume镜像,创建容器,并在容器内的datavolume3目录创建pod.txt文件
[root@docker-master ~]# docker run -itd --name data-volume volume
f08b43f98defb8ef6c1e21d98433b494de3fcf8968ae7e037a82ab39b87097e6
[root@docker-master ~]# docker exec -it data-volume /bin/bash
[root@f08b43f98def /]# touch /datavolume3/pod.txt
[root@f08b43f98def /]# exit
exit
创建新容器挂载 data-volume容器创建的数据卷
[root@docker-master ~]# docker run -itd --volumes-from data-volume --name data-volume2 centos
b628a67c76a85861d6850f86f85ef0009d076e573b6075a7efccfc14ec841527
进入容器内部,查看容器是否挂载了/datavolume3目录,目录内的文件是否正确
[root@docker-master ~]# docker exec -it data-volume2 /bin/bash
[root@b628a67c76a8 /]# ls /datavolume3/
pod.txt
docker数据卷的备份和还原
数据备份方法:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]
例子:
运行一个备份容器,备份的目标为data-volume2容器的datavolume3目录,备份文件的名称为data-volume2.tar.gz,存放在容器内部的backup目录和宿主机的/root/backup目录下
[root@docker-master ~]# docker run --volumes-from data-volume2 -v /root/backup:/backup --name volume-bk centos tar zcvf /backup/data-volume2.tar.gz /datavolume3
tar: Removing leading `/' from member names
/datavolume3/
/datavolume3/pod.txt
查看备份效果
[root@docker-master ~]# cd /root/backup/
[root@docker-master backup]# ls
data-volume2.tar.gz
[root@docker-master backup]# tar -zxvf data-volume2.tar.gz -C ./
datavolume3/
datavolume3/pod.txt
[root@docker-master backup]# ls ./datavolume3/
pod.txt
数据还原方法:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar xzvf /backup/backup.tar.gz [container data volume]
例子:
删除data-volume2容器datavolume3目录下的文件
[root@docker-master ~]# docker exec -it data-volume2 /bin/bash
[root@b628a67c76a8 /]# rm -rf /datavolume3/*
[root@b628a67c76a8 /]# ls /datavolume3/
[root@b628a67c76a8 /]# exit
exit
创建一个还原容器,还原被删除的pod.txt文件
[root@docker-master ~]# docker run --volumes-from data-volume2 -v /root/backup/:/backup centos tar zxvf /backup/data-volume2.tar.gz -C /datavolume3
datavolume3/
datavolume3/pod.txt
观察还原效果
[root@docker-master ~]# docker exec -it data-volume2 /bin/bash
[root@b628a67c76a8 /]# cd /datavolume3/
[root@b628a67c76a8 datavolume3]# cd datavolume3/
[root@b628a67c76a8 datavolume3]# ls
pod.txt