温馨提示:这篇文章已超过764天没有更新,请注意相关的内容是否还可用!
前言:
数据卷介绍
Docker容器运行所产生的数据, 如果不进行备份;那么当容器删除后,数据自然也就没有了;为了能保存数据,在Docker中我们使用数据卷。|
卷就是目录或文件,可以存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
一、容器数据卷挂载
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_vim 7.8 e619078d3432 About an hour ago 546MB nginx latest 51086ed63d8c 3 weeks ago 142MB ubuntu latest 216c552ea5ba 3 weeks ago 77.8MB centos latest 5d0da3dc9764 13 months ago 231MB martonyang/centos7.8.2003 latest 0c0f2dcf7afd 14 months ago 268MB [root@localhost docker]# docker run -it --name u1 --privileged=true -v /tmp/mydata:/tmp/mydocker ubuntu root@878f7776bf84:/# ls /tmp/ mydocker root@878f7776bf84:/# apt-get install vim
容器内部新建文件
root@878f7776bf84:/# vim /tmp/mydocker/dock_test root@878f7776bf84:/# cat /tmp/mydocker/dock_test docker test;
宿主机查看,并删除
[root@localhost ~]# cat /tmp/mydata/dock_test docker test; [root@localhost ~]# rm -rf /tmp/mydata/dock_test [root@localhost ~]#
容器查看:
root@878f7776bf84:/# vim /tmp/mydocker/dock_test root@878f7776bf84:/# cat /tmp/mydocker/dock_test docker test; root@878f7776bf84:/# cat /tmp/mydocker/dock_test cat: /tmp/mydocker/dock_test: No such file or directory
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 878f7776bf84 ubuntu "bash" 11 minutes ago Up 11 minutes u1 5b8e991d91ad 51086ed63d8c "/docker-entrypoint.…" 51 minutes ago Up 51 minutes 80/tcp gracious_joliot a5b8d9c4e554 0c0f2dcf7afd "bash" About an hour ago Up 52 minutes infallible_buck [root@localhost ~]# docker inspect 878f7776bf84
二、设置挂载数据卷权限
容器只能读不能写
docker run -id --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro --name=容器名 镜像名
容器创建文件失败
#以容器内部 只读权限 去挂载 [root@localhost docker]# docker run -it --name u2 --privileged=true -v /tmp/mydata2:/tmp/mydocker2:ro ubuntu root@44b72f3eb56d:/# ls /tmp/ mydocker2 root@44b72f3eb56d:/# touch /tmp/mydocker2/test touch: cannot touch '/tmp/mydocker2/test': Read-only file system
宿主机创建文件
[root@localhost ~]# ll /tmp/ total 4 drwxr-xr-x 2 root root 6 Oct 27 04:48 mydata drwxr-xr-x 2 root root 6 Oct 27 05:00 mydata2 [root@localhost ~]# touch /tmp/mydata2/test [root@localhost ~]# ll /tmp/mydata2/ total 0 -rw-r--r-- 1 root root 0 Oct 27 05:02 test
容器内查看
root@44b72f3eb56d:/# ll /tmp/mydocker2/ total 0 drwxr-xr-x 2 root root 18 Oct 27 09:02 ./ drwxrwxrwt 1 root root 23 Oct 27 09:00 ../ -rw-r--r-- 1 root root 0 Oct 27 09:02 test
[root@localhost ~]# docker inspect u2
总结:
默认情况下,容器卷是可读可写的,但是在特殊场景下,我们想要容器实例内部被限制,只能读取不能写,也就是容器内只能读取宿主机文件数据,如果宿主机写入内容,可以同步给容器内,容器可以读取到。
三、数据卷的继承和共享
docker run -it --name 容器名字 --privileged=true --volumes-from 父类 镜像名字
继承u2挂载数据卷的规则
[root@localhost docker]# docker run -it --name u3 --privileged=true --volumes-from u2 ubuntu root@4b7c2d5914b3:/#
[root@localhost ~]# docker inspect u3
虽然上图mode没显示只读权限,但是依旧继承了 只读权限,容器内无法创建自己的文件
root@4b7c2d5914b3:/# ll /tmp/mydocker2/ total 0 drwxr-xr-x 2 root root 18 Oct 27 09:02 ./ drwxrwxrwt 1 root root 23 Oct 27 09:20 ../ -rw-r--r-- 1 root root 0 Oct 27 09:02 test root@4b7c2d5914b3:/# touch /tmp/mydocker2/u3 touch: cannot touch '/tmp/mydocker2/u3': Read-only file system