Docker overlay存储工作原理

一、镜像与分层

一个镜像由多个分层组成。Dockerfile中写有每个分层,比如:

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

dockerfile中每一行指令都会创建一个层次。每一层保留只有与前一层有差异的部分,一次次进行叠加。当你创建一个‘容器’时,顶层将会创建一个读写层。这个读写层就称之为“容器层”。容器中的文件增加、删除、修改,都在容器层中操作。这些层级之间文件操作由docker的storage driver来进行实现。

二、OverlayFS 工作原理

overlay是storage driver的一种实现。可在/etc/docker/daemon.json中设置

{
  "storage-driver": "overlay2"
}

overlay有两层结构,底层叫lowerdir,上层叫upperdir,然后通过merged来提供一个最终合成的视图,来作为容器的实际挂载点。

overlayfs lowerdir, upperdir, merged

overlay只有两层,这意味着他无法由多层的镜像组成。镜像的每一层,都在目录/var/lib/docker/overlay下有他自己的目录。

创建一个容器时,镜像的最顶层作为lowerdir(只读),容器中新创建的文件就在upperdir层(可写)

三、宿主机磁盘中的overlay存放方式

/var/lib/docker/overlay/中,每个镜像层都有他自己的文件夹。每一层都只包含他独有的一些文件,与底层共享的那些文件则通过硬链接的方式实现。可高效利用磁盘空间。

$ ls -l /var/lib/docker/overlay/

total 20
drwx------ 3 root root 4096 Jun 20 16:11 38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8
drwx------ 3 root root 4096 Jun 20 16:11 55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358
drwx------ 3 root root 4096 Jun 20 16:11 824c8a961a4f5e8fe4f4243dab57c5be798e7fd195f6d88ab06aea92ba931654
drwx------ 3 root root 4096 Jun 20 16:11 ad0fe55125ebf599da124da175174a4b8c1878afe6907bf7c78570341f308461
drwx------ 3 root root 4096 Jun 20 16:11 edab9b5e5bf73f2997524eebeac1de4cf9c8b904fa8ad3ec43b3504196aa3801
$ ls -i /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

19793696 /var/lib/docker/overlay/38f3ed2eac129654acef11c32670b534670c3a06e483fce313d72e3e0a15baa8/root/bin/ls

$ ls -i /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

19793696 /var/lib/docker/overlay/55f1e14c361b90570df46371b20ce6d480c434981cbda5fd68c6ff61aa0a5358/root/bin/ls

 四、用overlay时,容器读写文件的机制

读文件:

1、容器层中无文件:从lowerdir中读取

2、只有容器层中有文件:直接总容器层中读取

3、容器层与镜像层都有:读容器层中的文件,再隐藏镜像层中的同名文件

文件修改:

第一次写文件:先从镜像复制文件到容器层,在容器层中修改文件

删除文件:容器层中的文件变空文件,但是镜像层中的文件任然未变

重命名目录:只有源和目的路径都在顶层时,才能重命名。

五、性能

overlay的性能比aufs和devicemapper好。

对于读写频繁的文件,需要放入volume存储卷。这些可以跳过storage driver,减少写时拷贝(copy on write)的操作

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker Swarm是一个用于管理和编排Docker容器的工具。覆盖网络(Overlay Network)是在多个Docker主机上创建的虚拟网络,允许容器在不同主机上进行通信。下面是Docker Swarm覆盖网络的工作原理的简要解释: 1. 初始化Swarm:首先,我们需要在Docker Swarm中初始化一个集群。一个节点被选举为管理节点,其他节点加入集群。管理节点负责存储集群的配置信息和管理集群状态。 2. 创建网络:通过使用Docker CLI或者Docker API,我们可以创建一个Overlay网络。这个网络是逻辑上的,通过覆盖在底层物理网络上,容器可以通过网络互相通信。 3. 容器加入网络:一旦Overlay网络创建成功,容器可以通过将其连接到该网络来加入这个网络。所有加入同一个Overlay网络的容器都可以相互通信,无论它们在哪个Docker主机上。 4. 路由和发现:当容器想要与其他容器通信时,Docker Swarm会使用覆盖网络的路由和发现机制来确定如何将网络流量正确转发到目的地容器。这些机制是透明的,对容器来说,它们只需要知道如何访问其他容器的IP地址即可。 5. 加密和安全性:Docker Swarm覆盖网络还提供了安全性和加密功能。它使用TLS加密保护节点之间的通信,并为容器之间的通信提供了隔离和保护。 总体来说,Docker Swarm覆盖网络的工作原理是通过在多个主机上创建虚拟网络来实现容器之间的通信。这种网络是透明的,容器不需要了解底层网络的细节,只需要知道其他容器的IP地址即可实现跨主机的通信。同时,它还提供了安全性和加密功能,保护容器之间的通信。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值