一、什么是Docker
Docker 是基于Go 语言实现的开源容器项目,诞生于2013 年年初,最初发起者是 dotCloud 公司。Docker 自开源后受到广泛的关注和l 讨论,目前已有多个相关项目(包括 Docker 三剑客、Kubemetes 等),逐渐形成了围绕Docker 容器的生态体系。 由于Docker 在业界造成的影响力实在太大, dotCloud 公司后来也直接改名为Docker Inc ,并专注于Docker 相关技术和产品的开发。
Docker的概念
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker的版本变迁
自从dotCloud公司开源其Docker项目后,凭借其便捷的Docker镜像技术解决了当时困扰众多PaaS项目的难题:如何为应用打包,让用户将本地的应用顺利迁移到PaaS平台,而不用顾忌应用的开发语言、配置、依赖包等诸多因素,也因此开启了全新的Docker容器时代。
随着扩张步伐的加快,dotCloud公司后来又实行了一系列大动作。诸如公司更名为Docker,意欲彻底控制相关商业业务;再到后来发布进军PaaS的Swarm项目,挑起Swarm、Mesos及K8S的鼎足之战。如今战事早已落幕,胜负已定,PaaS虽然竞争激烈,但幕后的 Docker还是那个深受喜爱的Docker,而其版本、包名称也在容器的变革中发生诸多变更。
下面针对相关容易混淆的版本做个总结说明,比如docker-io,docker-engine有啥区别,后来的moby又怎么回事。
实际上,从2013年3月开始推出0.1.0版本,到17年2月1.13的版本都采用x.x的形式,后来为了专注于Docker的商业业务,Docker公司将Docker项目改名为Moby,交由社区自行维护,将Docker本身拆分为Docker-CE免费版和Docker-EE商业版,由自身维护,此举几乎是全部将原先的Docker用户转移到Docker公司产品下。下面表格详细列举说明了各个版本情况。
版本名 | 版本号 | 说明 |
---|---|---|
Docker(docker.io,docker-engine) | 1.x.x | 以前的Docker开源版本,docker.io是由Ubuntu发布的deb包,docker-engine是Docker公司官方发布的deb包 |
Moby | YY.MM | 更名后由社区维护的开源项目,不过不知为什么,github上才17版本 |
Docker-CE | YY.MM,例如19.06,代表19年6月 | 由Docker公司维护的免费版本,CE分为Edge和Stable版本,Edge: 月版本,每月发布一次 Stable: 季度版本,每季度最后一月发布一次 |
Docker-EE | YY.MM | Docker商业版,只有Stable版本,每季度发布一次 |
二、 为什么要使用Docker
对开发和运维( DevOps )人员来说,可能最梦寐以求的效果就是一次创建或配置, 之后可以在任意地方、任意时间让应用正常运行。而Docker 恰恰是可以实现这一终极目标的“瑞士军刀” 。
具体说来, Docker 在开发和运维过程中,具有如下几个方面的优势:
1、更快速的交付和部署
使用Docker ,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同环境来部署代码。只要开发测试过的代码,就可以确保在生产环境无缝运行。Docker 可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。
2、更高效的资源利用
Docker 容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager, VMM ,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。跟传统虚拟机方式相比,要提高一到两个数量级。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。
4、更简单的更新管理
使用Dockerfile ,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
三、Docker与虚拟化
虚拟化
虚拟化( Virtualization )技术是一个通用的概念, 在不同领域有不同的理解。在计算领 域,一般指的是计算虚拟化( Computing Virtualization ),或通常说的服务器虚拟化。维基百 科上的定义如下:“虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、 网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使 用户可以比原本的组态更好的方式来应用这些资源、。”
可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系 统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。 从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中,真正 意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO 虚拟化( Single Root I/ O Virtualization and Sharing Specification , SR-IOV ) 等技术,也超出了本书的讨论范畴。 基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的 虚拟机技术即属于这个范畴) 。其中,前者一般指的是一些模拟设备或诸如Wine 这样的软 件。后者又可以细分为如下几个子类:
1、完全虚拟化。
虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。例如IBM p 和z 系列的虚拟化、VMware Workstation 、VirtuaboX 、QEMU 等。
2、硬件辅助虚拟化。
利用硬件(主要是CPU )辅助支持(目前x86 体系结构上可用的硬件辅助虚拟化技术包括Intel- T 和AMD-V )处理敏感指令来实现完全虚拟化的功能,客户操作系统元需修改,例如VMware Workstation 、Xen 、KVM。
3、部分虚拟化。
只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。
4、准虚拟化( paravirtualization ) 。
部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen 。
5、操作系统级虚拟化。
内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。
可见, Docker 以及其他容器技术,都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor 支持。
Docker 虚拟化方式之所以有众多优势,这与操作系统虚拟化技术自身的设计和实现是分 不开的。
Docker 和常见的虚拟化方式的不同之处
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统 层。Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加 轻量级。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
四、Docker 与虚拟机比较
作为一种轻量级的虚拟化方式, Docker 在运行应用上与传统的虚拟机方式相比具有显著优势: 1、Docker 容器很快,启动和停止可以在秒级实现,而传统的虚拟机方式需要数分钟。 2、Docker 容器对系统资源需求很少, 一台主机上可以同时运行数千个Docker 容器(在IBM 服务器上已经实现了同时运行lOK 量级的容器实例) 。 3、Docker 通过类似Git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。 4、Docker 通过Dockerfile 支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化。
Docker 容器除了运行其中应用外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N 个不同的应用就要起N 个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker 只需要启动N 个隔离的“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。
当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。但这并不意味着Docker 就不安全, Docker利用Linux 系统上的多种防护技术实现了严格的隔离可靠性,并且可以整合众多安全工具。从1.3.0 版本开始, Docker 重点改善了容器的安全控制和镜像的安全机制,极大提高了使用Docker 的安全性。在已知的大规模应用中,目前尚未出现值得担忧的安全隐患。
参考资料