第1页
Docker 架构私有云的机遇和挑战
• 王振威
第4页
内容梗概
• 关于 Docker • 为什么变迁 • 架构变迁三步走 • Docker 的问题
第5页
Docker ? 私有云?
• Docker :一门新兴的容器技术 • 私有云:企业内部云服务平台
第6页
Docker 为什么适合?
• 构建快:应用+运行环境 = 镜像 • 启动快:容器相比于虚机,更轻量级 • 迁移快:应用以容器的方式标准化交付,标
准化运行
第7页
看下我们的架构图
第9页
事出有因
• 混乱的环境: Java, Golang, Ruby • 混乱的配置:Upstart, authorized_keys,
dependency,各种脚本 • 混乱的监控:ErrorReporter,Message • 混乱的资源:计算资源与预估不匹配
第10页
有因必有果
• 环境不匹配导致,测试跟生产不一致 • 配置混乱导致事故频发 • 监控不统一导致运维难上加难 • 资源效率低导致成本很高却达不到相应目标
第12页
DevOps 变迁原则
• 即面向未来,又不过于激进 • 即追求稳定,又不过与保守
第13页
我们团队的做法
• 技术选型
OS
Container
Service Discovery
Config Container Management
Windows/Ubuntu/CentOS/Redhat/Ubuntu Rocket/RunC/Docker Consul/Etcd JSON/INI/YAML
K8s/Mesos/Swarm/Compose/None
第14页
架构变迁三步走遵循要点
• 平滑演进,向后兼容 • 微服务,无状态化 • 多实例,硬件分离
第15页
第一步:Dockerize
• 无状态化应用 • 构建脚本和
Dockerfile • 装入容器
• 无状态化你的应用
• 编写应用构建脚本和 Dockerfile
• 把应用装入 Docker 容器
第16页
最简单的 Dockerfile
# Base FROM java:jdk-7
COPY ./.src/target/app-1.0.jar /app/
# ENTRYPOINT WORKDIR /app CMD [ "java", "-Dfile.encoding=UTF-8", "-jar", "./app-1.0.jar" ]
第17页
第二步:管理你的容器
• (更直接) docker run / start / stop / restart
• (更灵活) docker remote API • (更强大) 编排系统
第18页
管理工具的选择
• conf 文件配合 docker remote API • 根据实际情况,选择 docker 的一些特性,
例如文件系统,网络模式,资源限定等 • 编写便捷的操作工具 cli / web
第19页
配置示例
第20页
更新命令操作示例
第21页
DockerUI 界面
第22页
第三步:釜底抽薪
• 即使用 dockerize 的容器逐步替换系统中所 有基础
• 包括,监控系统,负载均衡系统,服务发现, 日志中心,消息中心等等基础业务组件
• 使计算存储分离,多实例,高可用,等这些 概念有机结合
第23页
替换监控组件示例
第24页
形成如下架构
第25页
一些细节
• LB 系统: Nginx / HAProxy / confd / Etcd
• 监控系统: Prometheus / cAdvisor / Http Metrics
• Docker Registry V1 • Docker 网络:Host • Docker 日志:Mount 宿主机
第26页
Prometheus报表示例
第27页
架构的发展方向
• Job-Tool 进化成 Job DashBoard ,集成监控 (cAdivsor),日志(ELK)等功能
• 利用监控系统的硬件指标,根据业务用量实现自 动扩容,缩容
• 分析各个业务对硬件资源的使用量和高低峰,设 计混布实现提升硬件使用率
• docker image 的构建和管理 • 动态调整 container 的资源限制
第28页
Docker 的问题
• Docker Image: 食之无味,弃之可惜 • Docker Daemon: 这货管得事太多了, 还相
当危险 • Docker Net: 容器就是容器,不是虚拟机 • Docker Logs: syslog 和 jsonlog 都不尽如
人意
第29页
Docker 的坑
• Docker 1.9.1 版本以下,容器标准输出输出大量 数据,会导致内存泄露,从而导致 Docker Daemon crash
• Docker Daemon 在频繁创建删除容器(每天几 十万个)会出现性能严重下降等问题,只能重启 Docker Daemon
第30页
标准输出问题
• 必要条件一:输出数据量大 • 必要条件二:输出数据快 • 必要条件三:输出被 Attach
第31页
标准输出问题
• 重现方式一: docker run ubuntu yes “something long”
• 重现方式二:docker run -i ubuntu dd if=/dev/zero of=/proc/self/fd/1 bs=1M count=1000
• Issue: https://github.com/docker/docker/issues/14460
• Fix By: https://github.com/docker/docker/pull/17877
第32页
并发性能问题
• 测试环境比较复杂,还在进一步研究中,欢 迎各位共同研究
第33页
Q&A