> 文章列表 > Ubantu docker学习笔记(六)容器数据卷

Ubantu docker学习笔记(六)容器数据卷

在Docker的世界里,数据卷就像一艘永不沉没的船,承载着你的宝贵数据在容器之间航行。容器虽然生来短暂,但数据可以永存!今天,我们就一起来探索这些神奇的“数据船”——容器数据卷。

你有没有在容器里创建过文件,结果容器一关闭就再也找不到了?数据卷就是解决这个问题的救星!它像是一个磁铁,把数据牢牢吸在宿主机上,即使容器消失,数据仍在。

比如,你在容器里写了一篇超棒的博客,不想它随容器消失,怎么办?答案就是用数据卷!只需在启动容器时加上-v参数,比如docker run -v /mydata:/data,你的博客就会在宿主机的/mydata目录中保存下来。

还有一个小秘密:数据卷还能让不同容器共享数据,就像是给多个小伙伴共享一个秘密基地。比如,你可以创建一个数据卷容器,然后用docker run --volumes-from把它挂载到其他容器上,所有容器都能看到同一个数据仓库。

不过,数据卷也有点“调皮”,比如默认情况下,它们是可写的,数据随便改。怎么办?我们可以给它上个“枷锁”,加个ro只读属性。比如-v /mydata:/data:ro,这样容器只能看不能改,就像进了档案馆,只能看不能动。

最后,别忘了给数据卷拍个照——备份!毕竟,数据金贵,不能让它说没就没。用docker run创建个备份容器,把数据卷内容复制出来,或者用docker export命令导出容器,数据就安全了。

说了这么多,问题来了:你平时是怎么管理容器数据的?是不是也遇到了过数据“消失”的尴尬?或者,你已经是个数据卷的老司机,用过哪些高招?欢迎在评论区聊聊你的故事!

Ubantu docker学习笔记(六)容器数据卷

文章目录

  • 一、容器数据卷
  • 二、容器卷挂载
    • 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

Ubantu docker学习笔记(六)容器数据卷
然后我们就可以通过如下命令看到挂载信息啦

docker inspect volume

Ubantu docker学习笔记(六)容器数据卷

我们再来看一个后台运行的列子

docker run -it -d --name test -v /webapp:/app nginx
docker inspect test 

Ubantu docker学习笔记(六)容器数据卷

下面,我们来进行一下测试吧
重启启动一个

docker run -it --name volume2 -v /webapp:/app centos
ls /

我们另外开一个控制台
在我们宿主机上进入webapp这个目录,然后新建两个文件

sudo su
cd /webapp
touch c.txt d.txt
ls

然后返回我们容器进行观察

ls /app

很明显进行了挂载
Ubantu docker学习笔记(六)容器数据卷
同理,我们如果在容器里面创建,我们本机也会进行更新,有点类似于我们的共享目录,这样在我们启动多台容器时,可以进行数据共享
Ubantu docker学习笔记(六)容器数据卷
此项操作,我们一般用于配置文件的共享,为了避免容器内部修改,我们会对文件进行权限设置
加入只读属性ro

docker run -it --name volume3 -v /webapp:/app:ro centos
ls /
cd app
echo hello world >a.txt

可以看到
Ubantu docker学习笔记(六)容器数据卷
同样对于创建文件也是同理,因为我们添加了只读属性

2.2 通过dockerfile挂载数据卷

dockerfile可以创建多个数据卷,但是不能映射到本地已经有的目录,在启动容器时,才会创建dockefile中指定的数据卷,然后以dockerfile中指定名称命名,所创建地址不一样,容器没有办法共享数据。

vim Dockerfile
#选择使用的image
FROM centos/vim
#执行的命令
VOLUME /root/data
VOLUME /work
VOLUME test
docker build -t volume .
ls

Ubantu docker学习笔记(六)容器数据卷
ctrl+p+q暂停退出

docker inspect 3dad75

现在就可以看到我们容器的挂载啦
Ubantu docker学习笔记(六)容器数据卷

三、数据卷容器

运行容器时宿主机会随机生成挂载目录,无法保持地址一致性,所以无法容器数据共享。数据卷,可以将已经命名的容器挂载数据卷,其他容器再通过挂载这个容器数据实现共享,挂载数据的容器的叫做容器数据卷。

docker run -it --name volume-container -v /volume1 -v /volume2 centos
ctrl+p+q暂停退出
docker inspect volume-container | grep volume

Ubantu docker学习笔记(六)容器数据卷
我们就可以看到我们所在的这个目录

cd /var/lib/docker/volumes/1f889275343587271abe22ec55878fefd25bec783e5c0ba30624fc4989893989/_data
echo hello world > a.txt
echo hello world2 > b.txt

然后我们再回到我们容器

docker attach b38d15

Ubantu docker学习笔记(六)容器数据卷
我们就可以在这里看到我们刚刚的容器目录啦
Ubantu docker学习笔记(六)容器数据卷
删除之后还是会继续保存

四、备份数据卷

人们通常会对数据进行一次或者多次备份,以确保数据的安全,下面我们来试一试吧

docker run -it --name volume-container -v /var/volume1 -v /var/volume2 centos

在其数据卷下创建文件并添加内容

echo hello wo