docker只有运用于从研发到运维的完整实践才能发挥最大价值,这个系列我想尝试举一些我自己熟悉的软件技术栈,讨论在这些技术中怎么用docker
使用Docker先要理解docker,这里列出几条基本原则,详细讨论请参考我写的《docker为什么》
-
环境一致:开发、测试、线上运维使用同样的image,以确保环境一致
-
对开发环境友好:各种开发工具本身有很多独特的价值,为提高生产力提供重要帮助,因此对开发环境的各种工具应当基本没有限制或者仅有很少的限制,不因为引入Docker导致常见工具集不可用
-
整合基础设施:Docker的引入,对研发基础设施必然有冲击,但是这种冲击应当是可预见的,另外,有可能简化对测试和运维需求
结合上述原则,对开发活动来说,主要就是要把环境这件事在开发环节就搞定,下面提出开发活动需要注意的要点。
-
构建前移:开发工程师负责直接构建image
我们把
构建
活动定义为生成docker image的过程,建设构建系统的目标不再是为了保证环境一致,而只是为了让源码版本与构建版本产生关联。原则上,由开发环节直接交付image必须和构建系统生成的内容一致 -
实验性
-
权限放开:所有的container内部都使用root来执行,不再设定运行特有的OS用户
限制运行服务的用户权限是为了避免多用户OS环境中提升权限破坏安全模型,container本质上是一个单用户系统,因此不必区分应用用户和root用户,所有的安全手段通过对container的限制来实现
程序员学习新技术时处理环境问题往往都不太容易,原因是不了解新的工具链对现有环境的影响,一个不小心就会对现有环境有所破坏,自己又往往不知道。
有鉴于此,有些工程师试图使用虚拟机来解决这个问题,基本思路是,学习一门新的技术,就专门搭建一个新的虚拟机,一切动态库,语言包,或者是编译、链接、打包工具链,都在这个虚拟机中完成,实践下来,这个是很有效的办法,唯一的缺点就是虚拟机的环境成本太高。
Docker可以延续这种思路,但是能避免其缺点。