Docker 源码架构部署篇

一. Docker入门简介

Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并听从Apache 2.0协议。目前,Docker能够在容器内部快速自动化部署应用,并能够经过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。因为Docker经过操做系统层的虚拟化实现隔离,因此Docker容器在运行时,不须要相似虚拟机(VM)额外的操做系统开销,提升资源利用率,而且提高诸如IO等方面的性能。linux

因为众多新颖的特性以及项目自己的开放性,Docker在不到两年的时间里迅速得到诸多厂商的青睐,其中更是包括Google、Microsoft、VMware等业界行业领导者。Google在今年六月份推出了Kubernetes,提供Docker容器的调度服务,而今年8月Microsoft宣布Azure上支持Kubernetes,随后传统虚拟化巨头VMware宣布与Docker强强合做。今年9月中旬,Docker更是得到4000万美圆的C轮融资,以推进分布式应用方面的发展。git

Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。github

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。docker

下面对比了Docker 和传统虚拟化(KVM、XEN等)方式的不一样之处,容器是在操做系统层面上实现虚拟化,直接复用本地主机的操做系统,而传统方式则是在硬件的基础上,虚拟出本身的系统,再在系统上部署相关的APP应用。数据库

下图为传统虚拟化方案:centos

image.png


以下为Docker虚拟化方案:api

image.png


Docker虚拟化有三个概念须要理解,分别镜像、容器、仓库。安全

1)  镜像:docker的镜像其实就是模板,跟咱们常见的ISO镜像相似,是一个样板。服务器

2)  容器:使用镜像常见的应用或者系统,咱们称之为一个容器。网络

3)  仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式.


二. Docker虚拟化特色

跟传统VM比较具备以下优势:

1)  操做启动快

运行时的性能能够获取极大提高,管理操做(启动,中止,开始,重启等等) 都是以秒或毫秒为单位的。

2)  轻量级虚拟化

你会拥有足够的操做系统,仅需添加或减少镜像便可。在一台服务器上能够布署100~1000Containers容器。可是传统虚拟化,你虚拟10-20个虚拟机就不错了。

3)  开源免费

开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container一定能够在一个物理机上开启更多容器,注定比VMs要便宜。

4)  前景及云支持

正在愈来愈受欢迎,包括各大主流公司都在推进docker的快速发展,性能有很大的优点。


三.为何要使用Docker

1. 简化配置

这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各类配置不同的平台(软件、系统),Docker在下降额外开销的状况下提供了一样的功能。它能让你将运行环境和配置放在代码中而后部署,同一个Docker的配置能够在不一样的环境中使用,这样就下降了硬件要求和应用环境之间耦合度。


2. 代码流水线(Code Pipeline)管理

前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,须要通过不少的中间环境。而每个中间环境都有本身微小的差异,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单很多。


3. 提升开发效率

这就带来了一些额外的好处:Docker能提高开发者的开发效率。若是你想看一个详细一点的例子,能够参考Aater在 DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。


不一样的开发环境中,咱们都想把两件事作好。一是咱们想让开发环境尽可能贴近生产环境,二是咱们想快速搭建开发环境。


理想状态中,要达到第一个目标,咱们须要将每个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,咱们却不想每次都须要网络链接,每次从新编译的时候远程链接上去特别麻烦。这就是Docker作的特别好的地方,开发环境的机器一般内存比较小,以前使用虚拟的时候,咱们常常须要为开发环境的机器加内存,而如今Docker能够轻易的让几十个服务在Docker中跑起来。


4. 隔离应用

有不少种缘由会让你选择在一个机器上运行不一样的应用,好比以前提到的提升开发效率的场景等。


咱们常常须要考虑两点,一是由于要下降成本而进行服务器整合,二是将一个总体式的应用拆分红松耦合的单个服务(译者注:微服务架构)。若是你想了解为何松耦合的应用这么重要,请参考Steve Yege的 这篇论文,文中将Google和亚马逊作了比较。


5. 整合服务器

正如经过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker能够整合多个服务器以下降成本。因为没有多个操做系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker能够比虚拟机提供更好的服务器整合解决方案。


6. 调试能力

Docker提供了不少的工具,这些工具不必定只是针对容器,可是却适用于容器。它们提供了不少的功能,包括能够为容器设置检查点、设置版本和查看两个容器之间的差异,这些特性能够帮助调试Bug。你能够在 《Docker拯救世界》的文章中找到这一点的例证。


7. 多租户环境

另一个Docker有意思的使用场景是在多租户的应用中,它能够避免关键应用的重写。咱们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码很是复杂,很难处理,从新规划这样一个应用不但消耗时间,也浪费金钱。


使用Docker,能够为每个租户的应用层的多个实例建立隔离的环境,这不只简单并且成本低廉,固然这一切得益于Docker环境的启动速度和其高效的diff命令。


你能够在 这里了解关于此场景的更多信息。


8. 快速部署

在虚拟机以前,引入新的硬件资源须要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker经过为进程仅仅建立一个容器而无需启动一个操做系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。


你能够在数据中心建立销毁资源而无需担忧从新启动带来的开销。一般数据中心的资源利用率只有30%,经过使用Docker并进行有效的资源分配能够提升资源的利用率。


四.Docker 的体系结构


image.png


不难看出,用户是使用Docker Client与Docker Daemon创建通讯,并发送请求给后者。

而Docker Daemon做为Docker架构中的主体部分,首先提供Server的功能使其能够接受Docker Client的请求;然后Engine执行Docker内部的一系列工做,每一项工做都是以一个Job的形式的存在。

Job的运行过程当中,当须要容器镜像时,则从Docker Registry中下载镜像,并经过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当须要为Docker建立网络环境时,经过网络管理驱动networkdriver建立并配置Docker容器网络环境;当须要限制Docker容器运行资源或执行用户指令等操做时,则经过execdriver来完成。

而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是经过libcontainer来实现具体对容器进行的操做。

当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立而且安全的运行环境等。

5、Docker 架构内各模块的功能与实现分析

主要模块


5.1    docker client [发起请求]

  1. Docker Client是和Docker Daemon创建通讯的客户端。用户使用的可执行文件为docker(相似可执行脚本的命令),docker命令后接参数的形式来实现一个完整的请求命令(例如docker images,docker为命令不可变,images为参数可变)。

  2. Docker Client能够经过如下三种方式和Docker Daemon创建通讯:tcp://host:port,unix://path_to_socket和fd://socketfd。

  3. Docker Client发送容器管理请求后,由Docker Daemon接受并处理请求,当Docker Client接收到返回的请求相应并简单处理后,Docker Client一次完整的生命周期就结束了。[一次完整的请求:发送请求→处理请求→返回结果],与传统的C/S架构请求流程并没有不一样。

5.2    docker daemon [后台守护进程]


Docker Daemon架构图

image.png

一、Docker Server [调度分发请求]

docker Server 架构图

image.png


一、Docker Server至关于C/S架构的服务端。功能为接受并调度分发Docker Client发送的请求。接受请求后,Server经过路由与分发调度,找到相应的Handler来执行请求。

二、在Docker的启动过程当中,经过包gorilla/mux,建立了一个mux.Router,提供请求的路由功能。在Golang中,gorilla/mux是一个强大的URL路由器以及调度分发器。该mux.Router中添加了众多的路由项,每个路由项由HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler三部分组成。

三、建立完mux.Router以后,Docker将Server的监听地址以及mux.Router做为参数,建立一个httpSrv=http.Server{},最终执行httpSrv.Serve()为请求服务。

四、在Server的服务过程当中,Server在listener上接受Docker Client的访问请求,并建立一个全新的goroutine来服务该请求。在goroutine中,首先读取请求内容,而后作解析工做,接着找到相应的路由项,随后调用相应的Handler来处理该请求,最后Handler处理完请求以后回复该请求。

二、Engine

一、Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。它扮演Docker container存储仓库的角色,而且经过执行job的方式来操纵管理这些容器。

二、在Engine数据结构的设计与实现过程当中,有一个handler对象。该handler对象存储的都是关于众多特定job的handler处理访问。举例说明,Engine的handler对象中有一项为:{"create": daemon.ContainerCreate,},则说明当名为"create"的job在运行时,执行的是daemon.ContainerCreate的handler。

三、Job

一、一个Job能够认为是Docker架构中Engine内部最基本的工做执行单元。Docker能够作的每一项工做,均可以抽象为一个job。例如:在容器内部运行一个进程,这是一个job;建立一个新的容器,这是一个job。Docker Server的运行过程也是一个job,名为serveapi。

二、Job的设计者,把Job设计得与Unix进程相仿。好比说:Job有一个名称,有参数,有环境变量,有标准的输入输出,有错误处理,有返回状态等。

5.3    docker registry [镜像注册中心]

  1. Docker Registry是一个存储容器镜像的仓库(注册中心),可理解为云端镜像仓库,按repository来分类,docker pull 按照[repository]:[tag]来精肯定义一个image。

  2. 在Docker的运行过程当中,Docker Daemon会与Docker Registry通讯,并实现搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的job名称分别为"search","pull" 与 "push"。

  3. 可分为公有仓库(docker hub)和私有仓库。

5.4    Graph [docker内部数据库]

graph的架构图

image.png

其中,GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录。它仅仅实现了大多数图数据库所拥有的一个小的子集,可是提供了简单的接口表示节点之间的关系。

同时在Graph的本地目录中,关于每个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所表明的具体rootfs。

5.5    dirver 

Driver是Docker架构中的驱动模块。经过Driver驱动,Docker能够实现对Docker容器执行环境的定制。即Graph负责镜像的存储,Driver负责容器的执行。在Docker Driver的实现中,能够分为如下三类驱动:graphdriver、networkdriver和execdriver。

一、graphdriver

image.png

一、graphdriver主要用于完成容器镜像的管理,包括存储与获取。

二、存储:docker pull下载的镜像由graphdriver存储到本地的指定目录(Graph中)。

三、获取:docker run(create)用镜像来建立容器的时候由graphdriver到本地Graph中获取镜像。


二、networkdriver

image.png

networkdriver的用途是完成Docker容器网络环境的配置,其中包括

  • 一、Docker启动时为Docker环境建立网桥;

  • 二、Docker容器建立时为其建立专属虚拟网卡设备;

  • 三、Docker容器分配IP、端口并与宿主机作端口映射,设置容器防火墙策略等。


三、execdriver

image.png

一、execdriver做为Docker容器的执行驱动,负责建立容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。

二、如今execdriver默认使用native驱动,不依赖于LXC。


5.6    libcontainer [函数库]

架构图

image.png


  1. libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是但愿该库能够不依靠任何依赖,直接访问内核中与容器相关的API。

  2. Docker能够直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。

  3. libcontainer提供了一整套标准的接口来知足上层对容器管理的需求。或者说,libcontainer屏蔽了Docker上层对容器的直接管理。

5.7    docker container[服务交付的最终形式]


container架构图

image.png


  1. Docker container(Docker容器)是Docker架构中服务交付的最终体现形式。

  2. Docker按照用户的需求与指令,订制相应的Docker容器:

  • 用户经过指定容器镜像,使得Docker容器能够自定义rootfs等文件系统;

  • 用户经过指定计算资源的配额,使得Docker容器使用指定的计算资源;

  • 用户经过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境;

  • 用户经过指定运行的命令,使得Docker容器执行指定的工做。




六.Docker 安装配置


咱们这里主要讲解如何在Centos6.x系列服务器安装,默认docker只有在centos6.5以上机器才能使用yum直接安装,若是其余版本须要安装centos扩展源epel

docker官方文档说要求Linux kernel至少3.8以上,通常为centos6.5或者Ubuntu系统,那centos6.5如何来安装呢?

Centos6.x系列安装docker软件,首先要关闭selinux,而后须要安装相应的epel源,以下:

阿里源:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config

wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm 

rpm -ivh  epel-release-6-8.noarch.rpm   (安装扩展源)

image.png

yum install  lxc(容器)  libcgroupdocker组)  device-mapper-event-libsdocker的一个存储引擎)

image.png


而后安装docker

#yum install docker-io 

Cd /mnt/cdrom/Packages

Yum install device-map* –y   都是属于dockers物理存储,能够连接大数据平台

image.png

安装完后:

启动docker进程:/etc/init.d/docker start

查看docker进程:ps -ef |grep docker

image.png

Docker简单使用:

要使用docker虚拟化,首先咱们须要去下载一个镜像,而后使用docker命令启动。

image.png

相关文章
相关标签/搜索