Docker为容器提供了两种存放数据的资源:
1) 由storage driver管理的镜像层和容器层
2) Data Volume
storage driver
- docker镜像的分层结构, 容器由最上面一个可写的容器层, 以及若干只读的镜像层组成, 容器的数据就存放在这些层中, 这样分层结构最大的特性是Copy-on-Write:
- 新数据会直接存放在最上面的容器层
- 修改现有数据会先从镜像层将数据复制到容器层, 修改后的数据直接保存在容器层, 镜像层保持不变
- 如果多个层中有命名相同的文件, 用户只能看到最上面那层的文件
- 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数据可以被永久保存, 即使容器被销毁
bind mount
将host上已存在的目录或文件mount到容器
比如将MYSQL容器的数据放在bind mount里, host可以方便的备份和迁移数据
不足在于bind mount需要指定host文件系统的特定路径, 这限制了容器的可移植性, 当需要将容器迁移到其他host, 而该host没有要mount的数据或者数据不在相同的路径时, 操作会失败, 移植性更好的是docker managed volume
# 通过-v mount到容器, 格式为: <host path>:<container path>:权限
# 若容器目录有原有数据, 则原有数据会被隐藏, 取而代之的是host $HOME/htdocs/中的数据
# 可以bind mount单个文件, 当需要向容器中添加文件, 而不希望覆盖整个目录时
docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd
docker managed volume
与bind mount区别是使用时不需要指定mount源, 指明mount point即可
# 通过-v告诉docker需要一个data volume, 并将其mount到/usr/local/apache2/htdocs
# 需要通过docker inspect <container> 查看mounts信息中的source, source即为该volume在host上的目录
docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
总结
数据共享
容器与host共享数据
- bind mount, 直接将要共享的目录mount到容器
- docker managed volume, 需要将共享数据复制到volume
容器之间共享数据
- 将共享数据放在bind mount中, 然后将其mount到多个容器
- 另一种方式是使用volume container
volume container
volume container是专门为其他容器提供volume的容器, 它提供的卷可以是bind mount, 也可以是docker managed volume.