一、数据卷介绍
1、数据卷作用
- 持久化数据
- 共享数据
2 、数据卷特点
- 即使生效
- 卷的更新不影响镜像
- 即使容器停止或被删除,卷默认也一直存在
二、卷的基本操作
1、创建数据卷
这一步不需要进入容器哦,否则会报错。
方式一:
[root@localhost docker]# sudo docker volume create db_vol
db_vol
方式二:
root@ubuntu:/# docker run -it -d --name data-volume-con -v /data ubuntu
26552f43385236a8e41ecd727ad3e4ccf9da6a99bcc5ef0fa49a81c17c49b9e5
2、查看数据卷
sudo docker volume ls
3、查看数据卷详情
格式:sudo docker volume inspect 数据卷名称
sudo docker volume inspect db_vol
命令以json的格式显示数据卷的详细信息
4、删除数据卷
格式:sudo docker volume rm 要删除的数据卷名称
sudo docker volume rm db_vol
三、数据卷使用
1、创建数据卷再挂载
1、创建数据卷
- 挂载是指将定义在 Pod 中的数据卷关联到容器,同一个 Pod 中的同一个数据卷可以被挂载到该 Pod 中的多个容器上。
root@ubuntu:~$ sudo docker volume create data-vol
data-vol
2、创建容器使用数据卷(mount方式)
说明:加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车,92c781b8f5cf6cfabd1f95ca9af6a30e1365f14de657272dcdf773b338604134,是生成的容器id。
–mount 后没有带type参数,默认为 volume
root@ubuntu:~$ sudo docker run -d -it \
> --name volumetest \
> --mount source=data-vol,target=/data \
> ubuntu
1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9
方式二:
root@ubuntu:/# docker run -it -d --name db-con-1 --volumes-from data-volume-con ubuntu
263999d5aa43dac11c619cc1f644b736339031c459644b68cab8ce044a66ab53
参数–volumes-from用于指定数据卷容器
简写:
说明:
创建一个volumentset0 的容器,“\”继续输入,将宿主机的根目录下的vdata挂载到容器里面根目录下的data里面,指定ubuntu版本号,这里的ubunt是要自己前面下载过的Ubuntu的镜像。
[root@localhost /]# docker run -itd --name volumentset02 \
> -v /vdata:/data ubuntu:16.04 bash
92c781b8f5cf6cfabd1f95ca9af6a30e1365f14de657272dcdf773b338604134
这里会生成这个容器的id名。
再进入这个容器,并进入容器的data里面,因为上面一步操作会直接同步创建一个data目录,所有容器里不需要创建data也有。
进入容器后创建一个测试文本,然后退出容器。
[root@localhost /]# docker exec -it 92c bash
root@92c781b8f5cf:/# cd /data
root@92c781b8f5cf:/data# echo fghjk >abc.txt
root@92c781b8f5cf:/data# ls
abc.txt
root@92c781b8f5cf:/data# exit
exit
3、退出容器后就是宿主机的根目录,进入宿主机的vdata目录,里面会同步在容器里面创建的那个文本。这就是挂载成功了。
[root@localhost /]# cd /vdata
[root@localhost vdata]# ls
abc.txt
[root@localhost vdata]# cat abc.txt
fghjk
4、测试一下是否同步,在容器里面对abc.txt文件进行修改:
root@92c781b8f5cf:/# echo "update in container" >> /data/abc.txt
root@92c781b8f5cf:/# cat /data/abc.txt
fghjk
update in container
root@92c781b8f5cf:/#
在退出容器,进入宿主机根目录查看:
2、只读数据卷
创建的数据卷默认是可以读写的,这适合于绝大多数情况,也可以将卷设置为只读的
1、mount方式创建容器
root@ubuntu:/# mkdir /home/ubuntu/vdata
root@ubuntu:/# docker run -d -it \
> --name volumetest02 \
> --mount type=bind,source=/home/ubuntu/vdata,target=/vdata,ro \
> ubuntu
530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0
简写:
2、-v方式创建
[root@localhost ubuntu]# docker run -dit --name volumetest02 -v /home/ubuntu/vdata:/vdata:ro ubuntu
23e9452b7edb526fcb1495bb912d2b50e0371bee5e36940917af9257196cd3ad
数据卷的主要作用是数据持久化和数据共享,所以一般不用只读方式。
四、容器卷的备份与恢复
1、 数据卷备份
创建一个容器,该容器既挂载了需要备份的数据卷(有volumes-from参数指定),又挂载了用来备份数据的数据卷(可以用-v参数指定),通过tar压缩命令,将volumes-from参数指定的需要备份的数据卷,压缩到用来备份的数据卷中(等同于保存到了宿主机对应的目录中)。
将创建的备份:
root@ubuntu:/# docker run --rm \
> --name backup \
> --volumes-from data-volume-con \
> -v /host-backup:/con-backup \
> ubuntu tar cvf /con-backup/backup200201.tar /data
/data/
/data/test.txt
tar: Removing leading `/' from member names
root@ubuntu:/# ls
bin dev etc host-backup lib lost+found mnt proc run snap sys usr vmlinuz
boot dump.rdb home initrd.img lib64 media opt root sbin srv tmp var
- –rm 参数,指定了创建的容器为临时容器,运行完后将自动删除,我们只是借助这个容器完成备份,备份完成后数据存放于宿主机中,容器自然也就不需要了。
- –volumes-from 参数,指定了需要备份的数据卷容器。
-v 参数,指定了用来备份数据的数据卷,/host-backup为宿主机目录,/con-backup为对应的容器目录。- tar 命令完成数据压缩,注意压缩的源为容器目录,因为压缩命令实际上实在容器中执行的,确切的说是在backup容器中执行(–name参数指定的),压缩完成后自然也会保存到宿主机目录。
2、数据卷恢复
新建一个数据卷容器,这个容器作为存放还原数据的容器
root@ubuntu:/# docker run -it --name data-volume-con2 -v /data ubuntu
创建一个临时容器,既挂载了用于存放还原数据的数据卷容器,又挂载了存有备份数据的数据卷,然后使用tar命令,将备份的数据解压到存放还原数据的数据卷中。
root@ubuntu:/# docker run --rm \
> --name huanyuan \
> --volumes-from data-volume-con2 \
> -v /host-backup:/container-back \
> ubuntu tar xvf /container-back/backup200201.tar -C /data
data/
data/test.txt
- –rm 参数,请参见“数据备份”部分的解释
- –volumes-from 参数,指定用于保存还原数据的容器
- -v 参数, 用于指定存有备份数据的数据卷,/host-backup是宿主机上用来存放备份数据的目录,将其挂载到容器的/container-back目录,tar命令通过/container-back获取到备份的数据,然后解压。