1、坑:容器卷记得加入

--privileged=true
why

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

2、回顾下上一讲的知识点,参数V

还记得蓝色框框中的内容吗?

docker实例化greenplum单机版容器 docker privileged=true_绝对路径

docker run -d -p 5000:5000  -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

-v 说明要添加自定义的容器卷

冒号 :左边的是宿主机的路径, 右边的是容器内的路径

--privileged=true 放开root权限

/zzyyuse/myregistry/:/tmp/registry 说明容器内部和宿主机的某个绝对路径的信息的共享和互通互联

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调

docker实例化greenplum单机版容器 docker privileged=true_绝对路径_02

3、是什么

一句话:有点类似我们Redis里面的rdb和aof文件

将docker容器内的数据保存进宿主机的磁盘中

docker实例化greenplum单机版容器 docker privileged=true_绝对路径_03

运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录      镜像名

4、能干嘛

*  将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
 
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
 
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

5、数据卷案例

1、宿主vs容器之间映射添加容器卷

直接命令添加

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录      镜像名
[root@localhost ~]#   docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@4d488a083ee3:/# pwd
/
root@4d488a083ee3:/# cd /tmp/docker_data/
root@4d488a083ee3:/tmp/docker_data# ls
在u1容器据卷/tmp/docker_data目录下创建dockerin.txt
root@4d488a083ee3:/tmp/docker_data# touch dockerin.txt
root@4d488a083ee3:/tmp/docker_data# ls
dockerin.txt

在宿主机的/tmp/host_data目录下会同步dockerin.txt文件

[root@localhost ~]# cd /tmp/host_data
[root@localhost host_data]# ls
dockerin.txt

在宿主机创目录下创建文件hostin.txt

[root@localhost host_data]# touch hostin.txt
[root@localhost host_data]# ls
dockerin.txt  hostin.txt

会同步到容器卷的/tmp/docker_data目录下

root@4d488a083ee3:/tmp/docker_data# ls
dockerin.txt  hostin.tx

查看数据卷是否挂载成功

docker inspect 容器ID

例子
docker inspect 4d488a083ee3
挂载
"Mounts": [
            {	 类型:绑定
                "Type": "bind",
                源:宿主机的地址
                "Source": "/tmp/host_data",
                目的:docker里的地址
                "Destination": "/tmp/docker_data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

容器和宿主机之间数据共享

1  docker修改,主机同步获得 
2 主机修改,docker同步获得
3 docker容器stop,主机修改,docker容器重启看数据是否同步。
答案可以同步

2、读写规则映射添加说明

读写(默认)
rw = read + write

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw      镜像名
 默认同上案例,默认就是rw

只读

容器实例内部被限制,只能读取不能写

/容器目录:ro 镜像名               就能完成功能,此时容器自己只能读取不能写  
 
ro = read only
 
此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

也就是说只限制容器,没有限制主机
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro      镜像名

容器内

运行容器卷 u2
[root@localhost host_data]# docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name=u2 ubuntu

宿主机内

[root@localhost ~]# cd /mydocker/u
[root@localhost u]# pwd
/mydocker/u
[root@localhost u]# ll
总用量 0
[root@localhost u]# touch a.txt
[root@localhost u]# ls
a.txt
[root@localhost u]# vim a.txt
[root@localhost u]#

容器内

root@0069caea27ed:/# cd /tmp/u
root@0069caea27ed:/tmp/u# pwd
/tmp/u
root@0069caea27ed:/tmp/u# ls
a.txt
root@0069caea27ed:/tmp/u# cat a.txt
1111 hole world ~1

root@0069caea27ed:/tmp/u#
在容器内创建b.txt报错
root@0069caea27ed:/tmp/u# touch b.txt
touch: cannot touch 'b.txt': Read-only file system
root@0069caea27ed:/tmp/u#

3、卷的继承和共享

容器1完成和宿主机的映射

docker run -it  --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu

容器2继承容器1的卷规则

docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu
例子
docker run -it  --privileged=true --volumes-from u1  --name u2 ubuntu

u1和u2是两个独立的容器

u2是继承的u1的挂载的规则,即使把u1关闭,宿主机的改变照样会同步到u2
即使我们将u1重新启动,宿主机上的内容也会同步到u1