首先,容器卷有个坑:容器卷需要加入privileged=true
,如下图所示,是为了解决permission denied的问题。其中“挂载”的意思是相当于一个硬盘插到主机上。使用该命令。是扩大容器的权限解决挂载目录没有权限的问题。
docker run -d -p 5000:5000 -v /cz/myregistryl:/tmp/registry --privileged=true registry
这也印证了前文运行本地私有库registry的命令,-v是添加自定义的容器卷,仓库被挂载在宿主机/cz/myregistryl路径下,/tmp/registry表示的是容器内的路径。
实际上是完成了以后台守护式启动一个容器,实现了容器与宿主机之间的信息共享和互通互联。
总结:1、卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
2、卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
3、将docker容器内的数据保存进宿主机的磁盘中。
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
以前台交互式的形式新建一个容器,同时--privileged=true增加挂载的权限,-v开始在宿主机的tmp/host_data目录挂载一个容器的tmp/docker_data,容器名字叫做u1,使用的镜像是ubuntu。另外目录文件不需要自己额外创建,在执行命令的时候,docker会自动创建所需的目录文件夹。
在容器内cd进刚刚的目录,然后新建一个txt文件。
在主机的cd进刚刚目录下,可以看到多出了一txt文件,很明显是容器内同步过来的。
docker inspect 容器id
在宿主机执行该命令,暴露容器内各种信息,可以看到mounts这里,有挂载的容器卷的相关信息。
当容器被停掉,然后在宿主机的共享挂账目录下新建或删除一个文件,在启动容器,会发现,容器的共享挂载目录下也会有同样新建或删除的一个文件。
在宿主机的命令行内执行以下命令
docker stop 容器id
cd 进共享的目录
rm -f host_data.txt
启动 容器
docker start 容器id
进入交互式容器的命令行
docker exec -it 容器id /bin/bash
cd进容器的共享目录
ls
默认情况下,是开启读写的rw权限。
有些特殊情况需要开启只读,挂载时执行如下命令即可
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器实例内部被限制,只能读取不能写
在容器内此时执行新建一个文件,则会报错提示,不能新建,只能读文件系统,此时如果宿主机的共享目录下写入一个内容,则可以同步到容器内,容器可以读取到。
即容器1完成和宿主机的映射后,容器2继承容器1的卷规则。
在宿主机上共享目录下新建文件hostdata.txt
在容器u1上的共享目录下新建u1.data.txt
docker run -it --privileged=true --volumes-from 父类 --name=u2 ubuntu
将父类替换为容器1的名字后执行,新建一个名字为u2的容器,容器的卷规则继承容器1.
发现新建的容器u2,也有共享目录tmp/docker_data,该目录下也有两个文件。
总结:此时如果docker stop 容器id
停止任意一个容器,然后在其他主机或者另一个容器中的共享目录修改文件,在恢复docker start 容器id
启动容器后,共享目录下同样会发生文件的变动。(因为是停止容器,并不是删除容器,并未删除容器的配置信息)
例如下图左侧所示,因为微服务,会安装各种各样的包,库,组件等,还需要环境配置,比较麻烦。而右侧使用docker,只需要将配置好的包,库,组件的镜像pull下载,然后在docker容器内run运行即可。
docker search 镜像名
docker pull 镜像名
docker images
docker run 镜像名
docker stop 镜像名
docker rmi 镜像名