博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Docker基础 - 06Data Volumes

Posted on 2021-11-06 16:47  Kingdomer  阅读(40)  评论(0编辑  收藏  举报

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

 

[root@cl-server ~]# docker volume create hello
hello
[root@cl-server ~]# docker volume ls
DRIVER    VOLUME NAME
local     hello
[root@cl-server ~]# docker volume inspect hello
[
    {
        "CreatedAt": "2021-07-23T16:35:57+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/hello/_data",
        "Name": "hello",
        "Options": {},
        "Scope": "local"
    }
]
[root@cl-server ~]# docker run -itd --name vol03 -v hello:/world busybox 2dc614dc563951f3b17b8dc010eb9b2f6dfb64456eb26d49f4a16e2683da5c5f [root@cl-server ~]# docker run -itd --name vol04 -v hello:/hello -v hello2:/hello2 busybox "Mounts": [ { "Type": "volume", "Name": "hello", "Source": "/var/lib/docker/volumes/hello/_data", "Destination": "/hello", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "hello2", "Source": "/var/lib/docker/volumes/hello2/_data", "Destination": "/hello2", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ],
[root@cl-server ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' vol04 10.0.1.7 [root@cl-server ~]# docker inspect --format='{{range .Mounts}}{{.Name}}{{end}}' vol04 hellohello2 [root@cl-server ~]# docker inspect --format='{{range .Mounts}}{{.Name}}{{println}}{{end}}' vol04 hello hello2

  

四、共享卷

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