Docker数据管理
遗留问题
容器的特性
- Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部增加一个读写层
- 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即“写时复制”机制
- 关闭重启容器,其数据不受影响;但删除Docker容器,则其改变将会全部丢失
问题
- 存在于联合文件系统中,不易被宿主机访问
- 容器间数据共享不便
- 删除容器其数据会消失
解决方案: 数据卷
数据卷时容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某目录绑定
Docker存储驱动(storage driver)
Docker存储驱动(storage driver 是Docker的核心组件,它是Docker实现分层镜像的基础
- device mapper(DM):性能和稳定性存在问题,不推荐生产环境使用
- btrfs:社区实现了btrfs deiver,稳定性和性能存在问题
- overlayfs:内核3.18overlayfs进入主线,性能和稳定性优异,第一选择
数据卷的作用
数据卷时一个可供容器使用的特殊目录
- 数据卷可以在容器之间共享和重用
- 数据卷修改会立即生效
- 数据卷的更新不会影响镜像
- 如果容器使用数据卷,该卷会一直存在
数据卷的使用
Docker-managed Volume(Docker管理卷)(匿名挂载)
docker run -it --name test -v ContainerDir imageid
Bind-mount Volume(绑定卷)(指定路径挂载)
docker run -it --name test -v HostDir:ContainerDir imageid
Union Volume(容器卷)
docker run -it --name test --volumes-from ContainerName imageid
上面说到了一个匿名挂载,当使用Docker管理卷时,docker会自动生成一个匿名卷,通过
docker volume ls
可以查看到
那具名挂载又是什么呢? docker run -it --name test -v juanming:ContainerDir
imageid 这时候再使用docker volume ls
就可以看到数据卷中多了一个“juanming”的数据卷,当然你可以使用docker volume inspect juanming
查看数据卷的详细内容
卷管理命令
# 删除没有挂载到容器的卷
docker volume prune
# 删除指定的数据卷
docker volume rm 卷名