深入理解docker volume

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解docker volume相关的知识,希望对你有一定的参考价值。

参考技术A

​ Docker Volume 即数据卷,用于保持数据持久化,例如mysql运行在Docker容器中时,一般将数据通过 Docker Volume 保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。

​ Docker Volume 就是一个目录或者文件,通俗得理解就是宿主机或者网络存储系统中的一个目录或者文件挂载在容器中用于保持数据持久化

我们先了解一下什么是联合文件系统

联合文件系统( UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父 镜像),可以制作各种具体的应用镜像。

如果运行中的容器修改了现有的一个已经存在的文件,那该文件会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是被读写层中该文件的副本所隐藏,这是“写时复制(COW)”机制 “

但对对于磁盘io要求比较高的redis MySQL 等应用,不适合这种分层叠加写时复制文件系统

这个设计虽然使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。

为了解决这些问题docker引入了数据卷机制(docker volume,volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。

​ 数据卷容器也是一个容器 它的目的是专门提供数据卷给其他容器挂载

什么时候需要用的数据卷容器

注意:

使用 --volume-from 参数所挂载的数据的容器自身并不需要保持运行状态

如果删除了挂载的容器(volume_docker,dbdat1,dbdata2),数据卷并不会被删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v 命令指定同时删除关联的容器

在Dockerfile 中通过 VOLUME 指令添加 数据卷

什么是Docker Volume?

摘要Docker Volume,通常翻译为数据卷,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。这篇博客将通过简单的实践帮助大家理解什么是Docker Volume
技术分享图片
本文所有命令都是在play-with-docker的在线Docker实例上执行,Docker版本为17.05.0-ce

1. 指定Docker Volume

使用docker run命令,可以运行一个Docker容器

docker run -itd --volume /tmp/data1:/tmp/data2 --name test ubuntu bash
  • 基于ubuntu镜像创建了一个Docker容器。
  • 容器的名称为test,由--name选项指定。
  • Docker Volume--volume选项指定,主机的/tmp/data1目录与容器中的/tmp/data2目录一一对应。

2. 查看Docker Volume

使用docker inspect命令,可以查看Docker容器的详细信息:

docker inspect --format=‘{{json .Mounts}}‘ test | python -m json.tool
[
    {
        "Destination": "/tmp/data2",
        "Mode": "",
        "Propagation": "",
        "RW": true,
        "Source": "/tmp/data1",
        "Type": "bind"
    }
]
  • 使用--format选项,可以选择性查看需要的容器信息。.Mount为容器的Docker Volume信息。
  • python -m json.tool可以将输出的json字符串格式化显示。
  • Source表示主机上的目录,即/tmp/data1
  • Destination为容器中的目录,即/tmp/data2

3. 本机文件可以同步到容器

在本机/tmp/data1目录中新建hello.txt文件

touch /tmp/data1/hello.txt
ls /tmp/data1/
hello.txt

hello.txt文件在容器/tmp/data2/目录中可见

使用docker exec命令,可以在容器中执行命令。

docker exec test ls /tmp/data2/
hello.txt

可知,在本机目录/tmp/data1/的修改,可以同步到容器目录/tmp/data2/中。

4. 容器文件可以同步到主机

在容器/tmp/data2目录中新建world.txt文件

docker exec test touch /tmp/data2/world.txt
docker exec test ls /tmp/data2/
hello.txt
world.txt

world.txt文件在主机/tmp/data1/目录中可见

ls /tmp/data1/
hello.txt  world.txt

可知,在容器目录/tmp/data2/的修改,可以同步到主机目录/tmp/data1/中。

5. 结论

Docker Volume本质上是容器与主机之间共享的目录或者文件,这样Docker Volume中的数据可以在主机和容器中实时同步。使用Virtualbox创建虚拟机时,也可以配置共享目录,这与Docker Volume非常相似。

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

技术分享图片

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2017/06/07/what-is-docker-volume/

以上是关于深入理解docker volume的主要内容,如果未能解决你的问题,请参考以下文章

10张图带你深入理解Docker容器和镜像

这10张图带你深入理解Docker容器和镜像

10张图带你深入理解Docker容器和镜像

10张图带你深入理解Docker容器和镜像

理解Docker——深入引擎室

云计算docker的小知识,帮你更深入理解容器技术