华子目录
- docker简介
- 虚拟化技术
- 硬件级虚拟化
- 硬件级虚拟化历史
- 操作系统虚拟化历史
- 基于服务的云计算模式
- 什么是docker
- Docker和传统虚拟化方式的不同之处
- 为什么要使用docker?
- Docker 在如下几个方面具有较大的优势
- 对比传统虚拟机总结
- docker应用场景
- docker改变了什么
- 基本概念
- docker镜像
- docker容器
- 注意
- docker仓库
docker简介
- 随着生产力得发展尤其是弹性架构得广泛应用(如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google,微软,亚马逊,腾讯,阿里,京东和新浪。
虚拟化技术
虚拟化一般分为硬件级虚拟化和操作系统级虚拟化。
硬件级虚拟化
- 硬件级虚拟化是运行在硬件之上的虚拟化技术,它得管理软件也就是我们通常说的 hypervisor 或者 virtual machine monitor,它需要模拟的就是一个完整的操作系统,也就是我们通常所说的基于 Hyper-V 的虚拟化技术。VMWare,Xen,VirtualBox,亚马逊和阿里云都是用的这种技术。
- 操作系统级虚拟化是运行在操作系统之上的,它模拟的是运行在操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,也称为容器化技术。docker正是容器虚拟化中目前最流行的一种实现
硬件级虚拟化历史
-
19 世纪 60 年代:美国出现了第一个虚拟化系统,它是由 IBM 开发的 CP-40Mainframes 系统, 虽然这个系统只是在实验室使用,但却为后来的 CP-67 系统奠定了基础。在那个时代,虚拟化系统主要由通用,贝尔实验室和 IBM 主导研发。
-
1987 年:一个非常牛逼的公司 InsigniaSolutions 演示了一个称为 SoftPC 的软件模拟器,这 个模拟器允许用户在 UnixWorkstations 上运行 DOS 应用。在此之前这是不可能办到的,当 时一个可以运行MSDOS 的个人电脑需要 1,500 美金,而通过 SoftPC 模拟之后,可降低到 500 美金。可以看出,当时
的需求就是在大型工作站上运行微软的 DOS。到了 1989 年的时 候,InsigniaSolutions 发布了 Mac 版的 SoftPC,使苹果用户不仅能运行 DOS,还能运行 Windows 操作系统。 -
1997 年:随着 SoftPC 的一炮而红,其他虚拟化公司如雨后春笋般的出现了。在 1997 年,苹果开发了virtualPC,后来又卖给了 Connectix。
-
1998 年:真正的王者 VMWare 出现了,他们在 1999 年开始销售 VMWare workstation,也就是我们很多人使用过得桌面版的虚拟机。
-
2001 年:VMWare 又发行了 ESX 和 GSX,也就是我们现在经常使用的 ESX-i 的前身。
-
2003 年:之前所说的 Connectix 被微软收购,后续推出了 Microsoft VirualPC,再之后就没什么音讯了。同年 VMWare 也被 EMC 收购,成为 EMC 迄今最成功的一笔收购。就在这一年,一个开源的虚拟化项目 Xen 启动了,并在 2007 年被 Citrix 收购。
操作系统虚拟化历史
- 1982 年:你一定会很惊讶,第一个操作系统级的虚拟化技术是什么。答案就是 chroot,直到现在我们依然在使用的一个系统调用。这个系统调用会改变运行进程的工作目录,并且只能 在这个目录里面工作。这种操作其实就是一种文件系统层的隔离。
- 2000 年:FreeBSD jail,真正意义上的第一个功能完整的操作系统级虚拟化技术。所以,真正的容器化技术出现到现在已经过去了 16 年,并不是几年的时间。
- 2005 年:OpenVZ,这是 linux 平台上的容器化技术实现,同时也是 LXC,即 docker 最初使 用的容器技术核心实现。
- 2008 年:LXC 发布,这是 docker 最初使用的具体内核功能实现。
- 2013 年:Docker 发布,可以看出,docker 本身是使用了 LXC,同时封装了其他的一些功能。
Docker 的成功,与其说是技术的创新,还不如说是一次组合式的创新。
基于服务的云计算模式
我们知道传统的服务器或者电脑主机,基本都是一锤子买卖,商家卖给你之后基本就很难再从消费者身上获得其他收入。随着云的概念出现,越来越多的厂商都意识到卖硬件是不可能获得长期利益的,只有服务才是可持续的赢利点。因此,在2010年左右,出现了以大批提供云服务的公司。总体来说基本都可以归为下面几大类的一种或多种
- 基础设施即服务(Infrastructure as a service),通常指的是在云端为用户提供基础设施,如:虚拟机、服务器、存储、负载均衡、网络等等。亚马逊的 AWS 就是这个领域的佼佼者,国内则 以阿里云为首
- 平台即服务(Platform as a service),通常指的是在云端为用户提供可执行环境、数据库、网站服务器、开发工具等等。国外的 OpenShift,RedHat,ClouderaCloudFoundry,GoogleAppEngine 都是这个领域的,当然还有一个非常有名的公司,那就是 dotCloud,后续会再介绍一下这个公 司。
- 软件即服务(Software as a service),通常指的是在云端为用户提供软件,如 CRM 系统,邮件系统,在线协作,在线办公等等。比如微软就把自己的 Office 搬到了云端,国内的有道、麦 客、Tower 都是属于这个领域的。
一般认为这三种模式,是最基本的云服务模式,其分层结构如下图:
什么是docker
- Docker 是一个开源项目, 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议, 项目代码在 GitHub 上进行维护。
- Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。
- Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux容 ( LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装, 让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker 的容器就像操作一个快速轻量级的虚拟机一 样简单。
- Docker 是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在本地编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、baremetal、OpenStack 集群和其他的基础应用平台。
- 简单的理解,Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱和集装箱之间没有影响。也就是说,Docker平台就是一个软件集装箱化平台,这就意味着我们自己可以构建应用程序,将其依赖关系一起打包到一个容器中,然后这个容器就很容易运送到其他的机器上进行运行,而且非常易于装载、复制、移除,非常适合软件弹性架构。
- 总而言之,Docker 是一个开放平台,使开发人员和管理员可以在称为容器的松散隔离的环境中构建镜像、交付和运行分布式应用程序。以便在开发、QA 和生产环境之间进行高效的应用程序生命周期管理。
Docker和传统虚拟化方式的不同之处
为什么要使用docker?
- 作为一种新兴的虚拟化方式, Docker跟传统的虚拟化方式相比具有众多的优势。首先, Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次, Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
- 传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。
Docker 在如下几个方面具有较大的优势
-
更快速的交付和部署
- 对开发和运维( devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后, 运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程。可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker容器很轻很快!容器的启动时间是秒级的,大量地节约开发、 测试、部署的时间
-
更高效的虚拟化
- Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
-
更轻松的迁移和扩展
- Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
-
更简单的管理
- 使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般是MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
docker应用场景
-
简化配置
- 虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额
外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的
配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
- 虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额
-
代码流水线(Code Pipeline)管理:
- 前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
-
提高开发效率
- 不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
- 使用Docker非常简单的就能够实现这两点,而且哪怕是开发环境的机器配置一般的情况下搭建多个生成服务应用。一台一般配置服务器或开发机也能轻松的跑起多个Docker应用,而无需额外增加机器配置。因为Docker有个非常NB的特性,拥有虚拟化的特性,而几乎没有额外的开销。
-
隔离应用
- 很多情况下,我们需要在一台服务器上运行多个不同的应用,比如上面提到的提高开发效率的场景等。
- 我们经常需要考虑三点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(比如微服务架构),三是还需要考虑应用之间的兼容性。而对于Docker来说,支持起来就非常简单了。同一台机器,我可以同时运行N个Docker web应用,托管到不同的Web服务器(Kestrel、Ngnix、Tomcat),而无需担心他们会搞起3Q大战,也无需担心我的开发机器会跑不起来
-
整合服务器
- 正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
- 这就意味着资源得到更有效的利用——可以做更多衣服,而且还没有边角料,成本还更低。
-
调试能力
- Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。
-
多租户环境
- 在多租户的应用中,它可以避免关键应用的重写。比如IoT(物联网)的应用中,开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
- 使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
- 就如同我们现在写了一个不支持多租户的业务程序,而实际的业务中经常会出现需要支持多租户或者有新客户需要使用的场景,这是我们通常的简单做法是——部署一套新的代码。当站点达到一定量的适合,要么重写程序,要么维护人员Game over。
-
快速部署
- 在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。
- 你可以在服务器中或云端创建销毁资源而无需担心重新启动带来的开销。通常情况下,服务器的资源利用率只有30%,而通过使用Docker并进行有效的资源分配可以提高资源的利用率。
-
Docker 实现了微服务架构,也让遗留的单体应用转变为现代应用
docker改变了什么
- Docker改变了云服务,使云服务的共融共通的理想逐步成为了可能。并且Docker 已经是云策略的一部分,许多开发者正在计划使用 Docker 将业务迁移到云端。另外,为了避免被云服务供应商绑定,Docker成为很多开发者的首选。
- Docker改变了产品交付,为产品的整个生命周期提供了一整套的解决方案和流程。
- Docker改变了开发方式,提供了简化的环境配置、封装的运行环境以及统一的环境。并且提供了快速部署的方式。
- Docker改变了测试,多版本测试变得极为方便,快速构建测试环境也变得更加简单并且无需开发人员干预或者搭建。
- Docker改变了运维,环境的一致性让运维变得更加简单,同时热更新的支持让运维不再需要半夜加班部署更新,更新可以随时进行。当出现重大问题时,还能快速回滚到指定版本。
- Docker改变了架构,自动化扩容支持让架构变得更加简单,分布式系统也更加易于搭建和支持。同时遗留的单体应用也很易于转变为现代应用。
总之,在某种程度上,Docker改变了产品开发中的一些游戏规则。虽然Docker是一项技术,但是它也带来了新的思维,新的流程和工作方法,Docker在推动行业的发展,Docker已经在改变世界,并且在逐步的变为事实……
基本概念
docker包括三个基本概念
- 镜像(image)
- 容器(container)
- 仓库(repository)
docker镜像
镜像:一个特殊的文件系统,docker镜像就是一个只读的模板
- 操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
- Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
- 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。
- 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
- 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。 在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
- 因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
- 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
docker容器
容器:镜像运行时的实体,docker利用容器来运行应用。
- 镜 像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
- 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
- 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
- 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。
- 所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
- 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。
注意
容器在整个应用程序生命周期工作流中提供以下优点:隔离性、可移植性、灵活性、可伸缩性和可控性。 最重要的优点是可在开发和运营之间提供隔离
docker仓库
仓库:集中存放镜像文件的地方
- 镜像构建完成后,可以很容易的在当前宿主上运行,但是如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
- 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
- 所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库
- 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
- 我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest 作为默认标签。
- 仓库名:仓库名可以是两段式名称,即<用户名>/<软件名>
-
常见的仓库名格式有以下几种:
-
仓库名:例如ubuntu、nginx。
-
域名/仓库名:例如
registry.example.com/nginx
-
域名:端口/仓库名:例如
docker.example.com:5000/nginx
-
- 仓库分为公开仓库( Public)和私有仓库( Private) 两种形式
- 这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:
- Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。
- 一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
- 最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为https://hub.docker.com/
- 在国内访问 Docker Hub 可能会比较慢,国内也有一些云服务商(如腾讯云,阿里云等)提供类似于 Docker Hub 的公开服务, 可以提供稳定的国内访问。
- 除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
- 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上 pull下来就可以了。
- 可以看出, Docker 利用仓库管理镜像的设计理念与 Git 代码仓库的概念非常相似,实际上 Docker 设计上借鉴了 Git 的很多优秀思想