zoukankan      html  css  js  c++  java
  • 容器 What, Why, How

    学习任何东西都可以按照3W的框架进行,容器技术也是一样,先回答 What、Why 和 How 这三个问题。

     

    What - 什么是容器?

    容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

    容器与虚拟机

    谈到容器,就不得不将它与虚拟机进行对比,因为两者都是为应用提供封装和隔离。

    容器由两部分组成:

    1. 应用程序本身

    2. 依赖:比如应用程序需要的库或其他软件

    容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。

    传统的虚拟化技术,比如 VMWare, KVM, Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十 MB),还得安装整个操作系统(几十 GB)。

    下图展示了二者的区别。

    如图所示,由于所有的容器共享同一个 Host OS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移。

    Why - 为什么需要容器?

    为什么需要容器?容器到底解决的是什么问题?
    简要的答案是:容器使软件具备了超强的可移植能力

    容器解决的问题

    我们来看看今天的软件开发面临着怎样的挑战?

    如今的系统在架构上较十年前已经变得非常复杂了。以前几乎所有的应用都采用三层架构(Presentation/Application/Data),系统部署到有限的几台物理服务器上(Web Server/Application Server/Database Server)。

    而今天,开发人员通常使用多种服务(比如 MQ,Cache,DB)构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器,私有云和公有云。

    一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题:

    如何让每种服务能够在所有的部署环境中顺利运行?

    于是我们得到了下面这个矩阵:

    各种服务和环境通过排列组合产生了一个大矩阵。开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境。对他们双方来说,这都是一项困难而艰巨的任务。

    如何解决这个问题呢?

    聪明的技术人员从传统的运输行业找到了答案。

    几十年前,运输业面临着类似的问题。

    每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装、卸货上,而且搬上搬下还容易损坏货物。

    这同样也是一个 NxM 的矩阵。

    幸运的是,集装箱的发明解决这个难题。

    任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明。

    Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。

    其实,“集装箱” 和 “容器” 对应的英文单词都是 “Container”。
    “容器” 是国内约定俗成的叫法,可能是因为容器比集装箱更抽象,更适合软件领域的原故吧。

    我个人认为:在老外的思维中,“Container” 只用到了集装箱这一个意思,Docker 的 Logo 不就是一堆集装箱吗?

    Docker 的特性

    我们可以看看集装箱思想是如何与 Docker 各种特性相对应的。

    特性 集装箱 Docker
    打包对象 几乎任何货物 任何软件及其依赖
    硬件依赖 标准形状和接口允许集装箱被装卸到各种交通工具,整个运输过程无需打开 容器无需修改便可运行在几乎所有的平台上 -- 虚拟机、物理机、公有云、私有云
    隔离性 集装箱可以重叠起来一起运输,香蕉再也不会被铁桶压烂了 资源、网络、库都是隔离的,不会出现依赖问题
    自动化 标准接口使集装箱很容易自动装卸和移动 提供 run, start, stop 等标准化操作,非常适合自动化
    高效性 无需开箱,可在各种交通工具间快速搬运 轻量级,能够快速启动和迁移
    职责分工 货主只需考虑把什么放到集装箱里;承运方只需关心怎样运输集装箱 开发人员只需考虑怎么写代码;运维人员只需关心如何配置基础环境

    容器的优势

    对于开发人员 - Build Once, Run Anywhere

    容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。

    对于运维人员 - Configure Once, Run Anything

    只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。

    How - 容器是如何工作的?

    从下节开始我们将学习容器核心知识的最主要部分。首先会介绍 Docker 的架构,然后分章节详细讨论 Docker 的镜像、容器、网络和存储。

    二维码+指纹.png

  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/CloudMan6/p/6751516.html
Copyright © 2011-2022 走看看