容器数据卷
容器数据卷是什么?
卷就是目录或者文件,存在一个或者多个容器中,由 Docker 挂载到容器,但是不属于联合文件系统,数据卷设计的目就是数据的持久化存储,完全独立于容器的生命周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。
容器数据卷的特征:
- 数据卷可以在容器之间共享或者重用数据
- 容器和宿主机之间数据共享
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用他们为止
为容器添加数据卷:
docker run -it --pervileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
# 选项解释
--privileged=true 的作用是允许目录挂载
-v 是挂载硬盘
Docker 挂载目录访问的时候如果出现 cannot open directory : Permission denied 解决办法就是在挂载目录后多加一个 --privileged=true 参数即可
在进行容器数据卷挂载的时候如果如果容器中的目录不存在的话Docker 会自动创建,但是如果实在宿主机的目录不存在的时候挂载命令就会报错提示
查看容器的数据卷是否挂载成功
命令:docker inspect 容器ID
其中 Source 是宿主机的目录,Destination 是容器内的目录
容器数据卷和主机互通互联
- docker 修改,主机同步获得
- 主机修改 ,docker 同步获得
- docker 容器stop ,主机修改,docker 容器重启数据仍能同步
数据卷的读写规则
ro 即 read only ,容器只能读;rw 即 write only 容器只能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro --name:容器名 镜像名
容器卷之间的继承
docker run -it --privileged=true --volumes-from 父类(名称) --name:容器名 镜像名
具名挂载和匿名挂载
docker volume ls 查看所有数据卷的情况
匿名挂载
docker run -d -P --name=nginxt01 -v /etc/nginx nginx
使用docker volume ls 查看:
这里84开头的那一长串就是挂载到宿主机的名字。
我们继续追查下去。这里教给大家一个很简单的命令,less。如果输出的信息太多了,我们找不到,就可以这样使用
cmd | less 栗子: docker inspect 84(容器ID) | less
然后输入/name, name是你想查到的内容,就可以很轻松的找到啦。
大家仔细看一下,是不是/etc/nginx就是叫84开头的那一长串,挂载到了我/var/lib…路径下,我们复制这个路径继续去查看。
怎么样,是不是在我们的宿主机就发现了这样的一个文件呢?这就是所谓的匿名挂载!是不是很简单
具名挂载
我们使用具名挂载的方式启动一个容器
docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx
查看数据卷:docker volume ls
docker inspect ID | less 找到挂载点
我们再复制一下路径,找到nginx的配置文件
如何确定是具名挂载还是匿名挂载:
-v 容器内路径 #匿名挂在
-v 卷名:容器内路径 #具名挂在
-v /宿主机路径:容器内路径 # 指定路径挂载
Tips:
通过 -v 容器内路径 :ro rw 可以改变读写权限
ro readonly #只读
rw readwrite #可写可读
例: docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx
docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx