Docker数据管理

  • 遗留问题
  • 容器的特性
  • 问题
  • Docker存储驱动(storage driver)
  • 数据卷的作用
  • 数据卷的使用
  • Docker-managed Volume(Docker管理卷)(匿名挂载)
  • Bind-mount Volume(绑定卷)(指定路径挂载)
  • Union Volume(容器卷)

遗留问题

容器的特性

  • Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部增加一个读写层
  • 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即“写时复制”机制
  • 关闭重启容器,其数据不受影响;但删除Docker容器,则其改变将会全部丢失

问题

  • 存在于联合文件系统中,不易被宿主机访问
  • 容器间数据共享不便
  • 删除容器其数据会消失

解决方案: 数据卷

数据卷时容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某目录绑定

升级Docker desktop_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 卷名