什么是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
(虚拟机)、
bare metal、
OpenStack
集群和其他的基础应用平台。
简单的理解,
Docker
类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱和集装 箱之间没有影响。也就是说,Docker
平台就是一个软件集装箱化平台,这就意味着我们自己可以构建应 用程序,将其依赖关系一起打包到一个容器中,然后这容器就很容易运送到其他的机器上进行运行,而 且非常易于装载、复制、移除,非常适合软件弹性架构。
因此,就像船只、火车或卡车运输集装箱而不论其内部的货物一样,软件容器充当软件部署的标准单 元,其中可以包含不同的代码和依赖项。 按照这种方式容器化软件,开发人员和 IT
专业人员只需进行极 少修改或不修改,即可将其部署到不同的环境。
总而言之,
Docker
是一个开放平台,使开发人员和管理员可以在称为容器的松散隔离的环境中构建镜 像、交付和运行分布式应用程序。以便在开发、QA
和生产环境之间进行高效的应用程序生命周期管 理。
下面的图片比较了
Docker
和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化, 直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
Docker 的基本结构:
从上图,我们可以看到,容器由于省去了操作系统,整个层级更简化,可以在单台服务器上 运行更多的 应用,而这正是 IaaS
所需要的,可能
5G
左右的空间对你来说不是什么大事,但是如 果你需要对外提供成千上万的主机,那就是不得不考虑的问题,而这正是容器虚拟化要解决的问题。
比如:波音公司造飞机肯定不会考虑在水上航行的问题,造船厂也绝对不会考虑要在天上飞 的问题,汽车制造公司也不会考虑要在水上跑的问题,那么对于广大的移动互联网公司和云计算 公司,也可以只关注最顶层的应用,而不需要去考虑操作系统的问题。
为什么要使用 Docker?
作为一种新兴的虚拟化方式,
Docker
跟传统的虚拟化方式相比具有众多的优势。
- 首先, Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
- 其次, Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
- 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
- 传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。
具体说来,
Docker
在如下几个方面具有较大的优势。
1、 更快速的交付和部署
对开发和运维( devop
)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运 行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后, 运维人员可以直接使用这个容器 来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程
可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。
Docker
容器很轻很快!
容器的启动时间是秒级的,大量地节约开发、 测试、部署的时间。
2、 更高效的虚拟化
Docker
容器的运行不需要额外的
hypervisor
支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、 更轻松的迁移和扩展
Docker
容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4 、更简单的管理
使用
Docker
,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发 和更新,从而实现自动化并且高效的管理。
对比传统虚拟机
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千容器 | 一般几十个 |
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
包括三个基本概念
- 镜像( Image)
- 容器( Container)
- 仓库( Repository)
Docker镜像
镜像:一个特殊的文件系统
,
Docker
镜像就是一个只读的模板
操作系统分为内核和用户空间。对于
Linux
而言,内核启动后,会挂载
root
文件系统为其提供用户空间支持。而 Docker
镜像(
Image
),就相当于是一个
root
文件系统。
Docker
镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker
设计时,就充分利用
Union FS
的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。
在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Docker容器
镜像(
Image
)和容器(
Container
)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照
Docker
最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。
所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run
,数据却不会丢失。
注意: 容器在整个应用程序生命周期工作流中提供以下优点:隔离性、可移植性、灵活性、可伸缩性和可控性。 最重要的优点是可在开发和运营之间提供隔离
Docker仓库
仓库:集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像,我 们就需要一个集中的存储、分发镜像的服务,Docker Registry
就是这样的服务。
一个
Docker Registry
中可以包含多个仓库(
Repository
);每个仓库可以包含多个标签(
Tag
);每个标签对应一个镜像。
所以说,镜像仓库是
Docker
用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过
<
仓库名
>:<
标签
>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
仓库分为公开仓库(
Public
)和私有仓库(
Private
) 两种形式
这里补充一下
Docker Registry
公开服务和私有
Docker Registry
的概念:
Docker Registry
公开服务是开放给用户使用、允许用户管理镜像的
Registry
服务。
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的
Registry
公开服务是官方的
Docker Hub
,这也是默认的
Registry
,并拥有大量的高质量的 官方镜像,网址为:hub.docker.com/
。
在国内访问
Docker Hub
可能会比较慢,国内也有一些云服务商提供类似于
Docker Hub
的公开服务。
除了使用公开服务外,用户还可以在本地搭建私有
Docker Registry
。
Docker
官方提供了
Docker
Registry
镜像,可以直接使用做为私有
Registry
服务。
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不 影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。!