前段时间我尝试过 DevOps 中的 Ops 部分,感觉挺好玩的,但我没有时间和理由在任何项目中尝试它。但上周我开始了新工作,老板问我是否可以配置服务器来为公司项目创建类似暂存环境的东西。与此同时,我开始考虑将项目迁移到更多的 DevOps 而不是只有开发。
我推出了 Docker,它对我来说非常棒,而且超级简单。但前段时间我在尝试 Puppet,于是问题浮现在我的脑海里:“有什么理由将 Puppet 与 Docker 一起使用吗?”Docker 似乎可以做 Puppet 能做的所有事情,但方式更简单。
附言 前段时间 Hacker News 上有一篇文章领事这是很好的配置和服务发现,所以甚至配置也可以解决(我也正在考虑实现这一点)。
答案1
Puppet 和 docker 可以做很多相同的事情,但是它们采用不同的方法。
Puppet 管理文件 + 包 + 服务。(称为三重奏)。Docker 将二进制文件和配置文件封装在容器内。
在撰写本文时,docker 仍然不稳定,不应在生产中使用。在 1.0 版发布之前,许多 API 可能会发生变化。
即使 docker 变得稳定,将每个进程和配置文件转换为 docker 容器也是一项艰巨的任务。
另一方面,Puppet 是一款稳定的产品,并配备了完整的工具生态系统(heira、mcollective、facter、razor)。这些工具可以快速实施,无需担心出现问题。
我强烈建议以下资源。
有关如何使用 Puppet 管理应用程序堆栈的视频
https://www.youtube.com/watch?v=KSo_mcJxFIA
关于 Docker 和 Puppet 如何协同工作的播客
http://devopscafe.org/show/2014/1/23/devops-cafe-episode-46.html
一篇关于如何与docker集成的puppet博客文章
http://puppetlabs.com/blog/building-puppet-based-applications-inside-docker
另一篇关于 puppet 与 docker 共存的博客文章
http://puppetlabs.com/blog/can-containers-and-configuration-management-co-exist
用于与docker交互的puppet模块
http://docs.docker.io/use/puppet/
对 DevOps 术语进行了小幅修正。Devops 更像是软件开发方法开发人员和运营人员在此进行合作,而不是使用任何特定的工具。
更新
目前我的公司同时使用 puppet 和 docker。这是在 2014 年 puppet conf 上发表的关于为什么要使用 puppet 而不是 docker 的精彩演讲。演讲者是 puppetlabs 的前雇主兼 docker 书籍作者 James Turnbull。
https://puppetlabs.com/presentations/using-docker-puppet-james-turnbull-kickstarter
sysadmincasts.com 还提供了一个很好的关于 docker 的简短视频教程
https://sysadmincasts.com/episodes/31-introduction-to-docker
Docker 优点:
- 可以快速启动实例
- 比 puppet 更容易学习
- 轻松实现零停机
Docker的缺点:
- 使用 devicemapper 后端时,容器有 10GB 的限制
- 微小的配置更改需要很长时间来重建容器
- 使用 hub.docker.com、quay.io 等 Docker 注册表需要花钱(自托管 Docker 注册表漏洞百出,而且没有 GUI)
- 没有合适的初始化系统。某些应用程序无法正常运行。
- 缺乏对网络的细粒度控制
- 需要子 shell 的应用程序(比如 RVM + ruby)很难正常工作
- 无法管理 Windows 主机,没有 SLES 或其他不太流行的操作系统
- 目前,docker 编排还很年轻。
- 目前无法在构建时设置 /etc/resolv.conf
- 我们必须挂载 /etc/localtime 和 /dev/urandom 来映射到主机的 localtime 和 urandom 目录的各种错误。
- 性能不够快(尽管都说docker的速度应该是裸机的99%,但有时候它比其他机器慢30%)。
- 小容器也有几百兆的开销,我们的容器都是几千兆的。
Puppet 的优点:
- 易于扩展
- 适用于现有服务器(windows、linux、sles)
- 快速做出微小改变
- 其他 Puppet 用户和模块的强大社区
- 用于在所有平台上安装软件包的标准化 API
Puppet 的缺点:
- 大型基础设施变得非常复杂
- 条件模块依赖关系创建意大利面代码
- 更重的重量
目前我们使用 puppet 来配置我们的 docker 容器。docker 容器用于 jenkins 构建,每次构建后都会被销毁。它运行良好,为我们提供了一致的环境。这意味着我们只需要编写一次代码,然后重建 ubuntu、sles 和 centos 机器。重建容器大约需要 15 到 30 分钟,而且仍然是一个手动过程。Docker 非常适合启动快速测试虚拟机,
简而言之,puppet 非常适合管理您现有的基础设施。如果您拥有 100% Linux 的绿地,并且技术堆栈可以封装在小型临时实例中,那么 Docker 就是您的理想选择。虽然某些功能重叠,但它们并不相互排斥。
答案2
Docker 可帮助您配置和初始配置容器,但它在容器初始化时运行一次性命令。
Puppet 在作为守护进程运行时是最强大的,它可以确保你的配置停留正如您指定的那样,例如,如果您的服务停止运行,它将重新启动它。
关于(正确设计的)Puppet 配置清单的最好的事情之一是它们幂等;它应该描述你想要达到的状态,而不一定是达到该状态的步骤。
它还允许您抽象和参数化配置,您可以导出参数在一个服务器或容器上创建并在另一个服务器或容器中使用它们(例如,为监控应用程序收集节点主机名列表)。
我想说它们肯定有不同的但相关的用途。我目前正在考虑使用现有的 puppet 清单来开始配置容器,以便开发环境更像生产环境。