初识 Docker

# 一、容器

# 1.1 什么是容器

IBM DeveloperWorks网站这样描述容器:

容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(Paravirtualization)和系统调用替换中的复杂性。

简单来说,容器可以将软件打包成标准化的单元,以用于开发、交付和部署。

容器是轻量的,包含了软件运行所需的所有内容:代码、运行时的环境、系统工具、系统库和设置。而且容器赋予了软件独立性,避免了环境差异(比如开发和生产环境)的影响,从而有助于减少团队在相同基础设施上运行不同软件的冲突。

# 二、Docker的基础概念

# 2.1 什么是Docker

我们从下面的四点理解什么是Docker:

  1. Docker是世界领先的软件容器平台。
  2. Docker使用Google公司推出的Go语言 进行开发实现,基于Linux内核的cgroupnamespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进 程,因此也称其为容器。
  3. Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
  4. 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

# 2.2 Docker 架构

先来看下Docker架构:

image from dependency

  1. Docker Host是进行Docker操作的宿主机,在里面运行了一个Docker daemon的核心守护进程,负责构建、运行和分发Docker容器。

  2. 在宿主机中安装了Docker客户端,它与Docker daemon守护进程进行通信,客户端会将buildpullrun等命令发送到Docker daemon守护进程执行。

  3. 右边Registry是镜像仓库,其中存储着Docker镜像,是一个所有Docker用户共享Docker镜像的服务,Docker daemon守护进程与之进行交互。

# 2.3 Docker的思想

  • 集装箱
  • 标准化: 1. 运输方式 2. 存储方式 3. API接口
  • 隔离

# 2.4 Docker容器的特点

  • 标准化

Docker使用行业标准来创建容器,所以容器能适用于所有地方。

  • 轻量

容器共享计算机的操作系统系统内核,因此不需要每个应用程序都使用操作系统,从而提高了服务器效率,并降低了服务器和许可成本。

  • 安全

Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

# 2.5 Docker优势

  1. 更快速的交付和部署:使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境。开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试、部署的大量时间。

  2. 更高效的资源利用:运行Docker容器不需要额外的虚拟化管理程序(VMM以及Hypervisor)的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

  3. 更轻松的迁移和扩展Docker容器几乎可以在任意的平台上运行,这种兼容性让用户可以在不同平台之间轻松地迁移应用。

  4. 更简单的更新管理:使用Dockerfile,只需要小小的配置修改后,所以得修改都以增量的方式被分发和更新,从而实现自动化和高效的容器管理。

# 2.6 Docker的核心概念

Docker包含三个核心概念

  1. 镜像(Image)
  2. 容器(Container)
  3. 仓库(Repository)

image from dependency

# 镜像(Image)

一个特殊的文件系统

操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image)就相当于是一个root文件系统。

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些运行时所需的一些配置参数(如匿名卷、环境变量和用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

Docker充分利用Union FS技术,将容器设计为分层存储的架构

镜像实际是由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完成后不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记该文件已删除。在最终容器运行时,虽然不会看到这个文件,但实际上该文件会一直跟随镜像。因此,在构建镜像时,需要小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的架构还使得镜像的复用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

# 容器(Container)

镜像运行时的实体

镜像和容器的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。

容器的实质是进程,但与直接在宿主环境执行的进行不同,容器进程运行于属于自己的独立的命名空间。容器也是使用分层存储。

容器存储层的生命周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器的消亡而丢失。

所以,不应该将数据存储在容器中,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网路存储)发生读写,其性能和稳定性更高。数据卷的生命周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新运行,数据不会丢失。

# 仓库(Repository)

集中存放镜像文件的地方

一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

最常使用的Registry公开服务是官方的 Docker Hub (opens new window),这也是默认的Registry,并拥有大量的高质量的官方镜像。在国内访问Docker Hub可能会比较慢,国内也有一些云服务商提供类似于Docker Hub的公开服务。比如 时速云镜像库 (opens new window)网易云镜像服务 (opens new window)DaoCloud 镜像市场 (opens new window)阿里云镜像库 (opens new window)等。

# 三、Docker和 虚拟机

# 3.1 虚拟化

# 虚拟化定义

维基百科上对虚拟化的定义如下:

在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。

简单来说,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。

# 虚拟化分类

image from dependency

Docker以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor支持。

# 3.2 Docker和其他虚拟机的不同点

image from dependency

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

# 3.3 Docker与虚拟机比较

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较弱
内存代价 很小 较多
硬盘使用 一般为MB 一般为GB
运行密度 单机支持上千个容器 一般十几个
隔离性 安全隔离 安全隔离
迁移性 优秀 一般

# 参考文献

Docker技术入门与实战(第3版)

Docker 搭建你的第一个 Node 项目到服务器(完整版) (opens new window)

可能是把Docker的概念讲的最清楚的一篇文章 (opens new window)