容器的基本概念

容器技术的基本概念:

什么是容器?

包装或装载物品的贮存器

没错计算机领域的容器概念也是一样,思考一下你们家的菜要分盘子呢?难道不可以十几个菜放一个大盆子里吗?当然是可以的,只是这样能好吃吗~~~~ 容器技术也是一样的道理就是不同容器里的进程不会互相影响,你的空间只有那么大,就好比你的碗只能盛那么多饭~~~~~ 没错就是这样

容器是虚拟化技术

虚拟化技术分为:

  • 主机级虚拟化
  • 容器级虚拟化

主机级虚拟化:

Type-I:

Type-II:

为每一个封闭的实例,提供的是一个从底层硬件开始一直到高层的基础环境。也就意味着说我们每一个对应的虚拟机实例就拥有自己可视的,而且是隔离于其它实例的基础硬件,包括CPU,内存等等,所以它在硬件完成资源划分以后,提供给了我们每一个实例一个基础环境,使得我们每一个实例都得安装操作系统,从而就拥有自己的内核空间和用户空间,所以这么一来不当紧,做为当前实例的使用者,就得安装操作系统,提供环境,安装程序并提供配置文件,最终才可用服务。

主机级虚拟化,由于做了两级内核,虚拟机自己有一级,hypervisor会有性能损耗,但是隔离性是非常好的。但过于重量级。

技术代表:

VM:这个开发者们就比较熟悉了

容器级虚拟化:

用户空间仅仅运行用户进程而以,就不需要在主机级虚拟化技术上,它自己管理自己的内核,把虚拟出来的内核给剥离掉。给用户一个chroot环境,在这个虚根下,能够隔离和其它用户相关的用户环境。
在内核中的一个逻辑级别能够设置为隔离开来的区域,彼此之间互相不干扰,不影响的话。那么我们就可以做出来仅在用户空间,就能实现隔离的组件来。那这个在用户空间就能实现的组件就称为“容器”。每一个空间就称为一个容器,因为每一个空间都容纳了一堆的进程和用户帐号文件等等

容器的作用是环境隔离也是追求的目标,隔离的是用户空间,IPC 完全独立 ,不同,USER 不同(一个假的root)、网络(都有不同的TCP协议栈)都是假的宿主机来说

技术代表:
LXC:

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
(1)与宿主机使用同一个内核,性能损耗小;
(2)不需要指令级模拟;
(3)不需要即时(Just-in-time)编译;
(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(5)避免了准虚拟化和系统调用替换中的复杂性;
(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

缺点:

  • lxc-create,template(解决系统发行版不同问题,完成各种隔离文件系统等 的安装)
  • 迁移和批量不方便
    总结:Linux Container是一种轻量级的虚拟化的手段,是一种前端工具,但是不适合大规模使用。
Docker:

相当于LXC的加强版和LXC一样的是都是一种工具,对于Docker 解决的就是LXC问题,对不同发行版做了更好的问题,解决思路就是镜像,基于镜像启动容器,而不同的镜像在拉取得时候会对应的发行版

docker的优势:

  • 一个容器只运行一个进程没有使用容器的话就是所有的进程共同使用一个用户空间 ipc 等

  • 如果没用容器假如出问题了,那么每个容器都有自带的调试工具,对运维人员不友好,对开发人员友好
    易于分发,不考虑底层系统,部署简单

  • docker 镜像(分层构建,联合挂载):防止单个镜像体积过大

ps:下层不能修改只能读,就算该也会先复制下层,对于数据 一般都是挂载宿主机的存储里,容器不需要持久,进程挂了容器也就可以删了

隔离与分配的实现

那么这个隔离怎么实现呢?

内核 Namespaces原生支持(UTS,mount,ips,pid,user,net)这些隔离,linux有专门的系统调用

namespaces 系统调用参数 隔离内容 内核版本
UTS CLONE_NEWUTS 主机和域名 2.6.19
IPC CLONE_NEWIPC 信号量,消息队列,共享内存 2.6.19
PID CLONE_NEWPID 进程编号 2.6.24
NETWORK CLONE_NEWNET 网络设备 2.6.29
MOUNT CLONE_NEWMOUNT 挂载点 2.4.19
USER CLONE_USER 用户和用户组 3.8

资源分配如何实现呢?
使用cgroups针对用户控件和进程进行资源分配

cgroups 分配内容
blkio 块设备IO
cpu CPU
cpuacct CPU资源使用报告
cpuset 多处理器平台上的CPU集合
devices 设备访问
freezer 挂起或恢复任务
memory 内存用量和报告
perf_event 对cgroups中的任务进行统一性能测试
net_ds 数据报文的类别标识

容器编排工具:

为了管理(单机或集群)容器的生命周期,解决服务之前的依赖关系,这就是编排工具干的事(

常用的编排工具:

  • machine+swarm+compose (单机)
  • mesos-marathon
  • k8s(占市场80%一家独大,K8s 支持很多种容器技术)

CNCF :k8s 的组织不会被谷歌私有化

容器标准:lxc->libcontainer->runC

你可能感兴趣的:(Docker)