【DevOps系列】Docker数据卷(volume)详解
文章目录
- 【DevOps系列】Docker数据卷(volume)详解
- 一、概述
- 二、数据卷
- 三、为什么使用数据卷volume
- 数据卷的作用:
- 数据卷的特点:
- 四、数据卷volume基本操作
- 4.1 创建数据卷
- 4.2 查看数据卷
- 4.3 查看数据卷详细信息
- 4.4 数据卷删除
- 五、数据卷的使用
- 5.1 先创建数据卷在挂载
- 5.2 创建容器使用数据卷
- 5.3 直接挂载宿主机目录
- 1). mount方式创建容器命令如下:
- 2). -v方式创建命令如下:
- 5.4 只读数据卷
- 1). mount方式创建容器命令如下:
- 2). -v方式创建(可以理解为简写方式):
- 5.5 数据卷容器
- 1).新建数据卷容器
- 2).新建一个容器来使用数据卷容器
- 5.6 数据卷容器
- 1).数据卷的备份
- 2).数据还原
一、概述
Docker的镜像是由多个只读的文件系统叠加在一起形成。启动一个容器的时候,docker会加载只读层并在只读层的上面(栈顶)增加一个读写层。如果需要修改只读层的文件,那么这个文件层需要复制到读写层。该文件的只读版本还在,只是被上面写层的文件副本隐藏。当删除docker或重新启动时,之前的更改文件会消失。在Docker中,只读层与读写层的组合称为Union File System(联合文件系统)。Docker将运用与运行的环境打包形成容器运行,Docker容器产生的数据,如果不通过docker commits生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有,为了能保存数据在Docker,Docker设计了一个机制既卷(Volume)
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上,这个目录或文件称为数据卷。
二、数据卷
数据卷(Volume)是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供以下一些特性:
- 数据卷可在容器之间共享或重用数据。
- 卷中的更改可以直接生效。
- 数据卷中的更改不会包含在镜像的更新中。
- 数据卷的生命周期一直持续到没有容器使用它为止。
三、为什么使用数据卷volume
卷是在一个或多个容器内被选定的目录,为docker提供持久化数据或共享数据,是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效,当提交或创建镜像时,卷不被包括在镜像中。
数据卷的作用:
- 持久化数据
- 共享数据
数据卷的特点:
- 即使生效
- 卷的更新不影响镜像
- 即使容器停止或被删除,卷默认也一致存在
四、数据卷volume基本操作
4.1 创建数据卷
使用如下命令可以创建一个数据卷
- docker volume create 卷名
docker volume create db_vol
使用这种方式创建的数据卷可也被docker volume管理,如查看,删除等。
4.2 查看数据卷
docker volume ls
4.3 查看数据卷详细信息
- docker volume inspect 卷名
docker volume inspect db_vol
4.4 数据卷删除
- docker volume rm 卷名
docker volume rm db_vol
五、数据卷的使用
5.1 先创建数据卷在挂载
docker volume create data_volume
5.2 创建容器使用数据卷
docker run -d -it \
> --name volumetest \
> --mount source=data-vol,target=/data \
> ubuntu
注:加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符。
简写方式(-v):
docker run -d -it \
> --name volumetest \
> -v data-vol:/data \
> ubuntu
5.3 直接挂载宿主机目录
通过这种方式不需要事先创建数据卷,直接指定宿主机的一个目录挂载到容器中,但宿主机中对应的目录要存在,否则会报一下异常
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/vdata.
1). mount方式创建容器命令如下:
docker run -d -it \
> --name volumetest02 \
> --mount type=bind,source=/home/lisen/vdata,target=/vdata \
> ubuntu
2). -v方式创建命令如下:
docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata ubuntu
5.4 只读数据卷
创建的数据卷默认是可以读写的,这适合于绝大多数情况,也可以将卷设置为只读的
1). mount方式创建容器命令如下:
docker run -d -it \
> --name volumetest02 \
> --mount type=bind,source=/home/lisen/vdata,target=/vdata,ro \
> ubuntu
2). -v方式创建(可以理解为简写方式):
docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata:ro ubuntu
数据卷的主要作用是数据持久化和数据共享,所以一般不用只读方式。
5.5 数据卷容器
用途:数据卷容器主要目的是多个容器之间共享一些持续更新的数据,数据卷容器也是一个容器,专门提供数据卷给其他容器挂载。
1).新建数据卷容器
docker run -it -d --name data-volume-con -v /data ubuntu
2).新建一个容器来使用数据卷容器
docker run -it -d --name db-con-1 --volumes-from data-volume-con ubuntu
参数–volumes-from用于指定数据卷容器;进入新建的容器,在挂载的目录中(data目录,既创建数据卷容器时指定的目录)新建一个测试文件。
5.6 数据卷容器
1).数据卷的备份
创建一个容器,该容器既挂载了需要备份的数据卷(有volumes-from参数指定),又挂载了用来备份数据的数据卷(可以用-v参数指定),通过tar压缩命令,将volumes-from参数指定的需要备份的数据卷,压缩到用来备份的数据卷中(等同于保存到了宿主机对应的目录中)。
docker run --rm \
> --name backup \
> --volumes-from data-volume-con \
> -v /host-backup:/con-backup \
> ubuntu tar cvf /con-backup/backup200201.tar /data
- –rm 参数,指定了创建的容器为临时容器,运行完后将自动删除,我们只是借助这个容器完成备份,备份完成后数据存放于宿主机中,容器自然也就不需要了。
- –volumes-from 参数,指定了需要备份的数据卷容器
- -v 参数,指定了用来备份数据的数据卷,/host-backup为宿主机目录,/con-backup为对应的容器目录
- tar 命令完成数据压缩,注意压缩的源为容器目录,因为压缩命令实际上实在容器中执行的,确切的说是在backup容器中执行(–name参数指定的),压缩完成后自然也会保存到宿主机目录。
2).数据还原
新建一个数据卷容器,这个容器作为存放还原数据的容器。
docker run -it --name data-volume-con2 -v /data ubuntu
创建一个临时容器,既挂载了用于存放还原数据的数据卷容器,又挂载了存有备份数据的数据卷,然后使用tar命令,将备份的数据解压到存放还原数据的数据卷中。
- –rm 参数,请参见“数据备份”部分的解释
- –volumes-from 参数,指定用于保存还原数据的容器
- -v 参数, 用于指定存有备份数据的数据卷,/host-backup是宿主机上用来存放备份数据的目录,将其挂载到容器的/container-back目录,tar命令通过/container-back