第3页
CODING 与 DOCKER
• 所有服务都在用 Docker Container 运行。 • 维护自己的私有 Registry 基础镜像,供开发和生产使用。 • 参与 Upstream 开发, 提交多份 Issue / Patch • 自研了生产环境容器编排系统
第4页
DOCKER: THE GOOD PARTS
第5页
DOCKER: SELF SUFFICENT PACKAGING
第6页
DOCKER: EASY APP DISTRIBUTION
第7页
DOCKER: UNIVERSAL API
第8页
DOCKER: COMMON INFRA
第9页
PACKAGING
DISTRIBUTION
DOCKER
RUNTIME
ORCHASTRATION
第10页
DOCKER: THE BAD PARTS
第11页
鸡肋的 DOCKER IMAGE
一个不那么圆的轮子
第12页
DOCKERFILE 真的有用吗
• FROM 的问题
• 基础镜像没有一个靠谱的
• Debian, Ubuntu, 还有 Centos/Fedora 基于什么的都有
• Hub上到处是雷和Abandon-ware • 新一代的 copy & paste 大法
第13页
DOCKERFILE 有用吗
• RUN 的问题
• apt-get update –y && apt-get upgrade –y • 每句加一个layer, 轻松来个十几G的镜像 • 没完没了的等,继续等,使劲等
第14页
DOCKERFILE 有卵用吗
• CMD / ENTRYPOINT 的问题
• 这俩居然也占layer, 服了. • 编译产生的垃圾谁负责?代码谁负责清理? • 有必要把运行命令写死在镜像里吗.
第15页
CODING 实践 1: BUILD & PACKAGE
接口比实现重要一万倍
第16页
BUILD
• 所有主流编程语言都已然实现了编译和打包工具
• 大约一万遍
• 依赖管理就不是个问题
• Vendoring, 自包含镜像,等等,除非姿势不正确。
• 接口统一
• 实现自己写去
第17页
PACKAGE
• 暂时还是先用 Docker Image
• 随时也可以改
• 正确的 Dockerfile 只有三行
• FROM base20151030:jre8.20u • ADD app.jar /app • CMD [ “java” , “-jar”, “app.jar” ]
• 其实也可以只有两行
第18页
废柴的 DOCKER REGISTRY
勉强凑活用,因为实在不重要
第19页
REGISTRY 的作用
• Over-engineering 的FTP • API, 客户端 library 也不那么完善 • 实在排不上优先级去折腾,先凑活用吧
第20页
坑爹的 DOCKER RUNTIME
小姐的身子,丫鬟的命
第21页
DOCKER DAEMON 大坑实录
• docker container 在 stdout/stderr 有大量数据传 输会导致内存泄露,直至 docker daemon OOM
• docker daemon 在频繁创建 container 后,会在 文件系统中遗留很多垃圾文件不清理,导致磁盘 inode 被耗尽
• docker 里面没有init, daemon也没有reap子进程 fork 很多进程,会在系统中出现很多僵尸进程,最终 导致 docker daemon 出现问题。
第22页
CODING 实践 2 去其糟粕,取其精华
没有卵用的花哨、前沿功能,一律不用
第23页
CODING 的容器配置
• 单进程, 微服务,没必要那么多限制
• trust-cooperative 环境,我们不是IAAS
• Host 网络模式
• 不趟SDN, proxy这样的浑水/雷区,性能也不受影响
• host上数据持久化
• 未来可能可以考虑data container, 但是然并卵 • 直接 mount Host locale, timezone, passwd 等配置.
第24页
不存在的 DOCKER 编排系统
Swarm, K8s, Mesos
第25页
神仙打架,百姓遭殃
• Swarm, kubernetes, Mesos
• 都处于早期,步子迈的太大。
• 动态伸缩的需求有,但是没那么大
• 静态、手动的资源分配 • IAAS 也降低了对这个的需求。
• 对 docker 容器的直接接管能力都不行.
• 需要的功能都没有,没用的烂事一堆
第26页
CODING 实践 3 工具、实用、半自动
把有限的精力花在最需要的功能上
第27页
代码化的生产环境
• 记录什么东西跑在什么机器上 • 常用属性的的管理 • Jobs/Tasks 抽象层 • 集群可复制
第28页
半自动化操作
• ./coding-job up coding-mart
• 自动使用标准配置启动一个容器
• ./coding-job down coding-mart
• 自动干掉这个容器
• ./coding-job status coding-mart
• 监控容器的状态,内存等
第29页
高级自动化操作
• 执行 update 操作,会列出当前的 image 列表,选择后就可 以进行全自动更新。
第30页
未来还准备做的功能
• ./coding-job diff
• 在真的更新之前,先看看改了什么
• ./coding-job rolling-update
• Job/Tasks 抽象层可以帮助很快的批量操作一个服务
• ./coding-job web
• 方便网页化, 可以看 status, log, 甚至远程 shell 功能
第31页
CODING 实践总结
喊一些口号
第32页
三个关注点
• 软件架构的升级
• 微服务、无状态、数据执行分离
• 研发体系、环境管理理念的升级
• 容器化、代码化、自动化
• 资源管理理念的升级
• Pet Vs Cattle • 多留点富余量,迁移能力比压榨能力更重要
第33页
开发环境:定死接口,放手实现
第34页
生产环境容器化:关注三个重点
第35页
DEVOPS 切身实践
代码化
工具化
自动化
第36页
BUILD PACKAGE
RUN
可复制 挪的动 打成包
Q&A
代码化 工具化 自动化