企业容器化如何选型?全方位对比 Heroku 与 Docker
【线上直播】11月21日晚8点贝壳技术总监侯圣文《数据安全之数据库安全黄金法则》
Heroku 和 Docker 都可以让开发人员能够在容器内开发、部署和运行应用程序。容器是在单个操作系统内核上运行的虚拟环境,使应用程序能够使用虚拟机或裸机计算机系统所需资源的一小部分来运行。容器还使我们能够快速扩展应用程序,并轻松地从开发过渡到生产。虽然 Heroku 和 Docker 都为软件部署和管理提供了一个容器化的解决方案,但是它们在实现和术语方面有很大的不同。每个系统也有着不同的利与弊。
什么是容器?
容器是使应用程序能够共享单个操作系统的软件系统。容器系统通常由容器引擎、主机操作系统和处理器组成。
容器引擎——在这种情况下,Docker 或 Heroku 是一种用于部署容器化应用程序的托管环境。容器引擎管理内核和内存。它还管理各个应用程序的空间隔离和安全性,并允许可伸缩性。
主机操作系统 (OS)——主机操作系统 (通常是 Linux) 提供用户界面,内存等资源的管理,并为应用程序提供服务。
处理器——也称为中央处理器,它基于来自操作系统和应用程序的指令,负责执行所有的任务。
容器的优点
因为容器允许应用程序共享资源,所以它们提供了以下几个优点:
降低成本——容器通过允许应用程序共享资源来降低成本。
增加的可靠性和健壮性——容器使我们可以做到快速的故障切换和恢复。
可伸缩性——容器使我们可以快速且容易地伸缩应用程序的数量。
隔离——容器在名称空间中使用自己的资源隔离每个应用程序。因此,尽管应用程序共享资源,但它们在职能上是相互隔离的。这还意味着一个应用程序中的故障是与其他应用程序隔离的,从而使容器比虚拟机或裸金属系统更安全。
持续集成——因为容器很容易被摧毁和部署,所以它们支持迭代过程,比如敏捷。
可移植性——容器非常便携,允许从开发到生产的轻松转换,在云环境中效果尤为显著。
安全——容器的模块化设计增加了隔离性,使系统更难被攻击,并限制了恶意软件的影响。
- 容器进程必须只向容器特定的文件系统写入信息。
- 容器命名空间必须与私有内部网隔离。
- 容器特权必须隔离。
Heroku
Heroku 是一个平台即服务 (PaaS) 平台,是 2007 年创建的第一批云平台之一。Heroku 最初只支持 Ruby,但现在已支持 Java、Node.js、Python、 PHP 等。Heroku 由以下组件组成:
- BuildPack—Heroku BuildPack 是一组用于创建镜像的脚本。BuildPack 确定应用程序可以运行的语言,包括 Java、Python、Ruby 和其他语言。Heroku 为各种语言提供了默认的 BuildPack ,开发人员也可以构建自己的 BuildPack。
- Slug——运行 BuildPack 时,它会创建应用程序的打包副本,称为 Slug。Slugs 包含运行应用程序所需的所有功能,可以快速轻松地部署。
- 根据 Heroku 的说法,“Dynos 是隔离的、虚拟化的 Linux 容器,用于根据用户指定的命令执行代码”。使用 Dynos,可以根据资源需求将应用程序扩展到任何级别。
- 可为 Heroku 购买 Add-Ons-Preconfigured 构建块,以构建更复杂的应用程序。
- 命令行界面 (CLI)——用来管理 Heroku 容器的命令行界面。
有没有考虑过将 DeployPlace 作为 Heroku 的替代方案以避免被供应商锁定?
Docker
Docker 是一个开源工具,用于在容器中创建、管理、部署和运行应用程序。与 Heroku 必须在自己的云环境中运行不同,Docker 可以安装在笔记本电脑、服务器或如 Amazon Web Services (AWS) 之类基于云的环境中。Docker 由以下高级组件组成:
- Dockerfile——Dockerfile 是一组用于构建 Docker 镜像的命令 (参见下文)。Dockerfiles 也代表着 Docker 镜像的最终配置。
- Docker 镜像——通过运行 Dockerfile 创建的 Docker 镜像 (参见上文)。Docker 镜像是一个多层文件,包含运行应用程序所需的所有资源、依赖项、数据、文件和设置。每次启动一个 Docker 镜像时,它都会创建一个同一个应用程序的容器,从而提供了简单的可伸缩性。
- Index——Docker 图像可以上传到 Index 分享给 Docker 社区。这样可以让其他用户基于从 Index 下载的单个 Docker 镜像组件构建复杂的应用程序。
命令行界面(CLI)——与 Heroku 类似,Docker 提供了用于管理容器的 CLI。
Docker 和 Heroku 术语
Docker vs Heroku
虽然 Docker 和 Heroku 有一个共同的概念,即应用程序的容器化,但是这两个平台之间有着一些主要的区别。Heroku 提供了运行应用程序的容器和托管应用程序的基础设施。换句话说,Heroku 提供了容器化的所有优点,但是你也必须在 Heroku 平台上运行它。这使得 Heroku 非常容易搭建和运行,但是同时也有一些限制。与 Docker 不同,Heroku 不能在本地服务器或基于私有云的服务上运行。
Heroku
Heroku 的优点:
Heroku 易于搭建、实施和部署。Heroku 管理硬件、软件和其他资源,使开发人员可以几乎只专注于开发他们的应用程序。
Heroku 支持多种语言,包括Ruby、Java、Node.js、Scala、Clojure、Python、PHP和Go。
Heroku 是一个通晓多种语言的平台——通过使用各种构建包,开发人员可以在几乎任何编程语言中部署应用程序。
Heroku Dynos 允许简单的开发和可用性——因为由 Heroku 管理和运行应用程序,将开发人员从操作系统和其他系统配置的管理中解放出来。
Heroku 允许即时的可伸缩性——通过增加或减少 Dynos 的数量,可以很容易地按比例增加或减少 Heroku。
Heroku 的缺点:
在 Heroku 上运行的应用程序只能在 Heroku 平台上运行。因此,Heroku 不能在内部服务器或私有云上运行。了解一下 DeployPlace,以避免被供应商锁定。
Heroku 应用程序只能使用 Linux 操作系统运行。
虽然 Heroku 提供了一个免费的版本,但标准套餐每月 25 美元起。
Heroku 的流言:
Heroku 太贵了。许多公司更喜欢寻找、招聘和培训 DevOps 工程师来搭建和支持部署基础设施。招聘、培训、工资和办公的成本常常被忽视。在主要关注开发更好的产品的同时,DevOps 团队的招募和管理可能会被忽视。
有时 Heroku 被认为不够安全。但是 Heroku 比你自主研发的部署基础设施安全得多。Heroku 有一个单独的团队处理安全问题。Heroku 的安全特性已经在数千个实际客户的应用程序上进行了测试。对于大多数不需要额外认证的行业来说,Heroku 的安全性绝对没有问题。
Heroku 的陷阱
Heroku 的客户如果想通过免费的途径省钱,就会使用较低的成本级别,但在系统为了节省公司资金关闭资源的时候,可能会遭遇“休眠应用”(https://blog.heroku.com/app_sleeping_on_heroku)。对于不知情的用户来说,这种意外很是令人不快,这么度量简直太不方便了!它根本就是在“故意停机”,你花了钱却不能掌控它!
服务器和进程(Heroku 在多租户共享服务器中存储实例的地方)也缺乏所有权。从某种意义上说,客户实际上没有选择服务器部署在何处的权利。
Docker
Docker 的优点:
几乎可以在任何环境下运行—docker 可以在内部服务器、私有云系统甚至是在 Heroku PaaS 本身上运行。
可定制——因为 Docker 几乎可以在任何平台上运行,所以可以对它进行定制以满足你的所有需求。
安全性——因为 Docker 可以在内部服务器上运行,所以它的安全性可以让你满意。
操作系统——docker 可以运行在各种操作系统上,包括 Linux、Windows 和其他操作系统。
成本——AWS 上的 Docker 相对便宜,大约每月 4.75 美元起。
Docker 的缺点:
很难配置——与 Heroku 相比,Docker 的灵活性意味着它需要更多的配置才能正确设置。
Docker 的陷阱
开发团队有时会遇到 Docker 的问题,其中许多问题与该技术的开源本质有关。在许多不同类型的用例中,覆盖网络会导致延迟。这种延迟可能会成为一个问题,特别是对于那些需要接近裸机地运转才能实现实时目标的公司来说。
Docker 的另一个主要问题是需要将有价值的数据导入 Docker 容器镜像,并将其保存在镜像中。由于容器通常是为无状态功能构建的,因此会丢失本要持久保存的数据(https://docs.docker.com/v17.09/docker-for-ibm-cloud/persistent-data-volumes/)。当这种情况发生时,就会变得非常麻烦。专家和经验丰富的开发人员总是警告不要将持久数据放在不应该放的地方,每次都敦促其他人“坚守阵地”。
比较 Docker 和 Heroku
在 Heroku 上部署 Docker
通过在 Heroku 的基础设施上部署 Docker,可以同时享受这两个领域的好处。Heroku 的平台简化了设置和部署,并且几乎没有风险。虽然与 AWS 这样的平台相比,在 Heroku 上部署的初始费用更昂贵,但是许多公司最终在 Heroku 上节省了资金,因为与其他平台相比,节省了所有在配置上要花费的时间。
在 Heroku 上部署 Docker 的优点包括:
- 开发环境和生产环境之间的差异更小。
- 更好地控制如何构建包。例如,如果你的应用程序使用了一门不使用标准 buildpack 的语言,那么你可以在 Docker 中构建它。
在 Heroku 平台上部署 Docker 的主要缺点是丢弃了一些 Heroku 的自动配置特性,承担了更多的责任。如果使用标准的 slug 编译器和默认的 stack,Heroku 将自动检查安全性更新,更新 stack,然后自动迁移应用程序。但是,如果使用 Docker 容器,Heroku 就不能这样做了,责任就落在了管理应用程序的人的身上。
哪些公司在使用 Docker 和 Heroku?
Docker 的客户
Docker 在 G2Crowd 上的评分是 4.4 分 (满分 5 分),共有 200 名用户做了评价。许多公司选择 Docker 以在容器中快速部署服务器环境,而不需要创建虚拟机。
ADP(https://www.adp.com/)——它使用 Docker 建立一个安全的软件供应链,为 113 个国家的近 4000 万活跃用户服务。
ALM. Brand(https://www.almbrand.dk/)——使用 Docker 企业版精简了它的 Oracle WebLogic 应用程序,并构建了新的应用程序。
ASSA ABLOY(https://www.assaabloy.com/)——ASSA ABLOY 是一家著名的锁具制造商,利用 Docker 企业版来加速其电子接口和锁具硬件的市场交付。
Baker Hughes GE(https://www.bhge.com/)——使用 Docker,将部署时间从 6 个月减少到 1 个小时。
GlaxoSmithKline(https://www.gsk.com/)——使用 Docker 企业版来加速药物配送模型和改进研究。
Visa(https://www.visa.com/)——Visa 利用 Docker 对其支付处理应用进行了重构,最终实现了 10 倍的可扩展性提升。
Heroku 的客户
Heroku 经常被初创公司和行业领导者选择,用于快速构建强大的可以快速发布的数据驱动应用程序。Docker 在 G2Crowd 上的评分是 4.3 分 (满分 5 分),共有 76 名用户做出了评价。
Altus Assessments(https://altusassessments.com/)——Altus Assessments 使用 Heroku 来运行成千上万的数据密集型测试。
SwimTopia(https://www.swimtopia.com//)——Heroku 帮助 SwimTopia 在高峰期无缝地伸缩。
SHIFT Commerce(https://www.shiftcommerce.com/)——使用 Heroku 电子接口并聚集硬件市场,使 SHIFT Commerce 的快速增长成为可能。
ClickFunnels(https://www.clickfunnels.com/)——ClickFunnels 运用 Heroku 灵活的数据服务抓住了增长的机会。
Moneytree(https://www.getmoneytree.com/)——Moneytree 专注于他们的业务,而 Heroku 负责数据安全和遵从性
DrivenData(https://www.drivendata.org/)——Heroku 为 DrivenData 的数据科学应用提供了一个安全的平台。
总结
Heroku 和 Docker 都是容器化的极佳选择。它们都可以运行各种语言的应用程序,包括 Java、Ruby、PHP 和其他语言。它们还提供了简单的可伸缩性和部署。
Heroku 和 Docker 之间的主要区别在于它们的实现。Heroku 和 Docker 都使用容器进行操作,容器是一个自包含的代码实例,包含运行应用程序所需的所有内容,包括代码、资源和工具。但是,Heroku 在它自己的 Heroku 部署流水线中提供容器。这使得 Heroku 非常容易配置,因为包、容器和环境整体上都已经为你配置好了。Heroku 非常适合希望无需复杂的配置即可在一个固定的环境中部署应用程序的新开发人员或者小公司。
另一方面,Docker 提供了一个容器化模型,它可以运行在各种各样的平台上,从内部服务器到私有云、AWS 甚至是 Heroku 环境本身。因此,与 Heroku 相比,Docker 在部署方面要灵活得多。然而,伴随这种灵活性而来的是更复杂的部署过程。