赞
踩
目录
卷是在一个或多个容器内被选定的目录,为docker提供持久化数据或共享数据,是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效,当提交或创建镜像时,卷不被包括在镜像中。
总结为两个作用:
一个特点:
容器示意图
使用如下命令可以创建一个数据卷
- lisen@ubuntu:~$ sudo docker volume create db_vol
- db_vol
使用这种方式创建的数据卷可也被docker volume管理,如查看,删除等。新建的数据卷被保存在/var/lib/docker/volumes目录下。
使用一下命令可以查看数据卷
- lisen@ubuntu:~$ sudo docker volume ls
- DRIVER VOLUME NAME
- local db_vol
docker volume inspect 命令以json的格式显示数据卷的详细信息
- lisen@ubuntu:~$ sudo docker volume inspect db_vol
- [
- {
- "CreatedAt": "2020-02-01T11:33:52+08:00",
- "Driver": "local",
- "Labels": {},
- "Mountpoint": "/var/lib/docker/volumes/db_vol/_data",
- "Name": "db_vol",
- "Options": {},
- "Scope": "local"
- }
- ]
- lisen@ubuntu:~$
- lisen@ubuntu:~$ sudo docker volume rm db_vol
- db_vol
- lisen@ubuntu:~$
1)在使用数据卷前先创建一个,docker volume create 数据卷名称
- lisen@ubuntu:~$ sudo docker volume create data-vol
- data-vol
2)创建容器使用数据卷(mount)
- lisen@ubuntu:~$ sudo docker run -d -it \
- > --name volumetest \
- > --mount source=data-vol,target=/data \
- > ubuntu
- 1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9
注:加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车,1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9
是生成的容器id,--mount 后没有带type参数,默认为 volume
简写方式(-v):
- lisen@ubuntu:~$ sudo docker run -d -it \
- > --name volumetest \
- > -v data-vol:/data \
- > ubuntu
3)创建成功后切换到宿主机的 /var/lib/docker/volumes/data-vol/_data目录(如果没有权限,先切换为root用户), 创建一个用与测试的文件,数据卷挂载成功,则在容器中也可以看到这个文件。
- root@ubuntu:/var/lib/docker/volumes/data-vol/_data# echo "hello volume" > test.txt
- root@ubuntu:/var/lib/docker/volumes/data-vol/_data# ls
- test.txt
为方便对比,新打开一个命令终端进入容器,查看在宿主机上创建的文件在容器的对应目录中是否存在
- root@ubuntu:/# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 1ab0c61bf24c ubuntu "/bin/bash" 21 minutes ago Up 21 minutes volumetest
- root@ubuntu:/# docker exec -it 1ab0 /bin/bash
- root@1ab0c61bf24c:/# ls -l /data
- total 4
- -rw-r--r-- 1 root root 13 Feb 1 04:30 test.txt
- root@1ab0c61bf24c:/# cat /data/test.txt
- hello volume
- root@1ab0c61bf24c:/#
4)在容器中对测试文件进行修改,然后来到宿主机的对应目录,验证文件是否修改。
- root@1ab0c61bf24c:/# echo "update in container" >> /data/test.txt
- root@1ab0c61bf24c:/# cat /data/test.txt
- hello volume
- update in container
- root@1ab0c61bf24c:/#
此时容器中的文件已经改变,到宿主机的对应目录中进行查看
- root@ubuntu:/var/lib/docker/volumes/data-vol/_data# cat test.txt
- hello volume
- update in container
通过这种方式不需要事先创建数据卷,直接指定宿主机的一个目录挂载到容器中,但宿主机中对应的目录要存在,否则会报类似于下面的异常:
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/vdata.
1)mount方式创建容器命令如下:
- root@ubuntu:/# mkdir /home/lisen/vdata
- root@ubuntu:/# docker run -d -it \
- > --name volumetest02 \
- > --mount type=bind,source=/home/lisen/vdata,target=/vdata \
- > ubuntu
- 530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0
2)-v方式创建(可以理解为简写方式):
- root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata ubuntu
- 9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33
可以使用上例类似的方面来对数据卷进行验证。具体过程不再详细描述。
注:建议使用3.1所示的方式使用数据卷,直接挂载目录的方式不被docker volume管理。
创建的数据卷默认是可以读写的,这适合于绝大多数情况,也可以将卷设置为只读的,如下所示
1)mount方式创建容器命令如下:
- root@ubuntu:/# mkdir /home/lisen/vdata
- root@ubuntu:/# docker run -d -it \
- > --name volumetest02 \
- > --mount type=bind,source=/home/lisen/vdata,target=/vdata,ro \
- > ubuntu
- 530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0
2)-v方式创建(可以理解为简写方式):
- root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata:ro ubuntu
- 9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33
数据卷的主要作用是数据持久化和数据共享,所以一般不用只读方式。
用途:数据卷容器主要目的是多个容器之间共享一些持续更新的数据,数据卷容器也是一个容器,专门提供数据卷给其他容器挂载。
- root@ubuntu:/# docker run -it -d --name data-volume-con -v /data ubuntu
- 26552f43385236a8e41ecd727ad3e4ccf9da6a99bcc5ef0fa49a81c17c49b9e5
26552f4338... 是创建的数据卷容器Id
- root@ubuntu:/# docker run -it -d --name db-con-1 --volumes-from data-volume-con ubuntu
- 263999d5aa43dac11c619cc1f644b736339031c459644b68cab8ce044a66ab53
参数--volumes-from用于指定数据卷容器
进入新建的容器,在挂载的目录中(data目录,即创建数据卷容器时指定的目录)新建一个测试文件。
- root@ubuntu:/# docker exec -it db-con-1 /bin/bash
- root@263999d5aa43:/# ls
- bin data etc lib media opt root sbin sys usr
- boot dev home lib64 mnt proc run srv tmp var
- root@263999d5aa43:/# echo "test volume container" > /data/test.txt
- root@263999d5aa43:/# ls /data
- test.txt
- root@263999d5aa43:/# cat /data/test.txt
- test volume container
- root@263999d5aa43:/#
然后来到进入数据卷容器,验证刚才新建的测试文件在数据卷容器中是否存在:
- root@ubuntu:/# docker exec -it data-volume-con /bin/bash
- root@26552f433852:/# ls
- bin data etc lib media opt root sbin sys usr
- boot dev home lib64 mnt proc run srv tmp var
- root@26552f433852:/# cd data
- root@26552f433852:/data# ls
- test.txt
- root@26552f433852:/data# cat test.txt
- test volume container
- root@26552f433852:/data#
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
- root@ubuntu:/#
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
- root@ubuntu:/#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。