有道是每逢佳节倍惰怠 ~,春节期间随缘更新吧 ~
本章内容
Docker挂载数据卷相关。
本文实操全部基于Ubuntu 20.04
宿主机 => linux服务器本身
前边章节就介绍过Docker数据卷相关的知识点,也特别强调了生产环境一定要记得挂载数据卷,编程的小伙伴们都明白数据的重要性,尤其是生产环境数据的重要性,一旦丢失无法找回,随时就有可能面临被被迫提桶跑路,Docker想到了这一点,所以为数据的管理提供了非常好的支持。
docker run
执行可以添加很多的附加命令,本章都以该命令为基础进行示例。
在创建容器时创建一个数据卷
docker run -v
可以指定在容器内创建一个数据卷,-v
可以多次添加,意味着可以创建多个数据卷,执行命令如下。
可以看到容器内部我们刚刚指定创建的俩个数据卷。
宿主机目录\文件挂载
以宿主机目录为数据卷
同样docker run -v
也可以挂载一个本地已有的目录到容器中去作为数据卷,这是我们最常使用的挂载方式,非常推荐,执行命令如下。
我们将宿主机目录/laocat_nginx_data
挂载为容器的/laocat
目录。
我们添加一个文件temp.txt
到该宿主机目录下,然后神奇的一幕出现了,容器内的laocat
目录也出现了temp.txt
文件,并且内容一致。
上述场景经常出现在mysql
、redis
等需要挂载指定配置文件场景中,一是可以将配置文件全局统一;二是可以随时随地根据不同需求切换不同环境变量来使容器达到预期效果。
挂载宿主机文件为数据卷
同样使用docker run -v
可以挂载宿主机上的文件为容器中的数据卷,这种方式很少出现,执行命令如下。
此方式存在一定的问题,如果选择宿主机的某个文件为容器中的数据卷,我们尝试修改宿主机的这个文件后,可能会造成文件inode
的改变,就会导致宿主机文件内容会与容器内文件内容不一致,故不推荐使用。
数据卷容器挂载
有些情况下我们需要在容器之间共享一些持续更新的数据,那么最简单的方式就是使用数据卷容器,数据卷容器也是一个容器,专门提供数据卷供其他容器挂载。
我们创建一个数据卷容器tempv
,并在容器内创建一个数据卷tempv
,执行命令如下。
然后,创建俩个挂载tempv
数据卷容器的容器,tempv1
和tempv2
。
此时,tempv1
和tempv2
都挂载的同一个数据卷容器tempv
,且挂载相同目录tempv
,任意容器该目录下的操作,都会在其他容器中看到,比如我们在该目录下增加一个文件hello.txt
并输入内容,执行命令如下。
这时我们查看另外俩个容器内该目录下是否发生了预期的结果,执行命令如下。
-v
前边我们提到可以多次使用,那么--volumes-from
也是可以多次使用,多次使用相当于从多个容器挂载多个数据卷,也可以从已经挂载了容器卷的容器来挂载数据卷,执行命令如下。
※ 需要注意使用--volumes-from
所挂载数据卷的容器本身并不需要保持在运行状态;同时也需要注意删除挂载的容器(tempv
、tempv1
、tempv2
),数据卷并不会被自动删除,如果要删除数据卷,必须在删除最后一个挂载它的容器时显式的使用docker rm -v
命令来指定同时删除关联的容器。
备份与还原
宿主机挂载
宿主机挂载的备份与还原方案多种多样,就是linux的备份与还原,可以将挂载目录定期备份到本地,还原时拷贝到宿主机上即可。
数据卷容器挂载
-
备份
使用如下命令,可以备份tempv
数据卷容器内的数据卷。
命令有些复杂不是很容易理解,建议多读几次并结合上图命令来理解,首先我们利用ubuntu镜像创建了一个容器bak
,然后使用--volumes-from tempv
来让bak
容器挂载tempv
容器的数据卷tempv
;然后使用-v $(pwd):/bakup
来挂载本地的当前目录到bak
容器的/bakup
目录。bak
容器启动后,执行tar cvf /bakup/bak.tar /tempv
命令来将/tempv
下内容备份为容器内的/bakup/bak.tar
及宿主机当前目录下的bak.tar
文件。 -
还原
恢复就比较容易理解,我们执行命令创建一个带数据卷的容器tempvv
,执行命令如下。
然后创建另一个容器,挂载tempvv
的容器,并使用untar
解压备份文件到所挂载容器卷中,执行命令如下。
☆ 参考文献:
《Docker技术入门与实战》 第2版
《Docker技术入门与实战》 第3版
◎ 文中所用到的资源链接:
【Linux inode 详解】https://www.cnblogs.com/llife/p/11470668.html