数据卷管理
一 理解概念
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 }]
[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 }]
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