docker原理

一、容器核心技术治之层技术

1、cgroup:实现资源限制

cgroup全称为control group。Linux系统通过cgroup可以设置进程使用CPU、内存和IO资源的限制,在/sys/fs/cgroup/cpu/docker目录中,linux会为每个容器创建一个cgroup目录,以容器的长ID命名的目录中包含所有与cpu相关的cgroup配置。

例如:

/sys/fs/cgroup/cpu/docker/cpu.shares--cpu-shares
/sys/fs/cgroup/memory/docker--内存的配置
/sys/fs/cgroup/blkio/docker--block io的配置

在这里插入图片描述

2、namespace:实现资源隔离

在每个容器中,都有文件系统、网卡等资源,这些资源看上去都是容器自己的。拿容器来说,每个容器都会认为自己有一块独立的网卡。即使host上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。
linux实现这种方式的技术是namespace。namespace管理着host中全局唯一的资源。可以让每个容器都觉得只有自己在使用它。换句话说,namespace实现了容器间资源的隔离。

Linux使用了6种namespace,分别对应6种资源:mount、uts、ipc、pid、network和user,下面分别讨论:

1、mount namespace:文件系统的隔离

mount namespace让容器看上去拥有整个系统文件,容器有自己的/目录,可执行mount和umount命令。这些操作只在当前容器中生效,不会影响到host和其他容器。

2、uts namespace:主机名或者域名的隔离

简单地说,uts namespace让容器拥有自己的hostname。默认情况下,容器的hostname是它的短ID,可以通过-h或–hostname参数设置。

3、ipc namespace:进程通信的隔离

IPC namespace让容器拥有自己的共享内存和信号量来实现进程间的通信,而不会与host和其它容器的IPC混在一起。

4、pid namespace:进程编号的隔离

容器在host中以进程的方式运行。而且进程的PID不同于host中对应进程的pid。也就是说:容器拥有一套自己的PID,这就是PID namespace提供的功能。

5、network namespace:网络空间的隔离

network namespace让容器拥有自己独立的网卡、IP、路由等资源。

6、user namespace:用户空间的隔离

user namespace让容器能够管理自己的用户,host不能看到容器中创建的用户。

二、docker的体系结构

在这里插入图片描述

Containerd:是一个简单的守护进程,使用runC管理容器,向DockerEngine提供接口;
Shim:只负责管理一个容器;
runC:是一个轻量级的工具,只用来运行容器。

三、Dockerfile、Docker镜像和Docker容器的关系

Dockerfile是软件的原材料,docker镜像是软件的交付品,而docker容器则是软件的运行态度。简单来说,dockerfile构建出docker镜像,通过docker镜像运行docker容器。
容器和镜像的区别
所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。

在这里插入图片描述

在这里插入图片描述

三、Docker的存储驱动

Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。
在最新的 Docker 中,overlay2 取代了 aufs 成为了推荐的存储驱动,但是在没有 overlay2 驱动的机器上仍然会使用 aufs 作为 Docker 的默认驱动。

查看驱动方式
docker info | grep Storage
在这里插入图片描述

1、AUFS

UnionFS 其实是一种为 Linux 操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。而 AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。
AUFS 作为联合文件系统,它能够将不同文件夹中的层联合(Union)到了同一个文件夹中,这些文件夹在 AUFS 中称作分支,整个『联合』的过程被称为联合挂载(Union Mount):

在这里插入图片描述

每一个镜像层或者容器层都是 /var/lib/docker/ 目录下的一个子文件夹;在 Docker 中,所有镜像层和容器层的内容都存储在 /var/lib/docker/aufs/diff/ 目录中:

在这里插入图片描述

2、以overlay2为例

在这里插入图片描述
在这里插入图片描述

上面的这张图片非常好的展示了组装的过程,每一个镜像层都是建立在另一个镜像层之上的,同时所有的镜像层都是只读的,只有每个容器最顶层的容器层才可以被用户直接读写,所有的容器都建立在一些底层服务(Kernel)上,包括命名空间、控制组、rootfs 等等,这种容器的组装方式提供了非常大的灵活性,只读的镜像层通过共享也能够减少磁盘的占用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值