天天看点

(一)docker 认知

(一)docker 认知

1、为什么Docker有价值

为什么Docker这么有价值?在回答这个问题之前,我们先想一个相似的问题,为什么阿里巴巴这么有价值?

传统的商业存在两大弊端:一是买卖双方相对分散,加大了需求收集、营销、运输的成本;二是买卖双方信息不对称,对交易产生了抑制作用。

电子商务的出现则将商品从卖方到买方的流通过程变得集中化、标准化、透明化:

集中化:买家足不出户就能从各个商户集中购买商品,卖家根据买家需求集中配货、根据下单情况集中发货。

标准化:买家支付下单—卖家发货—快递包裹—物流运输—买家收货确认,整个流程都是标准化的。

透明化:买家可以在网上浏览商品评价、比较商品价格。买卖双方的信用等级也是完全透明的。

综上所述,可以说阿里巴巴这样的电商带来的最大价值在于降低了商品的社会交易成本。

现在我们把商业发展的逻辑搬到软件交付这里。传统的软件交付面临同传统商业类似的问题:

软件发布分散化,使用者搜索和安装软件的成本较高。当然,我们有类似yum、brew这样的工具来集中处理软件安装与软件依赖问题。但是,不要忘记开源软件已经占据越来越重要的位置,它们的发展速度和协作方式使传统的工具很难跟上节奏。

软件开发者和软件使用者双方信息不对称。尽管开发者对软件的代码编译、参数配置、运行环境等信息了如指掌,但使用者却很可能一知半解。因此,我们会经常看到使用者抱怨,明明按照用户手册一步步操作,却仍然跑不起来。这种情况也时常出现在软件流程中,开发将程序和文档交付给测试或运维,测试或运维却总是无法重现期望的运行状态,几经辗转发现是机器环境、系统环境、软件依赖版本、参数配置等等原因导致。这样低效的软件流程将使持续集成与持续交付很难真正实施起来,仅仅流于形式。

Docker的出现则将软件从开发方到使用方的交付过程变得集中化、标准化、透明化。

集中化:软件使用者可以从Docker仓库找到琳琅满目的软件镜像,一个镜像包含商业软件或开源软件,也可以包含单个软件或任意的软件组合。

标准化:Docker镜像的“构建—发布—存储—下载—运行”是标准化的,统一通过Docker工具来执行,而且所有操作都可以移植到任意的机器或平台。

透明化:Docker镜像是自包含的,包括程序、软件依赖、参数配置等所有运行环境,使用者无需了解细节,只需运行同样的Docker命令就能达到与开发者同样的运行状态。

综上所述,可以说Docker带来的最大价值在于降低了软件的交付成本。

2、什么是Docker思维

这年头流行思维主义,什么互联网思维、大数据思维格外赚人眼球。这里我们跟风一下,提出一个Docker思维,其实归纳起来就两句话:

1、做为软件使用者,避免直接安装软件包,总是以Docker镜像形式获取软件、以Docker容器形式运行软件。

2、做为软件开发者,避免直接发布软件包,总是以Docker镜像形式发布到Docker仓库。

怎样理解这两句话?下面通过一个简单的实践来说明。假定现在我们在开发一个Java程序,从编译到运行需要使用以下几个软件工具:1)svn,源码版本控制;2)maven,源码编译;3)mysql,存储数据库。

遵循Docker思维,做为使用者,我们应该避免直接安装svn、maven及mysql,而是通过Docker来获取。

3、什么是Docker

Docker是一个由GO语言写的程序运行的“容器”(Linux containers,LXCs); 目前容器服务的基石是操作系统级别的隔离,在同一台物理服务器上虚拟出多个主机。Docker则实现了一种应用程序级别的隔离; 它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器”上来。

Docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App装在Container内,通过Linux Container技术的包装将App变成一种标准化的、可移植的、自管理的组件,这种组件可以在你的Laptop上开发、调试、运行,最终非常方便和一致地运行在生产环境下。Docker的核心底层技术是LXC(Linux Container),Docker在其上面加了薄薄的一层,添加了许多有用的功能。

Docker不仅是历史上最流行的开源项目之一,而且也从根本上改变了人们构建应用程序的思维方式。它可以把程序及依赖的二进制文件、第三方库等封装在一起,运行在任何安装Docker Daemon的服务器上,它有望成为未来软件自动化部署的标准。

  1. Docker的优点

    Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;

Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何使机器启动地更快和消耗更少的内存;

Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等;

Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;

Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;

Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;

Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PASS平台的支持等;

那么Docker有什么用呢?对于运维来说,Docker提供了一种可移植的标准化部署过程,使得规模化、自动化、异构化的部署成为可能甚至是轻松简单的事情;而对于开发者来说,Docker提供了一种开发环境的管理方法,包括映像、构建、共享等功能。

速度快:运行时的性能可以获取极大提升,管理操作(启动、停止、开始、重启等)都是以秒或毫秒为单位的。将应用和系统“容器化”,不添加额外的操作系统。

敏捷:比VM小,比VM快,Docker容器的尺寸减小相比整个虚拟机大大简化了分布到于和仍于分发灵活。

轻量:你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署100~1000个Containers容器。

便宜:开源的、免费的、低成本的。由现代Linux内核支持驱动,轻量的Container必定可以在一个物理机上开启更多“容器”,注定比VM要便宜。

敏捷思维:

持续集成:

在项目快速迭代的情况下、轻量级容器对项目快速构建 环境打包 发布等流程就能提高工作效率

版本控制:

每个镜像是一个版本、在一个项目多个版本时可以很方便的管理

标准化:

应用程序环境以及依赖、操作系统等问题,降低生产环境故障率、容器保证了所有配置、依赖不变

隔离与安全:

容器之间是相互隔离的,一个容器出现问题不会影响其他容器