背景
最近自己写一个dockerfile基于一个基础的image,但是基于这个基础的image生成的容器里面有一层目录有些多余,我想把它删除掉。但是发现删除不了,报错为cannot remove XXX: Device or resource busy,原因就是因为这个image里面设置了挂载目录。这个容器的dockerfile 不知道去哪里了,后面还commit了一次,也不知道历史信息了,哎
解决
想着去解决这个问题就来了解docker的Data Volume。
解析Data Volume
数据卷(Data Volume)是一个经过特殊设计的目录,它将主机目录直接映射进容器。可以绕过联合文件系统(UFS),为一个或多个容器提供访问。
数据卷完全独立于容器的生存周期,创建之后不会根据容器的删除而删除。它的特性为以下
• 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
• 数据卷存在于宿主机中,可宿主机与容器进行共享
• 数据卷可以在容器间共享和重用
• 可以对数据卷里的内容直接进行修改,修改会马上生效,无论是容器内操作还是本地操作
• 数据卷的变化不会影响镜像的更新(image中也不会包含数据卷的数据)
• 卷会一直存在,即使挂载数据卷的容器已经被删除
Data Volume相关的命令
删除容器并附带删除数据卷:
docker rm -v [container name]
查看所有的数据卷
docker volume ls
清除不需要的数据卷
docker volume prune
删除数据卷
docker volume rm 数据卷ID (需要在容器删之后才可以删除)
查看docker 容器的挂载
docker inspect container_name | grep Mounts -A 20
最终
最终也没有将挂载目录删除,而是有重新换了个目录。这也充分看出在创建image的时候还是需要使用dockerFile,而谨慎使用docker commit去基于已有的docker容器来创建image