Docker容器数据卷

柳三千

温馨提示:这篇文章已超过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

图片.png


二、设置挂载数据卷权限

容器只能读不能写

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

图片.png


总结:

  默认情况下,容器卷是可读可写的,但是在特殊场景下,我们想要容器实例内部被限制,只能读取不能写,也就是容器内只能读取宿主机文件数据,如果宿主机写入内容,可以同步给容器内,容器可以读取到。


三、数据卷的继承和共享

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

图片.png

虽然上图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
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码