2.1 什么是Docker

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到安装了任何 Linux 发行版本的机器上。Docker基于LXC来实现类似VM的功能,可以在更有限的硬件资源上提供给用户更多的计算资源。与同VM等虚拟化的方式不同,LXC不属于全虚拟化、部分虚拟化或半虚拟化中的任何一个分类,而是一个操作系统级虚拟化。

Docker是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。

Docker借助Linux的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。从而降低每个容器的系统开销,并实现降低容器复杂度、启动快、资源占用小等特征。

2.2 Docker的构成

2.2.1 Docker架构

Docker使用客户端-服务器 (C/S) 架构模式 使用远程API来管理和创建Docker容器。Docker 容器(Container)通过 Docker 镜像(Image)来创建,二者之间的关系类似于面向对象编程中的对象与类。

其中,Docker客户端用于向Docker服务器或守护进程发送请求。而服务器或守护进程会接受来自客户的请求(创建、运行、分发容器),并在处理完请求后返回响应结果。Docker提供了一个命令行工具docker,及一整套RESTful API。客户端和服务端既可以运行在一个机器上,也可通过 socket或者RESTful API来进行通信。

Docker 架构

2.2.2 Docker核心组件

Docker Image(镜像)、Registry(仓库)、Docker Container(容器)是Docker中包含几个核心组件(核心概念),这几个组件介绍如下:

Docker Image - 镜像

镜像用于构建Docker容器,是构成Docker的基础。它类似于虚拟机中的镜像,但它非常小,可以将它理解为容器的源代码。是一种层式结构的增量文件系统,由一系列命令一步步组成。

与传统虚拟机中的镜像相比,Docker镜像是分层的,也更为轻量。你可以对其进行快速跌代,通过版本管理及增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经现有的应用镜像,再通过简单的命令就可以直接使用。

Registry - 仓库

RegistryDocker用于存放镜像文件仓库,仓库分为开放(Public)和私有(Private),其设计理念非常类似于代码仓库Git

Docker Hub是Docker公司运营的Registry,也是最大的Docker仓库,用户可以在上面注册帐号分享并保存自己的镜像。除Docker Hub外,还有很多第三方镜像仓库。如果不希望自己的镜像被其它人看到,你甚至可以架设自己的私有仓库,以增强安全性或满足一些特殊需求。

注意:也可以将Repository认为是Docker仓库,实际上二者区分并不严格。

Docker Container - 容器

容器是用于运行镜像的沙箱环境,它是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除。而这些容器都是相互隔离、互不可见的。我们可以理解为:镜像是Docker生命周期的打包和构建阶段,而容器Docker的启动和执行阶段。

Docker借签了集装箱的设计概念,不同的是集装箱运送的货物,而Docker运送的是软件。和集装箱一样,我们并不需要关心里面装的是什么,只需要将应用按标准的形式装进去,然后上传到Registry,在需要使用它的服务器下载部署即可。Docker容器可以非常方便的替换,且各个容器都有良好的通用性,易于分发和叠加。

2.3 Docker的适用范围

正如前所述,Docker为容器提供了标准的隔离性,而各个容器本身就是一个标准的系统环境。因些,Docker非常适合构建服务块,以下是Docker的一些应用场景:

  • 方便应用的自动化打包与部署 - 加速本地开发和构建流程,使其更加高效和轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松的提交到测试环境,并最终进入生产环境。
  • 创建轻量、私密的PAAS环境
  • 部署和扩展Web应用、数据库与后台服务 - 可以让独立服务在不同环境中得到相同的执行结果
  • 连续的集成/部署、测试自动化 - 开发者可以在本地构建运行或测试环境,而不是直接在生产环境中部署、测试。

Docker也并不是万能的,其设计目的也并不是要成为KVM等的替代品。不可避免的,Docker也会有一些局限性,如:

  • 基于Linux内核,所以只能运行于Linux环境中,且只能64位主机上
  • 基于LXC实现的容器,而LXC是基于Linux内核中的cgroup。因此,Docker容器使用的权限、物理资源等也受限于LXC
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐