1.虚拟化技术的概念
1)虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,让计算机的元件运行在虚拟的基础上,而不是真实的物理设备;
2)虚拟化技术可以将物理机硬件资源虚拟生成单个或多个虚拟机资源,应用软件、程序(nginx apache mysql tomcat)运行在虚拟机上的,从而可以最大化利用硬件物理机资源;
3)VMware workstation主要是用于个人工作站,基于虚拟机软件将物理机资源虚拟成N个虚拟机,应用程序运行在虚拟机中。个人使用,不作为企业使用
4)单纯的物理机设备不能直接进行虚拟化的,可以通过虚拟化软件,常用的虚拟化软件:ESXI 、HP-V、KVM、XEN、Docker、VirtualBOX、SUN等,广泛使用:ESXI、KVM、Docker,推荐使用Docker
5)完全虚拟化 实际上是通过软件实现对操作系统的资源再分配,比较成熟 如:KVM 、VirtualBOX;
6)半虚拟化技术 通过代码修改已有的系统,形成一种新的可虚拟化的系统,Xen
7)轻量级虚拟化 (介于完全虚拟化、半虚拟化之间) Docker虚拟化
2.虚拟化应用场景
1)虚拟化技术主要是用于资源的统一的分配、调度和最大化利用;
2)虚拟化技术用于解决高性能的物理硬件产能过剩和老旧的硬件产能过低的重组重用,从而最大化的利用物理硬件资源。
3)虚拟化技术最终目标,其实就是实现资源最大化的利用,方便企业高效的管理和运维。
3.Docker虚拟化入门简介
1)Docker技术类似于集装箱。Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流程的Linux机器上,也可以实现虚拟化。
2)容器是完全使用沙箱机智,相互之间不会有任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或包括系统。
3)Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上,Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简单,用户操作Docker的容器就像操作一个快速轻量级的虚拟机。
4)Docker和传统虚拟化(KVM、XEN等)方式不同之处,Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的APP应用。
下图为传统虚拟化方案——需要部署Nginx,先部署OS系统,基于OS系统再部署Nginx
如下为Docker虚拟化方案——需要部署Nginx,无需部署OS系统,基于Docker引擎直接部署Nginx;
Docker虚拟化有三个概念需要理解,分别是镜像、容器、仓库。
镜像:Docker的镜像其实就是模板,跟我们常见的IOS镜像类似,是一个模板。
容器:使用镜像常见的应用或者系统,我们称之为一个容器。
仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。
4.Docker LXC及Cgroup
从资源管理来看,Docker、LXC、Cgroup三者的关系是:Cgroup在最底层落实资源管理,LXC在cgroup上封装了一层,Docker又在LXC封装了一层
Cgroup是control groups的缩写,是linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的资源,Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有Cgroups就没有LXC,也就没有Docker。
Linux Container容器可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。
LXC建立在CGroup基础上,我们可以粗略的认为LXC = Cgroup+ namespace + Chroot + veth +用户态控制脚本。Docker容器的文件系统最早是建立在Aufs基础上的简单来说就是支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种layer的概念。Devicemapper的支持。Docker目前默认运行在Devicemapper基础上。
Aufs将挂载到同一虚拟文件系统下的多个目录分别设置成read-only,read-write以及whiteout-able权限,对read-only目录只能读,而写操作只能实施在read-write目录中
传统的Linux加载bootfs时会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write,然后我们就可以在rootfs上进行写和读的操作了。但Docker的镜像却不是这样,它在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。在加载了这么多层的rootfs之后,仍然让它看起来只像是一个文件系统,在Docker的体系里把union mount的这些read-only的rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。如图所示为一个完整的容器文件系统层级结构图:
Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,Device Mapper的内核体系架构:
在内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath 表示的就是这些 target driver。Device mapper 进一步体现了在 Linux 内核设计中策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。
Device mapper 用户空间相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等等,而具体过滤和重定向 IO 请求的工作由内核中相关代码完成。因此整个 device mapper 机制由两部分组成--内核空间的 device mapper 驱动、用户空间的device mapper 库以及它提供的 dmsetup 工具。
5.Docker虚拟化特点
跟传统VM比较具有如下有点:
操作启动快:
运行时的性能可以获取极大提升,管理操作(启动,停止,开始,重启,等等)都是以秒或毫秒为单位的。
轻量级虚拟化:
你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。但是传统虚拟化,你虚拟10-20个虚拟机就不错了。
开源免费:
开源的,免费的,低成本的。由现代Linux内核支持并驱动。注* 轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VMs要便宜。
前景及云支持:
正在越来越受欢迎,包括各大主流公司都在推动docker的快速发展,性能有很大的优势
跟传统VM比较具有如下缺点:
目前知道的人比较少;
相关的中文技术资料欠缺;
6.为什么使用Docker
Docker在如下几个方面有较大的优势:
1)更快的交付和部署
Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发,可以直接集成到可持续开发流程中。
2)高效的部署和扩容
Docker容器几乎可以在任何平台上运行,包括物理机、虚拟机、公有云、私有云等。Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便下线的你的应用和服务。
3)更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
4)更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作,所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
7Docker引擎架构
Docker引擎是一个C/S结构的,
Server是一个常驻进程;
REST API实现了client和server间的交互协议;
CLI实现了容器和镜像的管理,为用户提供统一的操作界面。
Docker使用了C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信,架构如图所示:
8.Docker镜像原理
一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。
Docker镜像作为Docker中最基本的概念,有以下几个特性:
1)镜像分层,每个镜像都由一个或者多个镜像层组成;
2)可通过在某个镜像加上一定的镜像层得到新镜像(此过程可通过编写dockerfile或基于容器Commit实现)
3)每个镜像层拥有唯一镜像ID
4)镜像在存储和使用时共享相同的镜像层(根据ID),所以在pull镜像时,已有的镜像层会自动跳过下载;
5)每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层;
Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。
基于每个镜像的json文件,Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。
9.Docker安装配置
docker官方文档说要求Linux kernel至少3.8以上,一般为centos6.5
首先要关闭selinux,然后安装相应的epel源
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 yum install lxc libcgroup device-mapper-event-libs #yum install docker-io #yum install device-mapper* -y 安装完后: 启动docker进程:/etc/init.d/docker start 查看docker进程:ps -ef |grep docker
10.Docker仓库源更新
Docker镜像修改方法,vim /etc/docker/daemon.json,修改成国内的
cat>/etc/docker/daemon.json<<EOF { "registry-mirrors":["https://registry.docker-cn.com"] } EOF service docker restart)
docker -itd
-itd(-i interactive -t tty -d daemon)
docker ps 查看运行内容
docker ps -a 查看所有的运行内容