volume
是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供以下便利
1 | type Daemon struct { |
volume
在容器创建时就会初始化,在容器运行时就可以使用其中的文件volume
能在不同的容器之间共享和重用- 对
volume
中数据的操作会马上生效 - 对
volume
中数据的操作不会影响到镜像本身 volume
的生存周期独立于容器的生存周期,即使删除容器,volume
仍然会存在,没有任何容器使用的volume
也不会被Docker
删除
创建volume
1 | docker volume create test_volume |
Docker
在创建volume
的时候会在宿主机/var/lib/docker/volume/
中创建一个以volume ID
为名的目录,并将volume
中的内容存储在名为_data
的目录下
挂载volume
docker
还支持直接将宿主机的一个目录挂载到容器中
1 | docker run -it -v /tmp/abc:/data ubuntu /bin/bash |
只读volume
1 | docker run -it -v test_volume:/data:ro ubuntu /bin/bash |
私有volume
1 | docker run -it -v test_volume:/data:Z ubuntu /bin/bash |
可以通过 volumes-from 参数实现容器间volume共享
volume备份
通过临时的容器配合--volumes-from
在容器内将需要备份的volume
打包并导出到backup
1 | docker run --rm --volumes-from vol_simple -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data |
还原
1 | docker run -it --name vol_bck -v /data ubuntu /bin/bash |
实现
数据卷都在runc
基于bind mount
实现,将需要绑定的原地址、目的地址写到runtime spec
文件,runc
在创建rootfs
时会将对应地址绑定到新的rootfs
然后支持pivot_root