Ubantu docker学习笔记(六)容器数据卷
在Docker的世界里,数据卷就像一艘永不沉没的船,承载着你的宝贵数据在容器之间航行。容器虽然生来短暂,但数据可以永存!今天,我们就一起来探索这些神奇的“数据船”——容器数据卷。
你有没有在容器里创建过文件,结果容器一关闭就再也找不到了?数据卷就是解决这个问题的救星!它像是一个磁铁,把数据牢牢吸在宿主机上,即使容器消失,数据仍在。
比如,你在容器里写了一篇超棒的博客,不想它随容器消失,怎么办?答案就是用数据卷!只需在启动容器时加上-v参数,比如docker run -v /mydata:/data,你的博客就会在宿主机的/mydata目录中保存下来。
还有一个小秘密:数据卷还能让不同容器共享数据,就像是给多个小伙伴共享一个秘密基地。比如,你可以创建一个数据卷容器,然后用docker run --volumes-from把它挂载到其他容器上,所有容器都能看到同一个数据仓库。
不过,数据卷也有点“调皮”,比如默认情况下,它们是可写的,数据随便改。怎么办?我们可以给它上个“枷锁”,加个ro只读属性。比如-v /mydata:/data:ro,这样容器只能看不能改,就像进了档案馆,只能看不能动。
最后,别忘了给数据卷拍个照——备份!毕竟,数据金贵,不能让它说没就没。用docker run创建个备份容器,把数据卷内容复制出来,或者用docker export命令导出容器,数据就安全了。
说了这么多,问题来了:你平时是怎么管理容器数据的?是不是也遇到了过数据“消失”的尴尬?或者,你已经是个数据卷的老司机,用过哪些高招?欢迎在评论区聊聊你的故事!
文章目录
- 一、容器数据卷
- 二、容器卷挂载
-
- 2.1 在命令行挂载数据卷
- 2.2 通过dockerfile挂载数据卷
- 三、数据卷容器
- 四、备份数据卷
- 五、数据卷的恢复和迁移
-
- 5.1 恢复数据卷
- 5.2 迁移数据卷
- 六、管理数据卷
-
- 6.1 与容器关联
-
- (1)例子一
- (2)例子二
- (3)例子三
- 6.2 命令管理
一、容器数据卷
由于我们rootfs机制与我们的namespce,构建出来的文件分离系统,会导致我们产生数据文件,但是数据文件会随着我们容器的关闭而关闭,但是我们用户希望我们所产生的数据可以持久化,不同容器之间可以互通,也就是我们容器数据卷要解决的问题。
Docker绑定的就是Linux的绑定挂在机制,允许用户将一个目录或者文件挂载到一个文件系统中,原挂载点会被隐藏没有任何影响,从而实现共享。
(1)容器启动时初始化,如果容器使用的镜像包含数据卷,这些数据也会复制到数据卷中。
(2)容器对数据卷的修改是直接生效的。
(3)数据卷的变化不会影响镜像的更新。数据卷独立于联合文件系统,像基于联合文件系统,镜像与数据卷不会相互影响。
(4)数据卷是宿主机中的一个目录,与容器生命周期隔离。
二、容器卷挂载
2.1 在命令行挂载数据卷
使用-v加载一个数据卷
docker run -it --name volume -v /web/app centos
ls web/
exit
然后我们就可以通过如下命令看到挂载信息啦
docker inspect volume
我们再来看一个后台运行的列子
docker run -it -d --name test -v /webapp:/app nginx
docker inspect test
下面,我们来进行一下测试吧
重启启动一个
docker run -it --name volume2 -v /webapp:/app centos
ls /
我们另外开一个控制台
在我们宿主机上进入webapp这个目录,然后新建两个文件
sudo su
cd /webapp
touch c.txt d.txt
ls
然后返回我们容器进行观察
ls /app
很明显进行了挂载
同理,我们如果在容器里面创建,我们本机也会进行更新,有点类似于我们的共享目录,这样在我们启动多台容器时,可以进行数据共享
此项操作,我们一般用于配置文件的共享,为了避免容器内部修改,我们会对文件进行权限设置
加入只读属性ro
docker run -it --name volume3 -v /webapp:/app:ro centos
ls /
cd app
echo hello world >a.txt
可以看到
同样对于创建文件也是同理,因为我们添加了只读属性
2.2 通过dockerfile挂载数据卷
dockerfile可以创建多个数据卷,但是不能映射到本地已经有的目录,在启动容器时,才会创建dockefile中指定的数据卷,然后以dockerfile中指定名称命名,所创建地址不一样,容器没有办法共享数据。
vim Dockerfile
#选择使用的image
FROM centos/vim
#执行的命令
VOLUME /root/data
VOLUME /work
VOLUME test
docker build -t volume .
ls
ctrl+p+q暂停退出
docker inspect 3dad75
现在就可以看到我们容器的挂载啦
三、数据卷容器
运行容器时宿主机会随机生成挂载目录,无法保持地址一致性,所以无法容器数据共享。数据卷,可以将已经命名的容器挂载数据卷,其他容器再通过挂载这个容器数据实现共享,挂载数据的容器的叫做容器数据卷。
docker run -it --name volume-container -v /volume1 -v /volume2 centos
ctrl+p+q暂停退出
docker inspect volume-container | grep volume
我们就可以看到我们所在的这个目录
cd /var/lib/docker/volumes/1f889275343587271abe22ec55878fefd25bec783e5c0ba30624fc4989893989/_data
echo hello world > a.txt
echo hello world2 > b.txt
然后我们再回到我们容器
docker attach b38d15
我们就可以在这里看到我们刚刚的容器目录啦
删除之后还是会继续保存
四、备份数据卷
人们通常会对数据进行一次或者多次备份,以确保数据的安全,下面我们来试一试吧
docker run -it --name volume-container -v /var/volume1 -v /var/volume2 centos
在其数据卷下创建文件并添加内容
echo hello wo