Docker成功的基础
- Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明显优势。Google大规模容器集群的性能比传统虚拟机也要高很多,接近bare Metal。与传统虚拟机相比,容器集群让公司拥有秒级别而非分钟级别的弹性计算伸缩能力,同事使用更少的机器运行更多实例。
- Docker的优势:Docker首次创造了一种简单容易运行的并且覆盖应用全生命周期的工作流,用户可以通过简单指令或者Restful API来拉取,打包,运行,维护容器。这种简单化从根本上降低了应用程序不是的难度,极大提高了应用运行时环境的不是,维护的效率。用户可以不依赖类似Ansible, Chef,Puppet这类的配置管理和发布系统,不需要再部署中同事光之基础系统与软件的安装配置,以及应用的安装调试。
- Docker提高统一实践方法,每个服务(或应用)维护一个Dockerfile文件,即使用编排工具如Docker Compose,一个服务(或应用)也只需要维护一个docker-compose.yml文件。应用程序及其运行时环境全部打包到一个简单易读的Dockerfile或者Compose文件,开发团队和运维团队可以透明的合作维护这个文件,极大降低了沟通成本与部署成本,极大满足了研发团队与DevOps(开发运维一体化)团队,运维团队之间的沟通需求,清晰划分了责任边界。
研发人员眼中的容器
- 快速上手新的技术:新技术起点都是从Demo开始,学习新系统标准思路:最小系统原则,从变量最少的系统开始,循序渐进的学习
- 通过Docker使用,用户可以将精力和注意力都尽可能放在语言本生学习上,而无需折腾系统环境的各种配置。Docker官网口号就包含了以上含义:Build,Ship and Run Any App,Anywhere,即任何应用都可以构建,发布,运行与任何环境,Docker将环境的影响因素降至最低,使开发者能统一的掌握整个应用的生命周期。
容器化的代码仓库
- 我们可以将平时积累的特定功能化的Docker容器提交到自己的容器仓库中,这样在接新的系统时候,可以快速规划所需要的资源,并在最短时间内利用积累的模块搭建起系统,从而可以快速完成任务,另外研发过程中的各种发布版本,也可以用Docker容器的方式保存,以后遇到类似需求,可以直接运行,调试并且复用代码。
面向业务编程
- 开发工作中,除了算法之类,在本质上是解决业务问题,满足需求方的要求。所有能快速掌握新的业务需求和新的技术栈,是对一个有效技术人员迫切的要求。
- 使用Docker快速掌握新技术要点并完成适当的技术储备。假定读者是Python技术栈后端,实现网站后台的建设,那如何快速实现移动应用的Restful Api Server? 我们可以利用Docker Hub搜索适合作API服务的Python快速开发框架,更具自身业务需求修改Dockerfile,订制符合要求的镜像,然后快速启动一套能满足相关API的系统。
容器化开发模式
- 传统模式:开发团队在开发环境完成软件开发测试,本地完成单元测试,测试通过,则可提交代码到git管理仓库。测试团队打包进行测试。运维吧应用部署到测试环境,安抚团队或者测试团队再次测试,没问题后运维或者部署人员发布到生产。
- 上述过程涉及到三个环境:开发,测试,生产,以及三个团队:开发,测试,运维。多个环境和多个团队之间的交互。容易出现彼此环境的不一致情况造成的各种问题。
- 容器模式下,应用是以容器形式存在,所有和该应用相关的依赖都会在容器中,因此移植方便,不存在像传统模式那种环境不一致的情况
- 以下比较两种流程图,左边为传统开发流程,右边容器化开发流程
操作流程
- 容器化应用中,项目架构师或者PM和开发人员的作用贯穿整个开发,测试,生产三个环节。
- 首先,架构师或PM根据项目预期创建好需要的基础base镜像,例如nginx,tomcat,mysql镜像,或者将Dockerfile风发给所有开发人员,所有开发人员根据Dockerfile创建的容器或者从内部仓库下载镜像进行开发,达到开发环境的充分一致。若开发过程中需要添加新软件,执行要在base镜像的Dockerfile添加修改即可。
- 接着开发结束后,架构师调整Dockerfile或者Docker镜像,然后风发给测试部门,测试部门马上可以进行测试,消除部署困难等难题。
- 例如,用java开发语言,使用Tomcat, Weblogic作为中间件服务器,后台数据库使用Oracle,Mysql等容器开发之前开发到测试的流程如下图,
- 容器化之后开发,测试,运维工作流程如下图:
注意事项
- 开发测试环境,推荐使用-v共享文件夹来存储开发人员的代码,避免频繁打包
- 利用基础base镜像继承特性调整镜像的轻微变更。例如当使用程序对不同版本JDK支持,只需修改base镜像JDK设置,之后其他依赖的镜像重新创建过程中就可以自动完成更新
小结
- 以上基于公司之前使用Docker Compose实战中的一些思考,持续交付注重的是效率。一直研发流程上最让人抓狂的是研发周期的管理。无论传统模式还是款速迭代,瀑布流,都需要有完善的代码周期支持。容器化正好契合了这一需求,为产品研发带来了生产力的提升。