乐趣区

简单聊会-Docker

本文来自于我的慕课网手记:简单聊会 Docker,转载请保留链接 ;)

最近在工作中一直在忙基础设施构建,发现在选型的时候,大家心里基本上都有一个自己的成熟架构。而在服务部署这块发现公司的同事们都大多数考虑 Docker,在业余闲聊了后,发现他们对 Docker 只是在停留在使用,对一些 Docker 的基本知识还是不了解,并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?今天就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发并用其部署微服务。

Docker 简介

Docker 是基于 Go 语言实现的云开源项目,诞生于 2013 年初,最初发起者是 dotCloud 公司。Docker 自开源后受到广泛的关注和讨论,目前已有多个相关项目,逐渐形成了围绕 Docker 的生态体系。dotCloud 公司后来也改名为 Docker Inc,专注于 Docker 相关技术和产品的开发。Docker 一直广受瞩目,被认为可能会改变软件行业。那么什么是 Docker 呢?我查阅了网上的一些相关资料,现用一段话总结了一下。
Docker 是一个开源的 容器引擎 ,它可以帮助我们更快地交付应用。Docker 可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker,可更快地打包、测试以及部署应用程序,并可 减少从编写到部署运行代码的周期
对一个事物有了一定了解后,我们的继续学习 Docker 官方的给出文档和源码。(这个今天不在此文章扩展,不然聊不完。)

TIPS

(1) Docker 官方网站:https://www.docker.com/

(2) Docker GitHub:https://github.com/docker/docker

Docker 快速入门

执行如下命令,即可启动一个 Nginx 容器

docker run -d -p 91:80 nginx

Docker 架构

我们来看一下来自 Docker 官方文档的架构图,如图所示。

我们来讲解上图中包含的组件。
(1) Docker daemon(Docker 守护进程)

Docker daemon 是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可通过 Docker 客户端与之通信。

(2) Client(Docker 客户端)

Docker 客户端是 Docker 的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon 通信。图中,docker build 等都是 Docker 的相关命令。

(3) Images(Docker 镜像)

Docker 镜像是一个只读模板,它包含创建 Docker 容器的说明。它和系统安装光盘有点像——我们使用系统安装光盘安装系统,同理,我们使用 Docker 镜像运行 Docker 镜像中的程序。

(4) Container(容器)

容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。我们可通过 Docker API 或者 CLI 命令来启停、移动、删除容器。

(5) Registry

Docker Registry 是一个集中存储与分发镜像的服务。我们构建完 Docker 镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。此时,我们可借助 Docker Registry 来避免镜像的手动拷贝。

一个 Docker Registry 可包含多个 Docker 仓库;每个仓库可包含多个镜像标签;每个标签对应一个 Docker 镜像。这跟 Maven 的仓库有点类似,如果把 Docker Registry 比作 Maven 仓库的话,那么 Docker 仓库就可理解为某 jar 包的路径,而镜像标签则可理解为 jar 包的版本号。

Docker Registry 可分为公有 Docker Registry 和私有 Docker Registry。最常用的 Docker Registry 莫过于官方的 Docker Hub,这也是默认的 Docker Registry。Docker Hub 上存放着大量优秀的镜像,我们可使用 Docker 命令下载并使用。

Docker 应用场景

常用的 8 个 Docker 的真实使用场景,分别是简化配置、代码流水线管理、提高开发效率、隔离应用、整合服务器、调试能力、多租户环境、快速部署。我们一直在谈 Docker,Docker 怎么使用,在怎么样的场合下使用?

首先你在享有 Docker 带来的虚拟化能力的时候无需担心它带来的额外开销。其次,相比于虚拟机,你可以在同一台机器上创建更多数量的容器。

Docker 的另外一个优点是容器的启动与停止都能在几秒中内完成。Docker 公司的创始人 Solomon Hykes 曾经介绍过 Docker 在单纯的 LXC 之上做了哪些事情,你可以去看看。

下面是我总结的一些 Docker 的使用场景,它为你展示了如何借助 Docker 的优势,在低开销的情况下,打造一个一致性的环境。

简化配置

这是 Docker 公司宣传的 Docker 的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker 在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个 Docker 的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

代码流水线(Code Pipeline)管理

前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker 给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

提高开发效率

这就带来了一些额外的好处:Docker 能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考 Aater 在 DevOpsDays Austin 2014 大会或者是 DockerCon 上的演讲。

不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。

理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是 Docker 做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在 Docker 可以轻易的让几十个服务在 Docker 中跑起来。

隔离应用

有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。

我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考 Steve Yege 的这篇论文,文中将 Google 和亚马逊做了比较。

整合服务器

正如通过虚拟机来整合多个应用,Docker 隔离应用的能力使得 Docker 可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker 可以比虚拟机提供更好的服务器整合解决方案。

调试能力

Docker 提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试 Bug。你可以在《Docker 拯救世界》的文章中找到这一点的例证。

多租户环境

另外一个 Docker 有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为 IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。

使用 Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于 Docker 环境的启动速度和其高效的 diff 命令。

你可以在这里了解关于此场景的更多信息。

快速部署

在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而 Docker 通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是 Google 和 Facebook 都看重的特性。

你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有 30%,通过使用 Docker 并进行有效的资源分配可以提高资源的利用率。

退出移动版