从 传统部署 到 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/