Docker为容器提供了两种存放数据的资源:
1) 由storage driver管理的镜像层和容器层
2) Data Volume

storage driver

  • docker镜像的分层结构, 容器由最上面一个可写的容器层, 以及若干只读的镜像层组成, 容器的数据就存放在这些层中, 这样分层结构最大的特性是Copy-on-Write:
    • 新数据会直接存放在最上面的容器层
    • 修改现有数据会先从镜像层将数据复制到容器层, 修改后的数据直接保存在容器层, 镜像层保持不变
    • 如果多个层中有命名相同的文件, 用户只能看到最上面那层的文件

image.png

  • docker支持多种storage driver, 有AUFS, Device Mapper, Btrfs, OverlayFS, VFS和ZFS, docker安装时会根据当前系统的配置选择默认的driver, 默认driver具有最好的稳定性
  • 对于无状态的应用, 没有需要持久化的数据, 直接将数据放在由storage driver维护的层中是很好的选择

Data Volume

Date Volume本质上是Docker Host文件系统中的目录或文件, 能够直接被mount到容器的文件系统中, Date Volume有以下特点:

  • Data Volume是目录或文件, 而非没有格式化的磁盘(快设备)
  • 容器可以读写volume中的数据
  • volume数据可以被永久保存, 即使容器被销毁

docker提供了两种类型的volume:

bind mount

将host上已存在的目录或文件mount到容器
比如将MYSQL容器的数据放在bind mount里, host可以方便的备份和迁移数据
不足在于bind mount需要指定host文件系统的特定路径, 这限制了容器的可移植性, 当需要将容器迁移到其他host, 而该host没有要mount的数据或者数据不在相同的路径时, 操作会失败, 移植性更好的是docker managed volume

  1. # 通过-v mount到容器, 格式为: <host path>:<container path>:权限
  2. # 若容器目录有原有数据, 则原有数据会被隐藏, 取而代之的是host $HOME/htdocs/中的数据
  3. # 可以bind mount单个文件, 当需要向容器中添加文件, 而不希望覆盖整个目录时
  4. docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd

docker managed volume

与bind mount区别是使用时不需要指定mount源, 指明mount point即可

  1. # 通过-v告诉docker需要一个data volume, 并将其mount到/usr/local/apache2/htdocs
  2. # 需要通过docker inspect <container> 查看mounts信息中的source, source即为该volume在host上的目录
  3. docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd

image.png

总结

image.png

数据共享

容器与host共享数据

  • bind mount, 直接将要共享的目录mount到容器
  • docker managed volume, 需要将共享数据复制到volume

image.png

容器之间共享数据

  • 将共享数据放在bind mount中, 然后将其mount到多个容器
  • 另一种方式是使用volume container

volume container

volume container是专门为其他容器提供volume的容器, 它提供的卷可以是bind mount, 也可以是docker managed volume.
image.png

data-packed volume container

image.png

Data Volume生命周期管理

image.png
image.png