Docker Volume的一些注意事项

Docker Volume的一些注意事项

前言

我们都知道docker是联合文件系统,是分层的,image是只读层,当我们容器工作产生数据的时候只是将数据写入了容器的可写层中。当我们容器重启或者删除,之前产生的数据就会消失,如何解决这个问题呢?可以commit成镜像,或者通过volume将我们的数据持久化到宿主机的硬盘上或者分布式存储(glusterfs ,ceph)。但volume挂载时候有一些坑还需要注意,否则重要文件会被清空。下面我会详细介绍。

场景

1.volume既可以挂载目录,也可以只挂载文件。

2.创建一个容器A 并通过volume持久化,其他每个容器可以通过指定 –volumes-from  A 从而实现一个简单的共享存储。

比如nginx+php环境。在宿主机上同在代码文件放在nginx 和php都监听的root路径下,nginx和php都能找到。而在容器中我们配置文件都是从宿主机挂载到容器里,此时还需要给php也进行挂载。因为nginx和php 文件系统namespace隔离。我们也可以通过在php容器启动时执行 –volumes-from nginx 即可

格式

-v 宿主机目录:容器目录

-v 宿主机文件:容器文件

注意 :顺序已经固定,不能改变。前面就是代表宿主机的目录

原理

实际上volume和挂载一样,就是将我们宿主机的目录挂载到容器内部。

1.如果宿主机是空目录A,容器目录A是非空的,二者名字相同,那么容器目录A下面的内容会被清空。

2.如果宿主机非空目录A 里面有文件b ,容器目录A下面也有文件b,二者内容不同,则挂载后,宿主机的b的内容会覆盖容器里。

备注:对于目录挂载,无论宿主机还是容器,如果目录不存在都会自动创建,而对于文件,可以允许容器内没有该文件。但是不允许宿主机内将不存在的文件进行挂载。

3.如果宿主机是文件A 容器也是文件A挂载后,宿主机A文件内容会覆盖容器的

4.如果宿主机是文件A ,容器文件B不存在,那么会在容器内部创建B文件,然后内容是宿主机A文件的内容。

备注:如果宿主机A文件不存在,你还声明了挂载。会提示报错。

总结

需要持久化的容器在最初就通过  volume挂载,这样数据就会在宿主机上A绑定,我们删除更新宿主机A的volume,也会同步到容器上。当需要容器和数据迁移到另外一个机器时候B,只需要打包宿主机A的数据。然后把数据解压到B上,进行挂载即可。

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...