Docker容器实战一:容器介绍
作为容器系列教程的首文,本篇将对容器、Docker等概念进行介绍。
一. 什么是容器
容器的英文名为container,可译为集装箱,这也代表了容器技术的特点。容器可以被看作是一个相对独立的运行环境,我们可将各类应用程序封装在里面,并实现资源的隔离与限制。
在这方面,容器与传统的虚拟机类似,但是相比而言会更加轻量化。如下图所示,每台虚拟机除运行应用程序与相关的依赖库外,还包含着独立的操作系统,并由下层的Hypervisor系统进行虚拟化支持。而容器则要简单得多,那些运行在相同宿主机上的容器会共享同一个操作系统内核。由于使用了操作系统内核,在容器内部只需要封装必要的软件工具以及相关的依赖即可,这让容器变得非常轻量级,最小甚至可以只有几MB。
在操作系统中启动后,容器会以进程的方式运行,这也使得容器的启动效率及资源占用都要远远小虚拟机。综上所述,容器具有资源占用小、启动快、便于迁移等特性。
二. 容器核心技术
通常来说,容器的核心技术主要包括Namespace和Cgroup两个特性,它们分别用于实现对资源的访问与使用隔离。
1. Namespace
Namespace又称为命名空间,它是Linux提供的一种内核级别环境隔离的方法,主要用于对系统资源的访问隔离。命名空间可以看作是系统中的安全沙盒,在其中的进程彼此独立。例如在A命名空间中有个pid为1的进程,而在B命名空间中也可以有一个pid为1的进程,它们之间互不影响。
目前Linux提供了以下几种命名空间类型:类型 | 功能说明 |
Mount namespaces | 提供文件系统挂载的隔离能力 |
UTS namespaces | 提供主机名和域名隔离能力 |
IPC namespaces | 提供进程间通信的隔离能力 |
PID namespaces | 提供进程隔离能力 |
Network namespaces | 提供网络隔离能力 |
User namespaces | 提供用户和组隔离能力 |
2. Cgroup:
全称为Control Group(控制组),它是Linux内核提供的一个特性,可用于限制和隔离进程对于资源的使用,包括CPU、内存、磁盘 I/O和网络带宽。通过Cgroup技术,容器可以实现对于不同进程的资源分配。
Cgroup对于不同资源的管理通过各个子系统实现,子系统负责将特定类型的系统资源分配给特定的进程。
目前Cgroup具有以下子系统功能:
子系统 | 作用 |
devices | 控制进程对于设备的访问权限 |
cpuset | 分配指定的cpu和内存节点 |
cpu | 控制cpu占用率 |
cpuacct | 统计cpu使用情况 |
memory | 限制内存的使用量 |
freezer | 挂起Cgroup中的进程 |
net_cls | 限制网络带宽 |
net_prio | 设置进程的网络流量优先级 |
huge_tlb | 限制Huge TLB的使用 |
perf_event | 允许Perf工具基于Cgroup分组做性能监测 |
blkio |
限制进程的块设备IO |
三. Dcoker介绍
2013年,DotCloud公司将内部基于Go语言开发的Docker项目进行开源,并迅速成为了最热门开源项目之一。该公司也在年底将自身名称改为Docker.inc,并专注于Docker的开发与推广,目前已成为全球最大的Docker容器服务提供商。
尽管在Docker出现之前,市场上早已存在着其他的容器产品,例如2000年左右出现的商用容器产品Linux-VServer和Odin开发的Virtuozzo。但由于技术的复杂性,容器的使用并没有被推广开来,直到Docker的横空出世,才让容器技术真正得到全世界的关注。
Docker又称为Docker Engine(引擎),是一个开源的容器引擎,它包含了一系列对于容器管理的功能组件,并实现了镜像打包技术、Docker Registry管理、镜像分层等多种创新方案,这些功能大大地提升了容器的使用效率,也降低了容器在跨环境迁移中的难度。用户可以无须关注底层的操作,就能够简单明了地管理和使用容器。可以说,正是因为Docker,才让容器应用开始流行起来。
目前Docker 除了提供开源的社区版(Docker-CE)外,也提供了企业版(Docker-EE)。社区版本包括主要的核心功能,可以满足大部分用户的使用需求;而企业版则通过付费的形式,提供了认证支持、安全扫描等高级服务。每个季度,企业版和社区版都会发布一个稳定版本,社区版本通常会提供4个月的支持,而企业版本会提供12个月的支持。
当前市面上除了Docker外,也存在着其他家的容器产品,比如CoreOS的rkt。为了避免竞争导致容器生态出现分裂的危险,Docker公司与相关各方共同成立了OCI(The Open Container initiative,开放容器计划)组织,旨在统一容器的管理标准。目前,OCI已经发布了两份规范:镜像(images)规范和运行时(runtime)规范。镜像规范定义了容器的模板标准,而运行时则定义容器的运行环境标准,这些规范保证了不同厂商开发的容器具有可移植性和互操作性。
由于产品的巨大影响力,目前Docker已经成为容器的代名词,并在行业内占有绝对的领导地位。
四. 为什么要使用Docker
在容器使用未流行之前的时间里,基础环境的部署对于运维人员而言是一个繁琐且无趣的工作。
当新增环境时,运维人员需要安装新的操作系统,然后再安装Nginx、tomcat、JDK等相关组件,最后再进行代码的发布配置等工作。这些繁重的事务占用了大量的时间,也延长了服务的交付周期。另外,在部署应用时还需要考虑不同环境的差异性,例如当两个环境存在不一样的组件版本时,可能导致应用在一个环境中可以正常运行,而到了另一个环境则会出现问题,引发系统故障。
随着互联网行业的快速发展,互联网的业务特性对于服务的交付有着更高的标准,需要在更短时间内部署并交付更高质量的服务。这些要求不管对于运维或者开发人员而言,都是一件艰巨的任务。
而Docker容器技术的出现,正好可以完美地解决这些痛点。对于运维和开发而言,使用Docker容器具有以下几个方面的优势:
1. 强大的可移植性
在人类运输史上,集装箱堪称最伟大的发明之一。通过集装箱的方式可以屏蔽不同物件之间的特性,实现货物的统一运输标准,并由此建立了一整套运输体系。
而在软件打包上,Docker也借用了集装箱的思想,将应用及相关依赖打包成一个轻量级容器,该容器可运行在任何支持Docker的环境中。这使得Docker容器具有强大的可移植性,也是产品最重要的特性。
通过这种容器封装的方式,Docker解决了不同环境之间的差异性问题。当部署应用时,开发人员只需要将代码打包成Docker镜像,即可由运维人员在不同的环境轻松部署容器。
2. 更快的部署交付
Docker容器的特性保证了同一套代码只要在一个环境测试过,即可以在其他环境中无缝运行,有效降低了部署成本。同时,Docker提供了一整套管理容器的方案,简单易用且学习成本低,我们可以轻松地对容器进行快速创建、删除等操作,实现快速迭代,这节约了开发、测试和运维的大量时间,也较大地提升了服务交付的效率。
3. 高效的资源利用
在以前,为了避免程序之间可能相互影响,一台服务器往往只会部署单个应用,这导致了较大的资源浪费。而Docker容器由于自身的隔离性,我们可以在单台服务器上运行数十个容器而不受到影响,这使得资源可以得到最大化的利用。而相比于虚拟机,容器不需要额外操作系统和虚拟层,在操作系统中以进程的方式运行,这也让容器本身对于资源的占用非常少,能够更好的节约资源。