Docker基础 - 06Data Volumes

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}]

  

四、共享卷

4.1 在容器之间共享卷

docker run -it --name share01 -v /data/volumes/v1:/data busybox docker run -it --name share02 -v /data/volumes/v1:/data busybox  

4.2 复制使用其他容器的卷

docker run 命令使用 --volumes-from 选项 docker run -it --name share01 -v /data/volumes/v1:/data busybox docker run -it --name share02 --volumes-from share01 busybox    

上一篇:嵌入式Linux:制作ramdisk并启动


下一篇:【busybox】busybox使用总结 -01