docker 容器本质:
-
容器其实就是Linux下一个特殊的进程;
-
Docker容器通过namespace实现进程隔离通过cgroups实现资源限制;
-
Docker镜像(rootfs)是一个操作系统的所有文件和目录而不包括内核,Docker镜像是共享宿主机的内核的;
-
Docker镜像是以只读方式挂载,所有的增删改都只会作用在容器层, 但是相同的文件会覆盖掉下一层,这种方式也被称为"Copy-on-write";
使用Namespace进行容器的隔离有什么缺点呢?
最大的缺点就是隔离不彻底
-
容器知识运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核
-
在Linux内核中,有很多资源和对象是不能被Namespace化的,最典型的例子是:时间即如果某个容器修改了时间,那整个宿主机的时间都会随之修改
-
容器给应用暴露出来的攻击面比较大,在生产环境中,没有人敢把运行在物理机上的Linux容器暴露在公网上
linux 内核的namespace机制
-
namespace 机制提供一种资源隔离方案。
-
PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的Namespace。
-
每个 namespace下的资源对于其他的 namespace下的资源是透明的,不可见的。
Linux内核实现 namespace的一个主要目的就是实现轻量级虚拟化(容器)服务,在同一个 namespace下的进程可以感知彼此的变化,而对外界的进程一无所知,以达到独立和隔离的目的。
namespace可以隔离什么
一个容器要想与其他容器互不干扰需要能够做到:
-
文件系统需要是被隔离的
-
网络也是需要被隔离的
-
进程间的通信也要被隔离
-
针对权限,用户和用户组也需要隔离
-
进程内的PID也需要与宿主机中的PID进行隔离
-
容器也要有自己的主机名
有了以上的隔离,我们认为一个容器可以与宿主机和其他容器是隔离开的。恰巧 Linux 的 namespace可以做到这些。
namespace | 隔离内容 | 系统调用参数 |
---|---|---|
UTS | 主机名与域名 | CLONE_NEWUTS |
IPC | 信号量、消息队列和共享内存 | CLONE_NEWIPC |
Network | 网络设备、网络栈、端口等 | CLONE_NEWNET |
PID | 进程编号 | CLONE_NEWPID |
Mount | 挂载点(文件系统) | CLONE_NEWNS |
User | 用户和用户组 | CLONE_NEWUSER |
Linux的 cgroups
强大内核工具cgroups
cgroups是linux内核提供的一种机制,这种机制可以根据需求把一系列任务及其子任务整合(或分隔)到按资源分等级的不同组内,从而为系统资源提供一个统一的框架。
cgroups是Linux的另外一个强大的内核工具,有了cgroups,不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操作任务(进程或线程)启动停止等。说白了就是:cgroups可以限制、记录任务组所使用的物理资源(包括CPU,Memory,IO等),是构建Docker等一系列虚拟化管理工具的基石。
cgroups 的作用
cgroups 为不同用户层面的资源管理提供了一个统一接口,从单个的资源控制到操作系统层面的虚拟化,cgroups提供了4大功能。
-
资源限制
cgroups可以对任务使用的资源总额进行限制。 如 设定应用运行时使用的内存上限,一旦超过配额就发出OOM提示
-
优先级分配
通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级
-
资源统计
cgroups可以统计系统的资源使用量 如CPU使用时长,内存用量等,这个功能非常适用于计费
-
任务控制
cgroups 可以对任务进行挂起、恢复等操作
参考摘选:https://blog.csdn.net/u013302586/article/details/100573676