用一个实际例子理解Docker volume工作原理

简介:

要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理。Docker镜像是由多个文件系统的只读层叠加而成。当一个容器通过命令docker run启动时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,但是该文件的只读版本依然存在,只不过已经被读写层中该文件的副本所隐藏。

当删除Docker容器,并通过该镜像重新启动时,之前在读写层的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统),简称UnionFS,它用到了一个重要的资源管理技术,叫写时复制。写时复制(copy-on-write),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。对于一个重复资源,若不修改,则无需立刻创建一个新的资源,该资源可以被共享使用。当发生修改的时候,才会创建新资源。这会大大减少对于未修改资源复制的消耗。其实COW这个概念对编程人员来说一点也不陌生,广泛用在各种领域,比如ABAP里对于内表(Internal table)的拷贝动作,Java字符串的拷贝实现等等。Docker基于UnionFS去创建containers。

我们下面看一个实际例子。

使用命令行docker run --help查看这个命令的帮助文档。 -h 的作用是指定容器的主机名。

使用命令行创建一个新的容器:

docker run -it --name jerry-container-test -h CONTAINER -v /data busybox /bin/sh
名称为jerry-container-test, 用-v创建了一个volume /data

创建完毕之后,在容器里执行cd /data进入这个目录,这个时候还是空的。

docker ps查看容器状态:

现在我想知道主机上为了实现这个volume,使用了哪个internal目录。

用命令docker inspect jerry-container-test查看关键字"volumes":

得到了容器里/data在主机上实现的目录:

/var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data

现在我在主机上使用touch命令在这个目录下直接创建一个文件:

sudo touch /var/lib/docker/volumes/96aa969033ee7e6d7ff607a0a47de5a5866613a422518ed3f86fee6240bae8cc/_data/test.s

现在切换到容器里,用ls也能看到直接在主机上用touch命令在internal folder里创建的文件了。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

相关文章
|
6月前
|
存储 缓存 应用服务中间件
Docker 镜像解密:分层存储与镜像构建原理
Docker 镜像解密:分层存储与镜像构建原理
218 0
|
6月前
|
运维 安全 Docker
Docker 网络模型:多角度分析容器网络的原理与应用
Docker 网络模型:多角度分析容器网络的原理与应用
55 0
|
3月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
119 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
6月前
|
关系型数据库 MySQL 数据库
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
|
27天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
47 1
|
2月前
|
Java Linux 虚拟化
浅谈Docker底层原理
浅谈Docker底层原理
28 0
|
2月前
|
存储 网络协议 Unix
docker的底层原理
docker的底层原理
|
3月前
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
48 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
|
3月前
|
存储 运维 Linux
探索容器化技术:Docker的原理与应用
在当今快节奏的软件开发环境中,容器化技术成为了一种重要的工具,其中最为流行和广泛使用的是Docker。本文将深入探讨Docker的原理和使用,包括容器化概念、镜像管理、容器编排等内容,帮助读者更好地理解和应用这项技术。
49 0
|
3月前
|
存储 Linux 开发者
探索容器化技术:揭秘Docker的原理与应用
在当今快节奏的软件开发环境中,容器化技术成为了关键的工具。本文将深入探索Docker作为一种常见的容器化解决方案的原理与使用方法,并讨论其在现代应用开发中的重要性与优势。