Docker数据卷

时间:2022-11-11 09:55:17


什么是docker数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使数据做为镜像的一部分保存下来,那么当容器删除后,数据也就没有了。为了能保存数据我们必须使用数据卷。数据卷就像是给容器外接了一个硬盘,数据保存在硬盘中,即使容器删除数据也不会丢失。

可以做什么
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

实现方式
通过docker 命令 为容器添加数据卷
如下命令 将 容器的dataVolume 目录挂载到 宿主机的mydataVolume 目录。

docker@default:~$ docker run -it -v /mydataVolume:/dataVolume centos      
[root@4ea59084d79b /]# docker ps

检查数据卷是否添加成功:
容器启动后 目录增加 dataVolume 目录 如下:

[root@4ea59084d79b /]# ll
total 56
-rw-r--r-- 1 root root 12082 Mar 5 2019 anaconda-post.log
lrwxrwxrwx 1 root root 7 Mar 5 2019 bin -> usr/bin
drwxr-xr-x 2 root root 40 Nov 17 07:55 dataVolume
drwxr-xr-x 5 root root 360 Nov 17 07:55 dev
drwxr-xr-x 1 root root 4096 Nov 17 07:55 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Mar 5 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Mar 5 2019 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 139 root root 0 Nov 17 07:55 proc
dr-xr-x--- 2 root root 4096 Mar 5 2019 root
drwxr-xr-x 11 root root 4096 Mar 5 2019 run
lrwxrwxrwx 1 root root 8 Mar 5 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Nov 17 07:55 sys
drwxrwxrwt 7 root root 4096 Mar 5 2019 tmp
drwxr-xr-x 13 root root 4096 Mar 5 2019 usr
drwxr-xr-x 18 root root 4096 Mar 5 2019 var

容器启动后 宿主机增加 mydataVolume目录 如下:

docker@default:/$ ls -l
total 4
drwxr-xr-x 2 root root 1420 Nov 17 05:19 bin
drwxr-xr-x 3 root root 60 Nov 17 05:15 c
drwxrwxr-x 14 root staff 4360 Nov 17 05:19 dev
drwxr-xr-x 9 root root 1000 Nov 17 05:15 etc
drwxrwxr-x 4 root staff 80 Nov 17 05:19 home
-rwxr-xr-x 1 root root 496 Mar 28 2019 init
drwxr-xr-x 4 root root 840 Nov 17 05:19 lib
lrwxrwxrwx 1 root root 3 Nov 17 05:19 lib64 -> lib
lrwxrwxrwx 1 root root 11 Nov 17 05:19 linuxrc -> bin/busybox
drwxr-xr-x 4 root root 80 Nov 17 05:19 mnt
drwxr-xr-x 2 root root 40 Nov 17 07:55 mydataVolume
drwxrwsr-x 3 root staff 180 Nov 17 05:15 opt
dr-xr-xr-x 137 root root 0 Nov 17 05:18 proc
drwxrwxr-x 2 root staff 80 Nov 17 05:19 root
drwxrwxr-x 6 root staff 120 Nov 17 05:15 run
drwxr-xr-x 2 root root 1300 Nov 17 05:19 sbin
dr-xr-xr-x 13 root root 0 Nov 17 05:19 sys
lrwxrwxrwx 1 root root 13 Nov 17 05:19 tmp -> /mnt/sda1/tmp
drwxr-xr-x 7 root root 140 Nov 17 05:19 usr
drwxrwxr-x 8 root staff 180 Nov 17 05:19 var

执行docker inspect 目录查看容器信息 ,可以看到数据卷信息 且读写状态为 true (表示有读写权限)

"Mounts": [
{
"Type": "bind",
"Source": "/mydataVolume",
"Destination": "/dataVolume",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

在容器中创建文件 containerfile.txt 并修改内容

[root@4ea59084d79b dataVolume]# touch  containerfile.txt
[root@4ea59084d79b dataVolume]# vi containerfile.txt
[root@4ea59084d79b dataVolume]# cat continerfile.txt
cat: continerfile.txt: No such file or directory
[root@4ea59084d79b dataVolume]# cat containerfile.txt

宿主机可以看到文件,添加成功

docker@default:/$ ls mydataVolume/
containerfile.txt
docker@default:/$

增加只读数据卷

命令格式: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名,如下 增加只读数据卷后容器无法在目录中添加文件并修改内容只能读取目录内容

docker@default:/$ docker@default:~$ docker run -it -v /mydataVolume:/dataVolume:ro centos 
-bash: docker@default:~$: command not found
docker@default:/$ docker run -it -v /mydataVolume:/dataVolume:ro centos
[root@29ab3fe3af4a /]# docker ps
bash: docker: command not found
[root@29ab3fe3af4a /]# docker ps
bash: docker: command not found
[root@29ab3fe3af4a /]# ls
anaconda-post.log dataVolume etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@29ab3fe3af4a /]# cd dataVolume/
[root@29ab3fe3af4a dataVolume]# touch b.txt
touch: cannot touch 'b.txt': Read-only file system

在dockfile中为镜像增加数据卷
格式;VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
由于宿主机目录是依赖于特定宿主机的,不能够保证在所有的宿主机上都存在这样的特定目录。出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。