Michael.W谈Docker 第三期-docker的数据管理

1 数据的复制

如何在容器和宿主机之间进行数据或文件的复制拷贝?

# 容器->宿主机	
$ docker cp 容器名:源路径 宿主机中的目标路径
# 宿主机->容器
$ docker cp  宿主机中的源路径 容器名:目标路径

2 数据卷的使用

数据卷比上面的数据复制要高级一些。数据卷的作用就是让容器和宿主机共享一个文件目录。通过挂载,让容器和宿主机之间形成一个映射关系,这样文件就不用在容器中留一份,宿主机中存一份。大大节约了空间。

一般在两个时刻挂载数据卷:
1.创建容器的时候;
2.启动容器的时候。(推荐)
利用一个参数-v来实现:

	$ docker run -itd --name 容器名称 -v 宿主机路径:容器路径 镜像名称 [COMMAND]
	# 例子
	$ docker run -itd --name myubuntu -v /home/michael.w/tmp:/root/ ubuntu bash

注意:宿主机路径一定要写绝对路径,否则映射会失败;
容器路径可以随便写。如果容器中不存在这个路径,会自动创建
在这里插入图片描述
可见刚生成的容器myubuntu的/root下已经能看到宿主机/home/michael.w/tmp下的test.txt文件了。
注:不仅仅可以挂载文件目录,也可以挂载文件

	$ docker run -itd --name myubuntu -v /home/michae.w/tmp/test.txt:/123.txt:ro ubuntu bash

这样就把宿主机中test.txt映射成容器中的123.txt了。

3 权限问题

通过-v进行数据卷挂载时, 默认是以读写的挂载方式。即,容器中可以读和修改从宿主机映射过来的文件。如果不想让其修改,可以将权限设置为只读。

	$ docker run -itd --name 容器名称 -v 宿主机路径:容器路径:读写权限 镜像名称 [COMMAND]
	# 例子
	$ docker run -itd --name myubuntu -v /home/michael.w/tmp:/root/:ro ubuntu bash

读写权限为rw,只读权限为ro。
在这里插入图片描述
上图显示只读,无法修改。

4 数据卷容器

数据卷容器就是一个容器,它什么也不做,就是专门用来负责数据映射的。
有的时候两个容器之间可能需要共享数据,那要怎么办?没错,此时数据卷容器就派上用场了!
在这里插入图片描述
画了一张图,容器1和容器2想要共享数据。那么就将他们的/path路径分别映射到数据卷容器的/temp路径即可。

4.1 创建数据卷容器

	$ docker run -itd --name 数据卷容器名 -v 数据卷容器的挂载路径 镜像名称 [COMMAND]
	# 例子
	$ docker run -itd --name datacon -v /temp ubuntu bash
	

4.2 数据卷容器的挂载使用

容器1和容器2创建启动时需要借助参数--volumes-from来与数据卷容器产生映射

	$ docker run -itd --name 容器名称 --volumes-from 数据卷容器名称 镜像名称 bash
	# 例子
	$ docker run -itd --name con1 --volumes-from datacon ubuntu bash
	$ docker run -itd --name con2 --volumes-from datacon ubuntu bash

在这里插入图片描述
可见在容器1中创建的test.txt,在容器2中也可以看到。
注意:整个过程中,数据卷容器datacon一直都是出于running状态。其实数据卷容器是不是运行状态都可以,只要存在即可

4.3 数据卷容器的数据备份

上面的例子可以看出,数据卷容器并没有与宿主机进行映射。如果有一天数据卷容器被删除了,那么容器1和容器2的共享数据将永远的丢失。那么有什么好的方法,可以解决这个问题么?
在这里插入图片描述
我画了一张图来说一下我思路。我可以在创建一个与宿主机映射的容器3,同时该容器也挂载了数据卷容器的/temp路径。

	# 创建并启动数据卷容器
	$ docker run -itd --name datacon -v /temp ubuntu bash
	# 创建并启动容器1
	$ docker run -itd --name con1 --volumes-from datacon ubuntu bash
	# 创建并启动容器2
	docker run -itd --name con2 --volumes-from datacon ubuntu bash
	# 进入容器1
	$ docker exec -it con1 bash
	#在容器1中创建文件并退出容器1
	$ echo "This is Michael.W" > /temp/test.txt
	$ exit
	# 创建容器3
	$ docker run -it --name con3 --volumes-from datacon -v /home/michael.w/tmp:/backup ubuntu bash
	# 压缩数据放到与宿主机机映射的目录下,退出容器3
	$ tar zcvf /backup/test.tar.gz /temp
	$ exit

在这里插入图片描述
这时,进入宿主机的映射路径下,可以看见压缩的数据包。这样也完成了将con1和con2中的数据的备份。
注:千万不要将容器3与宿主机映射的路径与数据卷容器映射的路径设置成一个路径。这样会导致映射失败。
保证:每个路径只做自己的映射功能,不要重复!

4.4 备份数据还原到数据卷容器

如果数据卷容器中的数据没有了,应该如何从宿主机中的备份数据来恢复?

	# 创建数据卷容器
	$ docker run -itd --name container -v /temp ubuntu bash
	# 创建一个第三方辅助容器,做一个桥梁来联通宿主机和丢失数据的数据卷容器
	$ docker run -it --name contemp --volumes-from container -v /home/michael.w/tmp:/backup ubuntu bash
	#进入第三方容器,将宿主机映射过来的压缩文件解压到与数据卷容器映射的路径下
	$ docker exec -it contemp bash
	$ tar zxvf /backup/test.tar.gz -C / 
	# 以上三步可以精简成一句指令
	$ docker run -itd --rm --name contemp --volumes-from container -v /home/michael.w/tmp:/backup ubuntu tar zxvf /backup/test.tar.gz -C /

在这里插入图片描述
可见在数据卷容器中已经可以看到宿主机中备份的数据了!
注:往往这种辅助容器属性设置成–rm,用完之后自动删除掉。

ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
后现代泼痞浪漫主义奠基人
公众号名称:后现代泼痞浪漫主义奠基人

猜你喜欢

转载自blog.csdn.net/michael_wgy_/article/details/88092574