Docker 是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

Docker 应用场景

  • Web 应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 提供强大的安全保障,运行一个单独的进程与服务器隔离。

Docker 特征

  • 速度飞快以及优雅的隔离框架
  • 物美价廉
  • CPU/内存的低消耗
  • 快速开/关机
  • 跨云计算基础构架

Docker 两个主要部件

  • Docker: 开源的容器虚拟化平台
  • Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台,即 Docker Hub

Docker 使用客户端-服务器 (C/S) 架构模式。Docker 系统有两个程序:docker 服务端和 docker 客户端。其中 docker 服务端是一个服务进程,管理着所有的容器。docker 客户端则扮演着 docker 服务端的远程控制器,可以用来控制 docker 的服务端进程。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

Docker model

由上图可知 Docker 系统有三个重要的组件:

  • Docker Client: 是用户界面,它支持用户与 Docker Daemon 之间通信。
  • Docker Daemon: 运行于主机上,处理服务请求。
  • Docker Index: 是中央 registry,支持拥有公有与私有访问权限的 Docker 容器镜像的备份。

Docker 对 Linux 环境有两个要求,一是 64 位系统,二是内核在 3.8 以上。

Docker 核心技术

Docker 使用以下操作系统的功能来提高容器技术效率:

  • Namespaces: 充当隔离的第一级。确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程。
  • Control Groups: 是 LXC 的重要组成部分,具有资源核算与限制的关键功能。
  • UnionFS:(文件系统)作为容器的构建块。为了支持Docker的轻量级以及速度快的特性,它创建了用户层。

Docker 三个重要概念

要理解 Docker 内部构建,需要理解以下三种重要的概念:

  • Docker 镜像 - Docker images
  • Docker 仓库 - Docker registeries
  • Docker 容器 - Docker containers

Docker 容器文件系统

镜像

是一个构建容器的只读模板,是一个包含了应用程序和其运行时依赖环境的只读文件。它包含了容器启动所需的所有信息,包括运行程序和配置数据。每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

容器

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。Docker 利用容器来运行应用。一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注: 镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

运行容器实例有两种方式:

  • 交互型容器: 前台运行,可以通过控制台与容器交互。如果创建该容器的终端被关闭,则容器就变为停止状态。此外,在容器控制台中输入exit或者通过docker stop或docker kill也能终止容器。
  • 后台型容器: 后台运行,创建启动之后就与终端无关了,需要用 docker stop 或 docker kill 来终止,或者 docker logs 查看运行中的输出。

仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 仓库的概念与 Git 版本控制工具有些类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker 优势的体现

Docker 跟传统的虚拟化方式相比具有众多的优势,其启动可以在秒级实现,这相比传统的虚拟机方式要快得多。同时,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。

更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

更安全的运行应用

Docker 容器内运行的进程完全与系统隔离,一些恶意行为对系统造成的影响不会波及宿主系统。

更快速的交付和部署

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。