Docker
什么是docker
将应用程序自动部署到容器的技术
什么是容器
一种虚拟化的方案
与虚拟机不同,虚拟机是通过中间层将一台或多台虚拟系统独立运行在硬件之上,而容器是运行在操作系统的内核之上的,可以称为操作系统虚拟
化
只能运行相同或相似的内核操作系统
依赖于linux内核特性:Namespace和Cgroups,所以docker上只能运行linux操作系统
优点:
快
运行时的性能可以获取极大提升(经典的案例是提升97%)
管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。
敏捷
像虚拟机一样敏捷,而且会更便宜,在bare metal(裸机)上布署像点个按钮一样简单。
灵活
将应用和系统“容器化”,不添加额外的操作系统,
轻量
你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。
便宜
开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VMs要
便宜。
生态系统
正在越来越受欢迎,只需要看一看Google的趋势就知道了, docker or LXC.
还有不计其数的社区和第三方应用。
云支持
不计其数的云服务提供创建和管理Linux容器框架。
有关Docker性能方面的优势,还可参考此IBM工程师对性能提升的评测,从各个方面比VMs(OS系统级别虚拟化)都有非常大的提升。
有争论的地方:
能否彻底隔离
在超复杂的业务系统中,单OS到底能不能实现彻底隔离,一个程序的崩溃/内存溢出/高CPU占用到底 会不会影响到其他容器或者整个系
统?很多人对Docker能否在实际的多主机的生产环境中支持关键任务系统还有所怀疑。 注* 就像有人质疑Node.JS单线程快而不稳,无法在复
1/24
杂场景中应用一样。
不过可喜的是,目前Linux内核已经针对Container做了很多改进,以支持更好的隔离。
GO语言还没有完全成熟
Docker由Go语言开发,但GO语言对大多数开发者来说比较陌生,而且还在不断改进,距离成熟还有一段时间。此半git、半包管理的方式
让一些人产生不适。
被私有公司控制
Docker是一家叫Dotcloud的私有公司设计的,公司都是以营利为目的,比如你没有办法使用源代码编绎Docker项目,只能使用黑匣子编
出的 Docker二进制发行包,未来可能不是完全免费的。 目前Docker已经推出面向公司的企业级服务(咨询、支持和培训)。
Doker目标:
1.提供简单轻量的建模方式(同一台宿主机可以运行多个容器)
2.职责的逻辑分离
加强开发人员的开发环境与生产部署的环境的一致性
3.快速高效的开发的生命周期
缩短从开发到生产的周期,使开发,测试,生产环境相一致,并且都以容器的方式进行交付,避免了额外调试部署的时间开销
4.鼓励使用面向服务的架构
鼓励单个容器之运行单一服务,这就形成了一种分布式模型,避免服务之间的互相应影响,在定位出现的问题时,也变得简单直接
docker的使用场景:
1.使用docker容器开发,测试,部署服务.
2.创建隔离的运行环境.
3.搭建测试环境
4.构建多用户的平台即服务(PaaS)基础设施
5.提供软件机服务(SaaS)应用程序
6.高性能,超大规模的宿主机部署
docker基本组成
Docker Client客户端
Docker Daemon 守护进程
Docker Image 镜像
容器的基石,保存了启动容器的各种条件
层叠的只读文件系统
联合加载(union mount)
镜像其实就是多个层来组成的,引导层,文件系统层,软件层,这些都是属于只读文件系统,也就是说多个文件系统共同组成,镜像也能相互叠加在
一起.有子镜像和父镜像
Docker Container 容器
通过镜像启动
可以通过一个镜像运行一个或者多个容器
启动和执行阶段
可写层-----------容器层
add Apache
add emacs
rootfs
bootfs 引导
add Apache
add emacs
rootfs
bootfs 引导
采用copy on write
Docker Registry 仓库
公有 Docker Hub https://hub.docker.com/
私有
Docker依赖的linux内核特性
Namespaces 命名空间
Control groups(cgroups) 控制组
Namespaces
编程语言
操作系统
封装 代码隔离
进程资源的隔离
进程,网络,文件系统....
2/24
PID 进程隔离
NET 管理网络接口
IPC 管理跨进程通信的访问
MNT 管理挂载点
UTS (Unix Timesharing System)隔离内核和版本标示
Control groups控制组来完成命名空间的隔离
用来分配资源
来源于google
linux kernel-2.6.24内核版本以后
可以说没有cgroups就没有容器技术的今天
Control groups控制组
资源限制(如限制mem,超出oom)
优先级设定(设定那个进程组使用更多资源)
资源计量(计算进程组使用了多少资源,尤其是在计费系统中)
资源控制(将进程组挂起,恢复)
Docker容器的能力
文件系统隔离:每个容器有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgroups将cpu和内存之类的资源独立分配给每个Docker
容器
Docker介绍
什么是Docker?
3/24
PaaS Platform as a Service
为开发者搭建开发环境,例如 Java环境、Python环境、Ruby环境、数据库、中间件等。
Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将App变成一种标准化的、可移植的、自管
理的组件,并脱离服务器硬
件在任何主流系统中开发、调试和运行。简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,
并通过配置文件可以轻松实现应
用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开发环境分开,互不影响。
4/24
Docker的核心技术
Docker相关的核心技术之cgroups
Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。于是就出现了cgroups的概念,cgroup就是controller group ,在这
个group中,有分配好
的特定比例的cpu时间,IO时间,可用内存大小等。 cgroups是将任意进程进行分组化管理的Linux内核功能。最初由google的工程师提出,后
来被整合进Linux内核中。
cgroups中的 重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的。首先挂载
子系统,然后才有control
group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制
的属性写入,这就完成了
内存的资源限制。cgroups 被Linux内核支持,有得天独厚的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。cgroup默
认有诸多资源组,可以限制
几乎所有服务器上的资源:cpu mem iops,iobandwide,net,device acess等
Docker相关的核心技术之LXC
LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgroup限额功能,LXC提供了
一套统一的API和工具来
建立和管理container。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁
5/24
LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host共享,因此可以大大加快
container的 启动过程,并显著
减少内存消耗,容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。 在实际测试中,基
于LXC的虚拟化方法的IO和CPU
性能几乎接近 baremetal 的性能。 虽然容器所使用的这种类型的隔离总的来说非常强大,然而是不是像运行在hypervisor上的虚拟机那么强壮
仍具有争议性。如果内核停
止,那么所有的容器就会停止运行。
• 性能方面: LXC>>KVM
• 内存利用率: LXC>>KVM
• 隔离程度: KVM>>LXC
Docker相关的核心技术之AUFS photoshop 图层,qcow2后端镜像
什么是AUFS? AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一个虚拟文件系统下,可以把不同的
目录联合在一起,组成一个单
一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。
Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统
的单层表示。这个过程称为
写入复制( copy on write )。AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS系
统镜像。多亏AuFS,只要一
个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。使用AuFS的另一个好处是Docker的版本容器镜像能力。
每个新版本都是一个与之前版
本的简单差异改动,有效地保持镜像文件最小化。但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本改动的审计跟踪。
典型的启动Linux运行需要两个FS: bootfs + rootfs:
6/24
7/24
8/24