Docker学习

Docker简介

2018-06-29  本文已影响18人  廖马儿

简介

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal, OpenStack 集群和其他的基础应用平台。

如果会用Python的virtualenv,那么就容易理解Docker。

Docker初始目的不是虚拟化,但是可以作为虚拟化技术。

virtualenv只是针对python的隔离工具,是借助语言层面的虚拟机来实现的,不具有通用性。Docker是更底层的虚拟化技术,它是进程级的,也就是说不管什么语言编写的程序都会得到相应的服务,主要依赖于内核的CGroup, Namespace, UnionFS。

Docker的图标是搬运箱,我们想象下,许多工人在搬运货物,集装箱出现后,码头上看到更多的不是工人,而是集装箱。集装箱的搬运模式更加单一,更加高效,还有其他的好处。
货物多打包在集装箱里面,可以防止货物之间相互影响。并且到了另外的一个码头需要运转的话,有了集装箱后,直接把它送到另外一个容器内即可,完全可以保证里面的货物是整体的搬迁,并且不会损坏货物本身。

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app)。几乎没有性能开销,可以容易地在机器和书记中心运行。最重要的是,他们不依赖于任何语言,框架或者包括系统。
Docker是最近几年最火爆的技术之一。
Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来改名为Docker Inc。Redhat已经在其RHEL6.5中集中支持Docker:Google也在其PaaS产品中广泛应用。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更加简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker使用场景

1.web应用的自动化打包和发布
2.自动化测试和持续集成、发布
3.在服务型环境中部署和调整数据库或其他的后台应用
4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

知乎上面Docker的使用场景解析

通俗地理解Docker: https://www.zhihu.com/question/28300645

eg.
1)公司开发人员,开发web系统,web系统部署到Linux服务器,如果部署时间1-2天,调试完毕,web系统对外发布;
2)需要把web系统/APP应用各种代码,软件,依赖环境,部署线上Linux服务器,Docker技术,将web系统打包(重点是把环境)为镜像,类似iso镜像文件,移植到其他Linux系统;

虚拟化

1.虚拟化概念:
通俗地说,虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,计算元件运行在虚拟的基础上而不是真实的基础上,可以扩大硬件的容量,简化软件的重新配置过程。
允许一个平台上面同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行,而不相互影响,从而显著提高计算机的工作效率,是一个为了简化管理,优化资源的解决方案。(一变多,硬件利用效率提高)
目前主流的虚拟化技术有:KVM,Xen,VMWare Esxi, VirtualBox,Docker,虚拟化技术也越来越广泛地应用在企业中,例如 Taobao,Google等。

一个硬件设备平台,基于平台划分更多的虚拟资源,单台物理机虚拟更多的虚拟机。
虚拟化技术计算元件,资源申请调度到其他硬件服务器;

腾讯云,阿里云的虚拟化,客户提交CPU,内存,硬盘,网卡,带宽需求,提交到后端硬件服务器,通过计算元件实现资源调度。
比如:如果不用调度方式去调度,64C的cpu只能虚拟出16个4C的cpu。使用了调度方式,就可以实现更多个的4C,实现资源分配;

2.虚拟化原理

虚拟化解决方案的底层是要进行虚拟化的物理机器,这台机器可能直接支持虚拟胡啊,也可能不会直接支持虚拟化;那么就需要系统管理程序层的支持。系统管理程序(Virtual machine monitor),或者称为VMM,可以看做是平台硬件和操作系统的抽象画。在某些情况中,这个系统管理程序就是一个操作系统;此时,它就称为主机操作系统

3.虚拟化分层抽象:

图片.png

1)完全虚拟化技术:实际上是通过软件实现对操作系统的资源再分配,比较成熟,例如我们的KVM,VirtualBox等。

2)半虚拟化技术:则是通过代码修改已有的系统,形成一种新的可虚拟化的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,整体速度上相对高一点,代表产品有Xen。

3)Docker虚拟化(介于完全虚拟化,半虚拟化之间),轻量级虚拟化。

Docker LXC & Cgroup

Docker最早为LXC+AUFS组合,Docker0.9.0版本开始引入libcontainer,可以作为LXC的替代品。其中LXC负责资源管理。

AUFS负责镜像管理,而LXC包括cgroup,namespace,chroot等组件,并通过cgroup进行资源管理。

从资源管理看,Docker, LXC, Cgroup三者的关系是:Cgroup在最底层落实资源管理,LXC在cgroup上封装一层,Docker又在LXC封装了一层,要想学好Docker,需要了解负责资源管理的CGroup和LXC。

Docker和LXC, cgroup, AUFS,chroot等之间的关系:

图片.png

所以,Docker不是一个新的革命性的技术,而是基于Linux的 LXC的基础上进行发展的。LXC技术作用是进行资源隔离。
linux本身每个进程使用的资源都是相互隔离的,比如内存等,那么为何还需要Docker呢,因为可以更加进一步地去实现管理。

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

最初由Google的工程师提出,后来被整合进Linux内核。Cgroups也是LXCWie实现虚拟化所使用的资源管理手段,可以说没有Cgroups就没有LXC,就没有Docker。
Cgroups最初的目的是为资源管理提供的一个统一的框架,既整合现有的Cpuset等子系统,也为未来开发新的子系统提供接口。现在的Cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化(OS Level Virtualization)。

Linux Containers容器(LXC)可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解析机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

LXC建立在CGroup基础上,我们可以粗略的认为LXC = Cgroup + namespace + Chroot + veth + 用户态控制脚本。LXC利用内核的新特性(CGroup)来提供用户空间的对象,用来保证资源的隔离和对于应用或者系统的资源控制。

典型的Linux文件系统由bootfs和rootfs两部分组成,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,当kernel被加载到内存中后bootfs就被umount,rootfs(root file system)包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等目录和文件。

图片.png

Docker容器的文件系统最早就是建立在Aufs基础上的,Aufs(Another Union FIle System)是一种Union FS,简单来说就是支持将不同的目录挂载到统一个虚拟文件系统下,并实现一种layer的概念。

由于Aufs未能加入到Linux内核,考虑到兼容性问题,加入了Devicemapper的支持。Docker目前默认运行在Devicemapper基础上。

Aufs将挂载到统一虚拟文件系统下的多个目录分别设置成read-only,read-write,以及whiteout-able权限,对read-only目录只能读,而写操作只能实施在read-write目录中。重点在于... (很多,教程中没讲下去了)

Docker虚拟化技术实现基础

镜像:模板,类似常见的ISO镜像,Docker虚拟化基于系统、程序,静态的,不能修改,iso文件不能直接修改;
容器:称为Docker虚拟机,基于镜像运行的实体。使用镜像常见的应用或者系统,我们称为容器;
仓库:仓库是用于存放镜像的地方,分为:公共仓库、私有仓库;

VM 和 Docker的区别

VM虚拟化方案:


图片.png

Docker的虚拟化方案:


图片.png

Docker虚拟化有三个概念需要理解,分别是:镜像,容器,仓库。在上面有讲解。

分析上面的两张图的不同:

1.Docker不会在做一个Guest OS。
2.注意上面的Docker虚拟化技术图中黄色是一个Docker容器(可包含库和app)。

所以Docker虚拟化技术与传统虚拟化技术是不一样的。

上一篇下一篇

猜你喜欢

热点阅读