近日在迁移应用到docker的过程中,纠结于配置和日志处理,查阅了网友关于此的讨论,有所认知,请批评指正。 以下认知,均是基于测试/生产环境,不涉及开发环境。
关于配置
通过几个开源项目(wordpress,MySQL)的官方镜像处理方式,来窥探一下关于配置参数的处理手法。
- 通过“环境”传递配置参数到容器。
- 容器内通过ENTRYPOINT指令配置的脚本接收环境变量,并按格式写入配置文件。
- ENTRYPOINT脚本通过exec指令启动CMD指令。
观点
$
- “环境”是传递数据到容器内应用程序的常规手法,但数据项太多时,会给维护造成困扰。
- 通过“ENTRYPOINT”指令配置的脚本,完成配置的初始化是一个合理的选择。
- 配置初始化。实践中,配置项往往规模较大,被集中管理(zookeeper/etcd),需要区分部署的环境(测试/生产)。在此场景下,将“部署环境标识”通过“环境变量”传递到容器,在容器启动时,通过entrypoint脚本根据“环境标识”和“应用程序配置项需求”(应用程序一般会有关于配置的schema文件,描述了需要哪些配置项),从配置管理设施中获取配置数据,完成配置的初始化后,启动应用程序。
- 配置项变更。配置项的变更一般涉及两项:如何捕获这些更新(watch配置管理设施,由谁来watch?),以及如何让新配置生效(一般意味着进程轮换,如nginx;或者php项目中清理apc缓存)。 在docker场景下,应当使用能与编排工具通信的设施负责捕获变更,并将变更转换为与镜像相关,提交给编排工具,由编排工具启动新容器轮换掉老容器,完成配置生效。 那些企图在容器内部捕获配置变更,然后使配置生效的处理手法,不符合docker的设计精神,而且往往复杂度高 。
关于日志
《 使用 Fluentd 管理 Docker 日志 》一文对docker日志的讨论,受益匪浅。
观点:
$
小结
容器的启用和销毁的成本低,在生命周期管理上,往往通过容器的轮换来处理一些原来需要精细化控制的细节,如果照搬主机的处理模式,会很难受,且格格不入。
参阅
- 一种Docker化应用程序的简单方法
- 使用 Fluentd 管理 Docker 日志
- 容器里Nginx、MySQL的配置文件、日志是否应该挂载到宿主机上
- 请教下代码放在Docker里面还是外面呢