编者按:Docker作为近几年来最受欢迎的开源技术,操作简单是其迅速能流行起来的原因之一。写个Dockerfile,在本地build成镜像,就能很快地运行起来。但那是对于个人开发者来说,对于公司或组织来说,在生产环境中应用Docker并不容易,本文将为你细数在生产环境中应用Docker之前,需要做的关键决策。以下为译文:
>>>>
关键决策1:镜像管理
在开发环境中,写一个Dockerfile或docker-compose.yml文件来构建镜像是很简单的事情,但在生产环境中,你应该创建一个可持续的流程来构建Docker镜像文件。这会减少对本地环境的依赖,同时避免开发笔记本成为唯一构建新镜像的手段。还能让你创建一个从代码提交到Docker镜像的持续部署的流程,这个流程还不需要任何人为的干预。
你可能还需要一个私有的Docker镜像仓库。虽然Docker提供了私有的镜像仓库,你可以去部署和管理,但限于国内的网络环境,用起来会很不爽。
>>>>
关键决策2:云的选择
大部分自建Docker生产环境的用户,也还是要把Docker部署到IaaS上。虽然目前许多IaaS都支持Docker容器的部署,但是大部分的资源消耗都超出了容器实例本身所需的资源,在最开始做好价格的调查很重要。
还要注意在不同平台的容器部署流程也不尽相同,如果未来想更换云服务商会比较麻烦。如果你希望采用多个云避免被lock-in,还需要做一些额外的方案来保证流程的一致。这样考虑的话,选择一家CaaS服务更能直接达到目的。
>>>>
关键决策3:网络访问和安全
在本地开发环境中跑容器,是不会产生安全风险的。所有的进程跑在单一的主机上,可以将常见的针对生产环境服务器的网络入侵和攻击的风险隔离在外。
为了方便在开发过程中的故障检修,开发的配置是很开放的。而在生产环境中的网络设置需要更多的考虑。比如,一些特定的容器是不能被公网访问的,只能被一个私有网络中的其它容器访问。网络流量监控,暴力破解等攻击方式应该都能被识别出来,并能得到适当的处理。
你还需要时刻关注新发布的安全包,决定你的主机和容器是否安全,或者是必须安装的。将容器投入生产环境时,需要考虑网络访问,还有你的容器和Docker主机是不是打了补丁,不要忽略了生产环境的关键步骤。
>>>>
关键决策4:容器和主机间的负载均衡
一旦服务从一个单独的容器迁移到跨主机的多个容器上,就会有负载均衡的需求。使用类似Nginx或HAProxy的工具是最常用的做法,但要随着容器的创建和部署,以及新的Docker主机的添加,保持配置的更新是很难的。
注意!要支持多版本同时运行,除非你计划在升级时,离线部署应用。你的负载均衡策略要考虑到这一点,防止掉线或者网络被路由到错误的版本。
>>>>
关键决策5:部署流程
许多开发者都认为:在开发环境中用起来没问题的工具,在生产环境中用起来肯定也没问题。但情况并不是这样的,比如Docker Compose在开发和生产环境配置就大相径庭,从volume绑定到端口绑定和网络配置都不一样。在多主机的环境下,复杂度会更高。另外,生产环境中还会有很多开发环境之外的容器,比如日志收集,外部数据库,和HA消息代理等。
协调环境配置的差异需要很多脚本的工作,它不像在生产环境中一行docker-compose up这么简单。从一个简单的,单容器的应用到多个容器,通过负载均衡器分担workload的环境中,要事先做好各种细节的考虑。随着应用的成熟和流量的上升,滚动升级(rolling upgrade)和蓝绿部署(Blue-green deployment)的策略都可以预防网站宕机。
>>>>
关键决策6:服务发现
随着容器数量的增长,管理这些容器的成本也在增加。许多工具可以管理这个过程,大部分需要被集成到你的Docker生产环境中。不管选择什么都要保证服务注册和容器实例的同步,以及容器被部署到多个Docker主机上时的负载均衡,这样做可以保证你的应用被路由到特定的容器实例。
>>>>
关键决策7:日志管理
在开发环境中使用DockerCompose会让日志变得琐碎,跨主机的多容器环境会让情况变得更复杂。分布式日志可以将多个服务器中的日志汇总起来,你的生产环境基础设施需要跨容器的日志收集器。还需要提供相应的查看和搜索这些日志的功能。
>>>>
关键决策8:容器监控
在生产环境中对容器的监控相当重要,从Docker主机到容器,你需要知道每个服务和整个系统的健康状况。选择正确的工具和监控策略,可以减小宕机带来的损失,还能最大化的利用主机资源,保证良好的用户体验。
>>>>
关键决策9:数据库管理
开发环境中,数据库可以跨容器托管,不用担心I/O性能。在生产环境中,这个问题就不容忽视了,尤其是当我们的应用有很高的用户体验需求时。扩展数据库来按需处理I/O的增长,以保证高可用性和可靠的备份/存储策略,是保证现代web应用和移动APP运行的关键。选择生产环境的策略会对你的用户产生积极或消极的影响。
>>>>
以上缺一不可吗?
是的!以上都是产品成功不可或缺的要素,除非你在部署一个流量不大的,不重要的应用。要记住,Docker只是一个工具,并不是一个产品化的架构解决方案。Docker提供了很多令人『惊艳』的功能,但想在开发环境中使用Docker,要付出的努力并不亚于其它工具。
如果你的核心并不在这些技术,而是业务,建议选择一家CaaS供应商,而不是自己搭建整个Docker生产环境。(比如灵雀云)
via:http://www.alauda.cn/2016/07/20/production-docker/