当前位置:   article > 正文

docker中的数据卷_docker数据卷

docker数据卷

目录

1. 为什么使用数据卷

2. 数据卷基本操作

2.1 创建数据卷

2.2 查看数据卷

2.3 查看数据卷详细信息

2.4 数据卷删除

3. 数据卷的使用

3.1 先创建数据卷再挂载

3.2 直接挂载宿主机目录

3.3 只读数据卷

4. 数据卷容器

4.1 新建数据卷容器

4.2 新建一个容器来使用数据卷容器

4.3 数据卷容器的备份与恢复


1. 为什么使用数据卷

卷是在一个或多个容器内被选定的目录,为docker提供持久化数据或共享数据,是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效,当提交或创建镜像时,卷不被包括在镜像中。

总结为两个作用:

  • 持久化数据
  • 共享数据

 

 

一个特点:

  • 即时生效
  • 卷的更新不影响镜像
  • 即使容器停止或被删除,卷默认也一致存在

容器示意图

 

2. 数据卷基本操作

2.1 创建数据卷

使用如下命令可以创建一个数据卷

  1. lisen@ubuntu:~$ sudo docker volume create db_vol
  2. db_vol

使用这种方式创建的数据卷可也被docker volume管理,如查看,删除等。新建的数据卷被保存在/var/lib/docker/volumes目录下。

2.2 查看数据卷

使用一下命令可以查看数据卷

  1. lisen@ubuntu:~$ sudo docker volume ls
  2. DRIVER VOLUME NAME
  3. local db_vol

2.3 查看数据卷详细信息

docker volume inspect 命令以json的格式显示数据卷的详细信息

  1. lisen@ubuntu:~$ sudo docker volume inspect db_vol
  2. [
  3. {
  4. "CreatedAt": "2020-02-01T11:33:52+08:00",
  5. "Driver": "local",
  6. "Labels": {},
  7. "Mountpoint": "/var/lib/docker/volumes/db_vol/_data",
  8. "Name": "db_vol",
  9. "Options": {},
  10. "Scope": "local"
  11. }
  12. ]
  13. lisen@ubuntu:~$

2.4 数据卷删除

  1. lisen@ubuntu:~$ sudo docker volume rm db_vol
  2. db_vol
  3. lisen@ubuntu:~$

3. 数据卷的使用

3.1 先创建数据卷再挂载

1)在使用数据卷前先创建一个,docker volume create 数据卷名称

  1. lisen@ubuntu:~$ sudo docker volume create data-vol
  2. data-vol

2)创建容器使用数据卷(mount)

  1. lisen@ubuntu:~$ sudo docker run -d -it \
  2. > --name volumetest \
  3. > --mount source=data-vol,target=/data \
  4. > ubuntu
  5. 1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9

注:加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车,1ab0c61bf24c52aeb0f3d0764f8743b9579eeb3a3b79a12a04cfa3ecf1bd50a9
是生成的容器id,--mount 后没有带type参数,默认为 volume

简写方式(-v):

  1. lisen@ubuntu:~$ sudo docker run -d -it \
  2. > --name volumetest \
  3. > -v data-vol:/data \
  4. > ubuntu

3)创建成功后切换到宿主机的 /var/lib/docker/volumes/data-vol/_data目录(如果没有权限,先切换为root用户), 创建一个用与测试的文件,数据卷挂载成功,则在容器中也可以看到这个文件。

  1. root@ubuntu:/var/lib/docker/volumes/data-vol/_data# echo "hello volume" > test.txt
  2. root@ubuntu:/var/lib/docker/volumes/data-vol/_data# ls
  3. test.txt

为方便对比,新打开一个命令终端进入容器,查看在宿主机上创建的文件在容器的对应目录中是否存在

  1. root@ubuntu:/# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 1ab0c61bf24c ubuntu "/bin/bash" 21 minutes ago Up 21 minutes volumetest
  4. root@ubuntu:/# docker exec -it 1ab0 /bin/bash
  5. root@1ab0c61bf24c:/# ls -l /data
  6. total 4
  7. -rw-r--r-- 1 root root 13 Feb 1 04:30 test.txt
  8. root@1ab0c61bf24c:/# cat /data/test.txt
  9. hello volume
  10. root@1ab0c61bf24c:/#

4)在容器中对测试文件进行修改,然后来到宿主机的对应目录,验证文件是否修改。

  1. root@1ab0c61bf24c:/# echo "update in container" >> /data/test.txt
  2. root@1ab0c61bf24c:/# cat /data/test.txt
  3. hello volume
  4. update in container
  5. root@1ab0c61bf24c:/#

此时容器中的文件已经改变,到宿主机的对应目录中进行查看

  1. root@ubuntu:/var/lib/docker/volumes/data-vol/_data# cat test.txt
  2. hello volume
  3. update in container

3.2 直接挂载宿主机目录

通过这种方式不需要事先创建数据卷,直接指定宿主机的一个目录挂载到容器中,但宿主机中对应的目录要存在,否则会报类似于下面的异常:
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/vdata.
1)mount方式创建容器命令如下:

  1. root@ubuntu:/# mkdir /home/lisen/vdata
  2. root@ubuntu:/# docker run -d -it \
  3. > --name volumetest02 \
  4. > --mount type=bind,source=/home/lisen/vdata,target=/vdata \
  5. > ubuntu
  6. 530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0

2)-v方式创建(可以理解为简写方式):

  1. root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata ubuntu
  2. 9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33

可以使用上例类似的方面来对数据卷进行验证。具体过程不再详细描述。

注:建议使用3.1所示的方式使用数据卷,直接挂载目录的方式不被docker volume管理。

3.3 只读数据卷

创建的数据卷默认是可以读写的,这适合于绝大多数情况,也可以将卷设置为只读的,如下所示
1)mount方式创建容器命令如下:

  1. root@ubuntu:/# mkdir /home/lisen/vdata
  2. root@ubuntu:/# docker run -d -it \
  3. > --name volumetest02 \
  4. > --mount type=bind,source=/home/lisen/vdata,target=/vdata,ro \
  5. > ubuntu
  6. 530677db6f3d9e94057e8acb389afe3d514e4df3ac4418e80eaa08567a926fa0

2)-v方式创建(可以理解为简写方式):

  1. root@ubuntu:/# docker run -dit --name volumetest02 -v /home/lisen/vdata:/vdata:ro ubuntu
  2. 9de51fd527dc81ddcadf47fd5b61a6969b884493b0fac710f4a2d83efbfccb33

数据卷的主要作用是数据持久化和数据共享,所以一般不用只读方式。

4. 数据卷容器

用途:数据卷容器主要目的是多个容器之间共享一些持续更新的数据,数据卷容器也是一个容器,专门提供数据卷给其他容器挂载。

4.1 新建数据卷容器

  1. root@ubuntu:/# docker run -it -d --name data-volume-con -v /data ubuntu
  2. 26552f43385236a8e41ecd727ad3e4ccf9da6a99bcc5ef0fa49a81c17c49b9e5

26552f4338... 是创建的数据卷容器Id

4.2 新建一个容器来使用数据卷容器

  1. root@ubuntu:/# docker run -it -d --name db-con-1 --volumes-from data-volume-con ubuntu
  2. 263999d5aa43dac11c619cc1f644b736339031c459644b68cab8ce044a66ab53

参数--volumes-from用于指定数据卷容器

进入新建的容器,在挂载的目录中(data目录,即创建数据卷容器时指定的目录)新建一个测试文件。

  1. root@ubuntu:/# docker exec -it db-con-1 /bin/bash
  2. root@263999d5aa43:/# ls
  3. bin data etc lib media opt root sbin sys usr
  4. boot dev home lib64 mnt proc run srv tmp var
  5. root@263999d5aa43:/# echo "test volume container" > /data/test.txt
  6. root@263999d5aa43:/# ls /data
  7. test.txt
  8. root@263999d5aa43:/# cat /data/test.txt
  9. test volume container
  10. root@263999d5aa43:/#

然后来到进入数据卷容器,验证刚才新建的测试文件在数据卷容器中是否存在:

  1. root@ubuntu:/# docker exec -it data-volume-con /bin/bash
  2. root@26552f433852:/# ls
  3. bin data etc lib media opt root sbin sys usr
  4. boot dev home lib64 mnt proc run srv tmp var
  5. root@26552f433852:/# cd data
  6. root@26552f433852:/data# ls
  7. test.txt
  8. root@26552f433852:/data# cat test.txt
  9. test volume container
  10. root@26552f433852:/data#

4.3 数据卷容器的备份与恢复

1)数据卷的备份
创建一个容器,该容器既挂载了需要备份的数据卷(有volumes-from参数指定),又挂载了用来备份数据的数据卷(可以用-v参数指定),通过tar压缩命令,将volumes-from参数指定的需要备份的数据卷,压缩到用来备份的数据卷中(等同于保存到了宿主机对应的目录中)。

我们将刚才创建的数据卷备份

  1. root@ubuntu:/# docker run --rm \
  2. > --name backup \
  3. > --volumes-from data-volume-con \
  4. > -v /host-backup:/con-backup \
  5. > ubuntu tar cvf /con-backup/backup200201.tar /data
  6. /data/
  7. /data/test.txt
  8. tar: Removing leading `/' from member names
  9. root@ubuntu:/# ls
  10. bin dev etc host-backup lib lost+found mnt proc run snap sys usr vmlinuz
  11. boot dump.rdb home initrd.img lib64 media opt root sbin srv tmp var
  12. root@ubuntu:/#
  • --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命令,将备份的数据解压到存放还原数据的数据卷中。

  1. root@ubuntu:/# docker run --rm \
  2. > --name huanyuan \
  3. > --volumes-from data-volume-con2 \
  4. > -v /host-backup:/container-back \
  5. > ubuntu tar xvf /container-back/backup200201.tar -C /data
  6. data/
  7. data/test.txt
  8. root@ubuntu:/#
  • --rm 参数,请参见“数据备份”部分的解释
  • --volumes-from 参数,指定用于保存还原数据的容器
  • -v 参数, 用于指定存有备份数据的数据卷,/host-backup是宿主机上用来存放备份数据的目录,将其挂载到容器的/container-back目录,tar命令通过/container-back获
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/283825
推荐阅读
相关标签
  

闽ICP备14008679号