● Docker 挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可(就算程序不出错,加上也可以,这是解决挂载权限问题)
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
记得上一篇文章中的开启registry指令吗
这里-v 表示要添加自定义的容器卷,冒号左边是宿主机的路径,冒号右边是容器内路径,然后放开权限,这个指令的意思就是说:我运行启动这个容器实例之后,完成了容器内部和宿主机的某个绝对路径实现了信息的共享和互通互联。
docker容器卷的工作就是将docker容器数据通过映射进行备份+持久化到本地的主机目录
解释一下:卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
● 运行一个带有容器卷存储功能的容器实例
公式: docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
● 将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
一、宿主机与容器之间映射添加容器卷
实现数据的共享与同步命令:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /temp/host_data:/temp/docker_data --name=ub ubuntu
此时,所有在当前目录下(/temp/docker_data)生成的文件都会被输送到主机的目录(/temp/host_data)下去
容器内新建一个名为dockerin的文本文件,再打开一个终端窗口我们看看有没有这个文件了
看到了没,已经被放在了本地的规定目录下了:也就是说这两个文件夹里面的内容可以互通互联,可以实现同步一致。实现了重要数据的备份和持久化。
二、读写规则映射添加说明
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
这个是默认的格式,表示进行读写操作
如果要设置为只读:容器实例内部被限制,只能读取不能写
根据截图可以看出来对不,容器内的这个文件夹中的内容目前只可以被读取而无法创建新的内容。(如果在宿主机内写入内容,是可以同步到容器内部的,也就是说容器内可以读取文件)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
三、卷的继承和共享
1、容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp/u --name u1 ubuntu
2、容器2继承容器1的卷规则
学习一个新的指令参数:
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
这个时候看看第二个容器u2:
在u2中,也有这个文件夹。
在u2的当前文件夹中新建:touch inu2.txt 可以看见在host和u2中都可以看见当前文件,实现了在宿主机和容器即继承的子类的容器之间的备份和数据共享。
注意:如果父类挂掉了之后,不影响子类和宿主机之间的通信,同样在父类活过来之后,数据也会相应的保存在父类中。