Docker基础 - 06Data Volumes
一、Data Volumes
- Docker 镜像由多个只读层叠加而成,启动容器时, Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
- 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,
- 该文件的只读版本仍然存在,只是被已读写层该文件的副本所隐藏, 此即"写时复制(COW)"机制
- 关闭并重启容器,其数据不受影响;但是删除Docker容器,其更改将会全部丢失。
- 存在问题:
-
- 存储于联合文件系统中,不易于宿主机访问
-
- 容器间数据共享不便
-
- 删除容器其数据会丢失
- 解决方案: "卷(volume)"
-
- 卷是容器上的一个或多个"目录",此类目录可绕过联合文件系统,与宿主机上的某目录"绑定(关联)"。
-
-
Volume于容器初始化之时即会创建,由base image提供的卷中的数据会在此期间完成复制。
-
Volume是独立于容器的生命周期实现数据持久化,因此删除容器之时不会删除卷,也不会对未被引用的卷做垃圾回收。
-
卷为docker提供了独立于容器的数据管理机制, 卷实现了"程序(镜像)"和"数据(卷)"分离。
-
二、 Volume types
Docker有两种类型的卷:
每种类型都在容器中存在一个挂载点,但在宿主机上的位置不同
- Bind mount volume
例: /my/bind/volume(container) <--> /some/specific/directory
- Docker-managed volume
例: /managed/volume(container) <--> /var/lib/docker/vfs/dir/<volume ID>
三、 使用Volumes
docker run -it --name box1 -v /data busybox docker inspect -f {{.Mounts}} box1 docker run -it -v HOSTDIR:VOLUMEDIR --name box2 busybox docker inspect -f {{.Mounts}} box2[root@component ~]# docker run -it --name box1 -v /data busybox / # ls / bin data dev etc home proc root sys tmp usr var / # cd /data /data # ls /data # echo "busybox" > aa.txt [root@component ~]# cd /var/lib/docker/volumes/88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0/_data/ [root@component _data]# ls aa.txt [root@component _data]# cat aa.txt busybox [root@component ~]# docker inspect -f {{.Mounts}} box1 [{volume 88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0 /var/lib/docker/volumes/88e72088d20953837db1e907b7cebb1a3fee70f84fe86ecd83c4b9d8bd9c1ea0/_data /data local true }]
[root@component ~]# docker inspect -f {{.Mounts}} box2 [{bind /tmp /data true rprivate}]