Docker原理:我不是虚拟机,我是资源限制和NS隔离

从 传统部署 到 Docker容器部署。html

 

Docker的原理

LXC,Linux原生支持的容器,追溯到2009年,源于 cgroup(资源限制) 和 namespaces(NS隔离)在Linux内核方面的发展。node

Linux Container容器是一种内核虚拟化技术,能够提供轻量级的虚拟化,以便隔离进程和资源。linux

 

2013年,Docker横空出世,Docker是啥呢? 就是一个基于LXC 的高级容器引擎。git

靖爷强调:Docker并非一项新技术,它是多项旧技术组合的能力。github

namespaces 隔离

  • UTS (uname)

主要是用来进行hostname的资源隔离,在不一样的UTS 的namespace 里面hostname 能够名字同样,相互之间透明、不冲突;web

 

  • PID(进程pid)

主要是用来进行进程资源的隔离,在不一样的PID的namespace 里面pid 相同的2个进程能够存在,并且相互之间透明、不冲突docker

 

  • IPC(inter-process-connection 进程之间通讯)

主要是用来进行进程直接通讯的隔离的,这个主要的做用是?(如今还不肯定:本身理解是隔离进程直接通讯,二用容器或者pod 来通讯)ubuntu

 

  • NS(mnt) 文件系统隔离

容器在chroot 以后限制了进程只能读写指定的目录,NS的namespace 则是文件的挂载和卸载只跟namespace 有关系,跟其余的namespace 是透明的。网络

 

  • NET 网络隔离

借助namespace 能够进行网络接口的隔离,达到一个容器单独一个“网卡”的效果;不一样的namespace 的网卡的带宽相互不影响架构

 

  •     用户权限(额外)

住宿机 Docker用户 映射 Docker容器中的Root用户。

目前须要较新的ubuntu版本支持。

 

举例:

在宿主机中运行的C进程,经过visual studio远程编译到Linux上

使用namespace进行隔离,试演示主机名UTS、进程号PID等的隔离状况

 

 

Dockerfile

NS(mnt) 文件系统隔离,将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这相似linux系统下mount的机制。

 

Dockerfile分层文件系统

经过Dockerfile模拟制做出一个镜像。

镜像:

cms['./run.sh']

volume /data

add run.sh

from ubumtu:14.04

注:原理相似git的模式,均有一个提交id,分层次拉取有 变化 的镜像内部文件。

 

举例:

容器和宿主机中的 ps 与 top查看, 经过mount隔离 /proc 文件来实现。

 

Docker的四种网络模式

  • Host模式

这个容器将不会得到一个独立的Network Namespace,而是和宿主机共用一个Network Namespace

 

  • Container模式

这个模式指定新建立的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的 IP,而是和一个指定的容器共享 IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过 lo 网卡设备通讯。

 

  • None模式

使用none模式,Docker容器拥有本身的Network Namespace,可是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。须要咱们本身为Docker容器添加网卡、配置IP等。

 

  • Bridge模式

当Docker进程启动时,会在主机上建立一个名为docker0的虚拟网桥,此主机上启动的Docker容器会链接到这个虚拟网桥上。虚拟网桥的工做方式和物理 交换机 相似,这样主机上的全部容器就经过交换机连在了一个二层网络中。(vethpair虚拟网卡)

 

CGroup 资源限制

Cgroups是control groups的缩写,是Linux内核提供的一种能够限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU, Memory, IO等)的机制。

 

 

K8S(Kubernetes)原理

Google开源的容器集群管理系统

架构图解析

master APIs

node 节点(马仔机)

scheduler 调度器,调度每一个马仔机的kubectl

 

K8S的网络

Flanrel

flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。缺点是发包没法跨路由器。

Calice

一个纯三层的协议,为OpenStack和Docker容器提供多主机间通讯。Calico不使用重叠网络,使用虚拟路由代替虚拟交换,每一台虚拟路由经过BGP协议传播可达信息(路由)到剩余数据中心。

 

 

参考资料

炒个冷饭LXC,试问Docker你凭啥这么火?

http://www.techweb.com.cn/network/virtual/2016-03-01/2287475.shtml

在kubernetes中实现蓝绿发布

http://shareinto.github.io/2017/04/24/%E5%9F%BA%E4%BA%8Ekubernetes%E7%9A%84canary-deployment/

相关文章
相关标签/搜索