要了解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的原创文章,请关注公众号"汪子熙":
相关推荐
用户可以选择指定一个现有的目录作为 Docker Volume,或者让 Docker 自动创建一个新的空目录作为 Volume。 例如,以下命令将会把宿主机上的 `/data` 目录挂载到容器内的 `/data` 路径: ```bash docker run -v /...
- **创建Volume**:使用`docker volume create`命令创建一个新的数据卷。例如,`docker volume create --name www-data`会创建一个名为`www-data`的Volume。 - **查看Volume**:使用`docker volume ls`命令列出所有...
Docker 镜像分层原理 Docker 镜像分层原理是 Docker 容器技术的核心概念之一。通过本文,我们将深入探讨 Docker 镜像分层原理的概念、...理解镜像分层原理可以帮助我们更好地使用 Docker,提高容器化的效率和灵活性。
以下是一个具体的例子,展示了如何手动构建一个Docker网络环境: 1. **启动容器**: 首先启动两个容器`docker1`和`docker2`,并指定`--net=none`以禁止Docker自动配置网络。 ``` docker run -itd --name=docker1 -...
于是,我花了几周的时间来学习Docker的工作原理,更确切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来
在容器内部初始化一个外部Docker守护进程。这可以通过设置环境变量`DOCKER_HOST`来实现,将其指向外部Docker守护进程的unix socket或TCP地址。 2. 挂载Docker socket 将外部Docker守护进程的socket挂载到容器内部。...
但是如果我们需要修改我们的运行代码,或者有输入输出文件的时候,我们就没有办法了,每一个container运行完毕后,其分配的资源以及文件系统都会消失,那么我们就需要在本地给docker container挂载一个卷,这样在...
3. LibraryOS原理:DrawBridge技术的核心是LibraryOS概念,它相当于给每个进程提供了一个薄薄的“外皮”,实质上是为两个重要的内核模式组件win32k.sys和OSKernel提供了用户模式下的独立副本。其中,win32k.sys的...
在学习docker的过程中,容易对镜像和容器之间的概念进行混淆。这个资料就深入docker实现原理,帮助同学打通任督二脉,从此对docker的学习游刃有余
接下来,我们来看一下Docker如何使用Volume Plugin。Docker的Container结构中有一个名为MountPoints的map类型变量,用于存储容器中所有已挂载的Volume。MountPoint结构保存了挂载目录和Volume结构的基本信息,并管理...
Docker Volume是一种可以被一个或多个容器共享、使用的特殊目录,它为容器...通过以上知识点的总结,可以对Docker Volume的权限管理有一个全面的理解,并在实际操作中有效避免相关问题,提高容器应用的稳定性和安全性。
当Docker server也就是docker daemon启动时,会自动创建一个名字是docker0的bridge,每当docker创建一个Container时,会在主机上面创建一个名字是veth*的ethernet 端口,并把这个eth*加入到docker0的bridge,在...
app.js是一个更完整的Volume Plugin,它使用SSHFS作为基础文件系统,并通过Volume Plugin从Docker实例化。如何设定创建一个文件helloworld.json并将其放在/etc/docker/plugins { "Name": "plugin-helloworld", ...
blockbridge-docker-volume, Docker的Blockbridge卷插件 Blockbridge Docker 插件版本 3.1Blockbridge插件可以作为 Docker 1.13 的"托管 Docker 插件",也可以作为 Docker 1.12和更高版本的"旧版插件"。 两个选项都...
大厂2018年,培训视频资料,完整讲解docker的使用,深入理解docker docker实战讲解
docker原理
PPT内容为三部分—— what is Docker Docker Architecture Docker Installation
Docker-s3-volume 是一个工具,它允许Docker容器使用Amazon S3作为数据卷,实现数据在本地与云端的同步。这对于备份、恢复或者在多台机器间共享持久化数据非常有用,特别是对于那些依赖云存储服务的应用场景。 **...