docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。当容器被销毁的时候,容器所对应的数据也会一并删除,容器中的数据不是持久化的。
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
Volume的作用
通过数据卷可以在容器之间实现共享和重用
对数据卷的修改会立马生效(非常适合作为开发环境)
对数据卷的更新,不会影响镜像
卷会一直存在,直到没有容器使用
volume的使用
首先,我们创建一个目录ROOT,然后在目录下创建一个index.html的文件,内容为hello docker;
接着将这个目录挂在到tomcat容器的ROOT目录下,启动容器。
docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT/:/usr/local/tomcat/webapps/ROOT tomcat
/usr/local/docker/tomcat/ROOT/是宿主机的目录,/usr/local/tomcat/webapps/ROOT是tomcat镜像的目录,-v 来创建一个数据卷并挂载到容器上。
接着以交互的方式进入容器,查看ROOT目录下的文件,只有index.html。
也可以将这个目录挂在到其他容器。
docker run -p 8081:8080 --name tomcat1 -d -v /usr/local/docker/tomcat/ROOT/:/usr/local/tomcat/webapps/ROOT tomcat
数据共享
如果想要实现容器间的数据共享,那么需要授权一个容器访问另一个容器的Volume。我们可以在使用docker run时使用-volumes-from参数来进行指定。
docker run -it -h NEWCONTAINER --volumes-from tomcat tomcat bash
查看所有的 数据卷
docker volume ls
查看数据卷信息
docker volume inspect my-vol
删除数据卷
docker volume rm my-vol
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
docker volume prune