Docker适合哪些场景

in 互联网技术 with 0 comment  访问: 376 次

Docker怎么用

Docker不是万能的,我们不能够期盼在Docker容器中运行所有的东西。符合Heroku公司12要素风格的应用是最容易Docker化的,因为他们不维护状态。

推荐看看12要素,你会有收获的,官网有中文语言选择,可以看看,有时间后面我摘录分享出来。

在理想的微服务环境中,容器能在几毫秒内启动、停止而不影响集群的健康或应用程序的状态。

类似ClusterHQ这样的创业公司正着手实现 Docker 化数据库和有状态的应用程序,在当下,由于编排和性能方面的原因,可能继续直接在虚拟机或裸机上运行数据库是较好的选择。

对网络吞吐量有高要求的应用进行最佳优化时不要使用Docker,因为Docker使用iptables来完成主机IP到容器IP的NAT转换。通过禁用Docker的NAT来提升网络性能是可行的,但这是一个高级的使用场景,很少有团队会在生产环境中这么做。

docker官网上说明了docker的典型场景:

  1. 让应用快速打包与容易自动化部署
  2. 创建轻量、私密的PAAS环境
  3. 实现自动化测试和持续的集成/部署

根据这些特性,我们可以衡量评估一下,如果你的项目有如下痛点或者需求,那么可以去尝试去使用Docker

注意:事物都是有两面,并不是所有项目都适合docker化改造,而且任何的改动都有可能产生不好的影响,要对技术保持敬畏,需要全方位权衡。

遵循科学流程,《企业级容器云架构开发指南》中给出了一个改造流程,可参考:

改造之前,软件架构设计看看是否遵循如下原则:

  1. 倾向无状态服务,大部分服务都都需要保持无状态的。除了用于处理当前进行中的请求的临时信息,无状态服务不需要保持任何需要持久化的数据。无状态服务的优势在于可以非常容易地对他们进行销毁、重启、复制及伸缩,所有这一切都无需考虑任何数据处理方面的逻辑。并且,无状态服务更易于编写。
  2. 倾向静态配置。所有宿主机和服务的配置都是静态的:一旦给服务器推送一项配置,
    该配置就会一直生效,直至显式地推送来新配置。与之相对的是那些动态配置的系统,其系
    统的实际配置是实时生成的,并会根据不同因素(如可用宿主机和即将到达的负载)进行自
    主修改。尽管动态系统的伸缩性更好,并且具有一些有趣的属性,如在出现某些故障时自动
    恢复等,但静态配置更易于理解和排错。
  3. 倾向静态的网络布局。如果在一台宿主机中找到一项服务,除非新配置被确定并提
    交,否则总能在那台宿主机中找到该服务。
  4. 区别对待无状态和有状态服务。尽管我们希望多数服务是无状态的,按时还是会有MongoDB 和 ElasticSearch等数据库类型服务用来持久化数据。这两种类型的服务在本质上是非常不同的,
    应该区别处理。例如,将一个无状态服务从一台宿主机移动到另一台上非常简单,只需要启
    动新服务,然后停止旧服务即可。但要对一个数据库进行移动,数据也要跟着移动。移动数
    据可能会花费很长时间,要求在迁移过程中停止服务,或通过设备方法进行在线迁移。在开
    发领域,通常将无状态服务比做“牲口”,它们没有名字,很容易被代替和伸缩,而将有状
    态服务比做“宠物”,它们是唯一的、具名的,需要维护,并且难以伸缩。

以上这些设计原则,将有状态服务与无状态服务分离,可以对本质上完全不同的服务进行区别处理(如图3-1 所示),因此可以对每一种情况的处理方式进行优化和尽可能地简化。使用静态配置运行无状态服务使得操作系统的流程变得非常简单:多数情况下流程被简化成文件复制和容器重启,完全不需要考虑其他因素,如对第三
方系统的依赖。
15895588425762.jpg

Docker的优点

简化配置

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

代码可流水线管理

代码从开发者的机器到最终在生产环境上的部署, 需要经过很多的中间环境(开发-->测试-->beta-->线上). 而每一个中间环境都有自己微小的差别, Docker给应用提供了一个从开发到上线均一致的环境, 让代码的流水线变得简单不少。

提升开发效率

不同环境中, 开发者的共同目标:

  1. 想让开发环境尽量贴近生产环境;
  2. 想快速搭建开发环境。

开发环境的机器通常内存比较小, 之前使用虚拟的时候, 我们经常需要为开发环境的机器加内存, 而现在Docker可以轻易的让几十个服务在Docker中跑起来。

隔离应用

开发时会在一个台机器上运行不同的应用:

  1. 为了降低成本, 进行服务器整合;
  2. 将一个整体式的应用拆分成低耦合的单个服务(微服务架构)。

整合服务器

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

调试能力

Docker提供了很多的工具, 这些工具不一定只是针对容器, 但是却适用于容器. 他们提供了很多功能, 包括可以为容器设置检查点, 设置版本, 查看两个容器之间的差别, 这些特性可以帮助调试Bug。

多租户环境

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

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

快速部署

Docker为进程创建一个容器, 不需要启动一个操作系统, 时间缩短为秒级别。

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

Docker的缺点

Docker的安装非常容易.目前,Docker支持所有的Linux系列系统,(Ubuntu,RHEL,Debian等)。通过Boot2Docker虚拟工具 or 安装Docker Desktop, 在OS X 和 Windows下也能够正常使用Docker。
15895634489344.jpg

Docker运行环境的限制:

二进制安装参考: https://docs.docker.com/engine/install/binaries/

WeZan