Docker 数据卷的管理

 Docker 数据卷管理

 理解概念

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

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

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

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

而匿名卷则是随着容器建立而建立,随着容器消亡而淹没于卷列表中(对于 docker run 匿名卷不会被自动删除)

前者是docker volume create --name xxx 形式创建并命名的卷后者一般是 docker run -v /data 这种不指定卷名的时候所产生,或者 Dockerfile 里面的定义直接使用的。

3 什么是数据卷容器?

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

实践题

1  命名数据卷

创建xd_volume数据卷,使用ubuntulatest 镜像创建容器将该数据卷挂载到 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 }]

 

[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,使用nginxlatest镜像创建一容器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 }]

 

3 数据卷共享

(1 )nginxlatest镜像生成三个容器,web1web2web3 ,设置/usr/share/nginx/htmlweb1数据卷容器的挂载点,web2web3web1 共享数据卷   

[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,为“WelcomeI 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

猜你喜欢

转载自www.cnblogs.com/PGxiaochaoren/p/12629967.html
今日推荐