标签:docker
Docker:轻量级的虚拟化技术。和KVM、XEN这些完全虚拟化相比起来,Docker是一个系统级的虚拟化。
从2013年的3月份开始发布。
图1:
在某些公司中,存在这样的问题,例如:开发机、测试环境、生产环境可能各种依赖关系、包括内核版本不一样,导致很多程序代码不兼容。
图2:
各种运输工具 + 各种被运输的东西 ====> 产生非常恐怖的效应
Container:容器、集装箱。
后来发明了集装箱,把同一类的货物都放在集装箱里面,集装箱是封闭的,互相之间没有什么影响。所以集装箱很好的解决了将工具和东西混合在一起产生恐怖的效应这种现象。
互联网也可以搞一个集装箱,把代码和所需要依赖的环境打包整合到一个集装箱里面。这样可能一个服务就是一个集装箱,然后一个系统上面可以跑很多或者若干个集装箱,他们之间都是隔离的,互不影响,甚至可以把他们堆叠起来。
容器概念解释:
容器是linux内核2.6.32版本之后,linux自己内核的一个机制(不是Docker的技术,是linux自己的技术),LXC即是linux软件容器(Linux Container)的缩写。还有其他应用容器的技术,Docker只是其中之一。
补充:有关LXC的介绍,请移步:
我
们运行Docker的时候,就一个Docker进程。但这一个进程里面可能跑了一个nginx容器,一个Mysql容器,还可能跑了LVS等若干个容器。
每个容器都是互不影响的,都有自己独立的一块空间(就好比宿舍和宿舍之间是相互隔离的,里面都住的是人,但是各住各的,互不影响。每个宿舍都有独立的电
表、水表、宽带账号)。容器隔离即是如此,在容器内部自己有一个网络,和宿主机Centos的网络是互不影响的。
Developers Care:开发比较关心的是他开发出来的东西,可以在任意的环境下都可以运行,有一个干净、安全、可以的一个运行环境。如果用了Docker:开发不用去担心一些兼容性的问题,因为把这一切都打包好,在任何环境下都可以运行;部署的时候也不需要运维因为开发有了一个新的功能,而让运维去新配置一些东西。每一个应用都是在一个隔离的容器里面,容器和容器之间就和集装箱一样是互不影响的。比如1.6版本的nginx 和1.8版本的nginx在同一台机子上跑,是没有任何问题的。比如在同一个Centos上可以运行多个版本的Mysql,比如5.1、5.5、5.6.
Administrators Care:运维关心的是:
1,配置一次(比如nginx配置文件),以后上新机器就不用再配置了。现在其实也可以实现:比如新上的服务器加到现有的集群中,然后使用批量分发的工具,将配置发过去.......但是和Docker相比起来,这种方式还是不如Docker高效。
2,整个产品的生命周期(开发环境-->测试环境-->真实线上环境)是一致的(取消不一致性),可重复的。
The Developer worries about what‘s "inside" the container:
His code
His Libraries
His Package Manager
His App
His Data
All Linux servers look the same
Ops worries about what‘s "outside" the container:
Logging 日志
Remote access 远程访问
Monitoring 监控
Network config 网络管理
All containers start,stop,copy,attach,migrate,etc,the same way
用Docker提供了一种标准的管理方式(而之前用pupet、salt这样的批量分发管理工具的用法都不一样),但是用Docker,只要在任何环境上部署好了,它的使用方法都是完全一样的。
More Technical Details
Run everywhere
不考虑内核版本(其实还是有要求的:3.2以上)
不考虑发型版本(Centos、Unbunto、Suse)
Run anything
可以在linux上运行的东西,都可以在Docker上运行
例如:
简单的:一个1M左右的容器运行一个hello world,这也是一个容器。
复杂的:把Centos这个系统全部打包(包括安装选包时候的兼容库全部装上,各种服务全部配好),这也是一个容器,这个就会有好几个G。
High level:a lightweight VM
Own process space 拥有自己的进程空间
Own network interface 拥有自己的网络接口
Can run stuff as root (容器之间、容器和宿主机之间)权限也是隔离的
Can have it‘s own /sbin/init(different from host) 拥有自己的init进程
<<machine container>>
Low level:chroot on steroids
Can also not have it‘s /sbin/init
Container = isolated processes
Share kernel with host 内核是和宿主机共享的
<<application container>>
VM模型(完全虚拟化,比如:Vmware):
App --- 各种应用,如nginx,Mysql等
Bins/Libs --- 系统里的bin目录和二进制库
Guest OS ---上面装的3个虚拟机,虚拟机上的独立的系统
Hypervisor ---虚拟化核心的一个技术
Host OS ---windows
server ---笔记本
Container模型
Bins/Libs 和Bins/Libs ---这些二进制文件和库都是共享的
Docker --- 这是一个容器,就是一个Docker技术,有一个Docker引擎(通过Docker引擎来调用系统内核容器的这个机制,然后划分成若干个容器,跑不同服务)
Host OS --- linux:Centos (如果是windows,其实也是下载一个有linux内核的小东西)
server --- 容器底层都是一样的,比如我们都需要一个笔记本电脑(生产环境中就是服务器)
单词:
steroids:固醇
isolated:隔离的、孤独的
左边VMs模型代表的是KVM,右边Containers模型代表的是Docker。
对应VMs来说,占用资源最大的是Guest OS(即虚拟机中的系统),当然现在硬盘容量大,硬盘来说不是什么问题,但是对于宿主机的开销还是比较大的。然后虚拟机的系统之上跑应用跑服务,这样的性能和直接在物理机上跑还是有大概20-30%的折扣。
弊端:
1,性能开销大,在作者的笔记本上虚拟机开最多15-20个,然后内存、CPU、硬盘(SSD)就开始吃紧,但是如果跑Docker容器50-60是没有问题的。
对于Containers来说,和VMs相比,最下面的Guest OS即系统开销最大的这块没有了,
所有应用最底层用的是宿主机的kernel,所有应用最底层的文件系统如:aufs(联合文件系统)、btrfs也都用的是系统的(像是垒箱子一样),对于rootfs解释,在系统之上,每一个小盒子就是一个系统镜像
有一个轻量级的镜像,在这个镜像之上...
文档:深入浅出Docker(一):Docker核心技术预览
标签:docker
原文地址:http://tenderrain.blog.51cto.com/9202912/1650763