空心菜
读完需要
7
分钟
速读仅需 3 分钟
/ Docker 怎么用 /
Docker 不是万能的,我们不能够期盼在 Docker 容器中运行所有的东西。符合 Heroku 公司 12 要素 ( https://12factor.net/zh_cn/ )风格的应用是最容易 Docker 化的,因为他们不维护状态。
推荐看看 12 要素,你会有收获的,官网有中文语言选择,可以看看,有时间后面我摘录分享出来。
在理想的微服务环境中,容器能在几毫秒内启动、停止而不影响集群的健康或应用程序的状态。
类似 ClusterHQ ( https://clusterhq.com/ )这样的创业公司正着手实现 Docker 化数据库和有状态的应用程序,在当下,由于编排和性能方面的原因,可能继续直接在虚拟机或裸机上运行数据库是较好的选择。
对网络吞吐量有高要求的应用进行最佳优化时不要使用 Docker,因为 Docker 使用 iptables 来完成主机 IP 到容器 IP 的 NAT 转换。通过禁用 Docker 的 NAT 来提升网络性能是可行的,但这是一个高级的使用场景,很少有团队会在生产环境中这么做。
docker 官网上说明了docker的典型场景:
根据这些特性,我们可以衡量评估一下,如果你的项目有如下痛点或者需求,那么可以去尝试去使用 Docker
注意:事物都是有两面,并不是所有项目都适合 docker 化改造,而且任何的改动都有可能产生不好的影响,要对技术保持敬畏,需要全方位权衡。
遵循科学流程,《企业级容器云架构开发指南》中给出了一个改造流程,可参考:
改造之前,软件架构设计看看是否遵循如下原则:
以上这些设计原则,将有状态服务与无状态服务分离,可以对本质上完全不同的服务进行区别处理(如图 3-1 所示),因此可以对每一种情况的处理方式进行优化和尽可能地简化。使用静态配置运行无状态服务使得操作系统的流程变得非常简单:多数情况下流程被简化成文件复制和容器重启,完全不需要考虑其他因素,如对第三方系统的依赖。
/ Docker 的优点 /
1
简化配置
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件, 系统), Docker 在降低额外开销的情况下提供了同样的功能. 它能让你将运行环境和配置放在代码汇总然后部署, 同一个 Docker 的配置可以在不同的环境环境中使用, 这样就降低了硬件要求和应用环境之间耦合度。
2
代码可流水线管理
代码从开发者的机器到最终在生产环境上的部署, 需要经过很多的中间环境(开发-->测试-->beta-->线上). 而每一个中间环境都有自己微小的差别, Docker 给应用提供了一个从开发到上线均一致的环境, 让代码的流水线变得简单不少。
3
提升开发效率
不同环境中, 开发者的共同目标:
开发环境的机器通常内存比较小, 之前使用虚拟的时候, 我们经常需要为开发环境的机器加内存, 而现在 Docker 可以轻易的让几十个服务在 Docker 中跑起来。
4
隔离应用
开发时会在一个台机器上运行不同的应用:
5
整合服务器
Docker 隔离应用的能力使得 Docker 可以整合多个服务器以降低成本. 由于没有多个操作系统的内存占用, 以及能在多个实例之间共享没有使用的内存, Docker 可以比虚拟机提供更好的服务器整合解决方案。
6
调试能力
Docker 提供了很多的工具, 这些工具不一定只是针对容器, 但是却适用于容器. 他们提供了很多功能, 包括可以为容器设置检查点, 设置版本, 查看两个容器之间的差别, 这些特性可以帮助调试 Bug。
7
多租户环境
多租户环境的应用中, 它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为 IoT(物联网)的应用开发一个快速, 易用的多租户环境. 这种多租户的基本代码非常复杂, 很难处理, 重新规划以应用不但消耗时间, 也浪费金钱.
使用 Docker, 可以为每一个租户的应用层的多个实例创建隔离的环境, 这不仅简单而且成本低廉, 因为 Docker 环境启动的速度快, diff 命令很高效。
8
快速部署
Docker 为进程创建一个容器, 不需要启动一个操作系统, 时间缩短为秒级别。
可以在数据中心创建销毁资源而无须担心重新启动带来的开销。通常数据中心的资源利用率只有 30% , 通过使用 Docker 并进行有效的资源分配可以提高资源的利用率。
/ Docker 的缺点 /
Docker 的安装非常容易.目前,Docker 支持所有的 Linux 系列系统,(Ubuntu,RHEL,Debian 等)。通过 Boot2Docker 虚拟工具 or 安装Docker Desktop, 在 OS X 和 Windows 下也能够正常使用 Docker。
Docker 运行环境的限制:
二进制安装参考: https://docs.docker.com/engine/install/binaries/