数据卷管理

一  理解概念

1 使用--mount 进行挂载,type的类型bind和volume,分别是挂载绑定和挂载数据卷,请问二者有何区别。

 

答:不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径

 

2 数据卷分为命名数据卷和匿名数据卷,二者有何区别?分别在什么场合使用?

命名数据卷,在用过一次后,以后挂载容器的时候还可以使用,因为有名字可以指定。所以一般需要保存的数据使用命名卷保存。

而匿名卷则是随着容器建立而建立,随着容器消亡而淹没于卷列表中(对于

前者是docker volume create --name xxx 形式创建并命名的卷,后者一般是

 

3 什么是数据卷容器?

 

答:顾名思义,数据卷容器指的是挂载绑定了数据卷的容器,方便容器的数据管理。

 

二 实践题

1  命名数据卷

创建xd_volume数据卷,使用ubuntu:latest 镜像创建容器将该数据卷挂载到 root 分区,完成后通过 inspect 指定查看容器的挂载情况Mounts,并在本地主机数据卷的目录下查看内容。

[root@localhost ~]# docker volume create -d  local xd_volume
xd_volume
[root@localhost ~]# docker run -d --mount type=volume,source=xd_volume,destination=/root ubuntu:latest  
0b3eb0ee81fa1ad6cd8f47b0240a4ab633f6590362eb01a878a563d97d1fd166
[root@localhost ~]# docker inspect -f '{{.Mounts}}' 0
[{volume xd_volume /var/lib/docker/volumes/xd_volume/_data /root local z true }]

 

docker VOLUME 和 compose volumes区别 docker mount与volume的区别_nginx

[root@localhost ~]# docker volume inspect xd_volume
[
    {
        "CreatedAt": "2020-04-02T06:41:42-04:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/xd_volume/_data",
        "Name": "xd_volume",
        "Options": {},
        "Scope": "local"
    }
]

2  只读数据卷

创建一数据卷ng_vol,使用nginx:latest镜像创建一容器n1,该容器以只读方式挂载该数据卷,映射到容器的/usr/share/nginx/html目录。完成后通过 inspect 指定查看容器的挂载情况Mounts。

[root@localhost ~]# docker volume create -d local ng_vol
ng_vol
[root@localhost ~]# docker run -d -v ng_vol:/usr/share/nginx/html:ro  nginx:latest
a54e15df0e27311743ec06b560c9cd21d7d8cfc3d935e5cdacd2c284544a1b6e
[root@localhost ~]# docker inspect -f '{{.Mounts}}' a5
[{volume ng_vol /var/lib/docker/volumes/ng_vol/_data /usr/share/nginx/html local ro false }]

docker VOLUME 和 compose volumes区别 docker mount与volume的区别_数据_02

3 数据卷共享

(1 )用nginx:latest镜像生成三个容器,web1,web2,web3 ,设置/usr/share/nginx/html为web1数据卷容器的挂载点,web2,web3和web1 共享数据卷   

 

[root@localhost ~]# docker run -d --name=web1 -v /usr/share/nginx/html nginx:latest
8f65d4703fcaf204351555655b91678a944004833e215b6d8cd7c66fcf501b69
 
[root@localhost ~]# docker run -d --name=web2 --volumes-from web1 nginx:latest
2bb974349a3c299377ea5bee6478e5fd07f2f9c3c8f81fcde4a547474e9fd828
 
[root@localhost ~]# docker run -d --name=web3 --volumes-from web1 nginx:latest
6e3a5853929c47b3c083940509a413aed4dc504e261fbebb65752c48fe15c20e

 

(2) 进入任何一个容器,修改共享卷的内容/usr/share/nginx/html/index.html,为“Welcome,I am a web”   

 

[root@localhost ~]# docker exec -it web3 /bin/bash  
root@6e3a5853929c:
root@6e3a5853929c:/# echo "Welcome,I am web"> /usr/share/nginx/html/index.html

(3)访问另外两个容器的web服务,验证页面内容均与上一个容器一致。

 

[root@localhost apt]# docker exec -it web2 /bin/bash
root@2bb974349a3c:/#
 
root@2bb974349a3c:/# cat /usr/share/nginx/html/index.html
Welcome,I am web
 
[root@localhost apt]# docker exec -it web1 /bin/bash
root@8f65d4703fca:/# cat /usr/share/nginx/html/index.html
Welcome,I am web

 


4 备份和恢复数据卷

备份数据卷

(1)使用镜像nginx:latest数据卷容器dbstore,挂载点为 /dbdata

 

[root@localhost ~]# docker run -d --name=dbstore -v /dbdata nginx:latest
8107c2d9b5aa9e34544b310e6844748304f94bbff6d903757d01f41347aedb59

 

 

(2)再使用nginx:latest 创建容器db1 ,从dbstore数据卷容器中挂载卷

 

[root@localhost ~]# docker run -d --name db1 --volumes-from dbstore  nginx:latest
bf917b38932f695618265ed77ce6767957e60d630c619c9f606e73600e16c500

 

(3)进入db1 容器,在/dbdata目录下创建test.txt文件

 

[root@localhost ~]# docker exec -it db1 /bin/bash
root@e9642c8e5b4d:/# cd /dbdata/
root@bf917b38932f:/# touch test.txt

 

(4)通过运行新容器worker1,备份/dbdata的数据到/backup/backup.tar,从而实现对数据卷的备份, 同时在宿主机的当前目录下保存备份文件backup.tar

 

[root@localhost ~]# docker run --volumes-from dbstore  -v $(pwd):/backup --name worker1  nginx tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
[root@localhost ~]# ls
anaconda-ks.cfg  backup.tar

 

(5)删除运行的新容器worker1

[root@localhost ~]# docker rm -f worker1

worker1

恢复数据卷

(1)删除上面dbstore数据卷容器,删除db1容器

 

[root@localhost ~]# docker rm -f $(docker ps -a -q)
bf917b38932f
8107c2d9b5aa

 

(2)创新新数据卷容器dbstore1,挂载点为/dbdata

 

[root@localhost ~]# docker run -itd -v /dbdata --name dbstore1 nginx  /bin/bash     
1401587ae45eba1d059b5f90f6120574b7ec0ab52a0f038e27023027ab289c4c

(3)创建一新容器worker2,使用数据卷容器dbsore1来挂载卷,同时将宿主机保存的数据卷备份文件backup.tar解压到 /,从而恢复原数据卷的内容。

 

[root@localhost ~]# docker run --volumes-from dbstore1 --name worker2 -v $(pwd):/backup nginx tar xvf /backup/backup.tar
dbdata/
dbdata/test.txt

 

(4)进入数据卷容器dbstore1,在/dbdata目录下查看是否有test.txt文件。

 

[root@localhost ~]# docker exec -it dbstore1 /bin/bash
root@1401587ae45e:/# cd /dbdata/
root@1401587ae45e:/dbdata# ls
test.txt