一、容器数据卷
由于我们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 world1 > /var/volume1/a.txt echo hello world2 > /var/volume2/b.txt
我们备份的话,简单的来说,就是用–volumes-from参数来挂载数据卷,从宿主机挂载要放在备份数据的目录到容器的备份目录,然后用–rm删除容器
docker run --rm --volumes-from volume-container(你要备份的容器名) -v /root/backup:/backup centos tar cvf /backup/backup1.tar /var/volume1 docker run --rm --volumes-from volume-container(你要备份的容器名) -v /root/backup:/backup centos tar cvf /backup/backup2.tar /var/volume2
五、数据卷的恢复和迁移
5.1 恢复数据卷
由于我们之前已经对于数据卷做好了恢复,下面我们来对模拟的数据卷来进行恢复
进入数据卷
docker attach volume-container rm -rf /var/volume1/a.txt rm -rf /var/volume2/b.txt
然后我们用代码来恢复
docker run --rm --volumes-from volume-container -v /root/backup/:/backup centos tar xvf /backup/backup1.tar -C / docker run --rm --volumes-from volume-container -v /root/backup/:/backup centos tar xvf /backup/backup2.tar -C /
完成!
5.2 迁移数据卷
我们新建一个数据卷容器
docker run -it --name new-container -v /volume1 -v /volume2 centos ctrl+p+q docker run --rm --volumes-from new-container -v /root/backup/:/backup centos tar xvf /backup/backup1.tar -C /volume1 docker run --rm --volumes-from new-container -v /root/backup/:/backup centos tar xvf /backup/backup2.tar -C /volume2
在容器路劲和原来路劲相同时,可以直接导入,-C后面不用加参数,但是如果和源路劲不一样,我们需要在—C后面指定参数,不然会迁移失败
六、管理数据卷
6.1 与容器关联
命令 | 含义 |
docker rm -v | 删除容器时添加-v会将数据卷一起删除 |
docker rm --rm | 运行结束时数据卷会和容器一起删除 |
(1)例子一
docker run -it -v /data --name test centos docker inspect test | grep Source
进入到你那个目录
cd /var/lib/docker/volumes/22df6c5c6990231a9983cd9646a9115a3a5cd3bdd3260f187896205aa53036df/_data
docker rm test docker inspect test | grep Source
可以看到数据卷还在
(2)例子二
docker run -it -v /data --name test2 centos docker inspect test2 | grep Source docker stop test2 docker rm -v test2
可以看到数据卷也随之删除
(3)例子三
docker run -it --rm -v /data --name test2 centos
退出容器时会自动删除容器和数据卷
6.2 命令管理
命令 | 含义 |
creat | 创建容器卷 docker volume creat test |
ls | 列出容器卷 docker volume ls |
inspect | 显示一个或者多个数据卷的详细信息 docker inspect 容器名 |
rm | 删除一个或者多个容器 |
prune | 暂停容器 docker volume prune |