Docker供应

从虚拟机背景来看,我一直使用configurationpipe理工具来configuration服务器(ansible,chef等)。 我在学习docker的过程中,我似乎只find人们使用dockerfile语法与shell命令configuration他们的容器的例子。

这是在docker做事情的首选方式,它有什么特别的优势吗? 或者是像docker一样,使用docker和ansible / chef就像使用虚拟机一样简单和有用?

我不推荐使用像ansible或chef这样的外部CM工具来创build图像。 作为一个简单的比喻,我将CM工具等同于翻新和维护旧家园,而容器每次使用时都会为您留下一个新家。 您始终知道容器的起始状态,而CM工具可能已经在未知状态的环境中运行,并且总是有可能出现您没有看到的错误。

Dockerfile语法用于定义图像,而CM工具用于转换整个主机的状态。 虽然他们有类似的目的,但不同的目标意味着你想使用正确的工具来完成这项工作。

对于图像,Dockerfile使您能够:

  • 指定一个基础图像
  • 将parameter passing给构build
  • 定义环境variables
  • 运行命令来更新文件系统状态
  • 定义图像在启动时默认运行的命令

我看到一些使用外部CM工具的方法,但是没有一个对我有意义:

  1. 作为Dockerfile中的一个步骤,但是只能replace上面列表中的“运行命令”,您可能会失去一些图层caching优势,并且在工具检查当前状态与目标状态时会失去一些性能。 由于您已经知道图像构build中的当前状态,因此检查过度。

  2. 通过扩展CM工具来构build图像。 如果他们存在,我从来没有使用过。 而他们最大的缺点是缺乏便携性和与其他生态系统的兼容性。

  3. 在图像启动时,作为入口点的一部分。 这将增加显着的延迟到开始图像和失去创造图像的价值。

目前,唯一看到CM工具填充集装箱环境的地方是确保Docker主机configuration正确。 除此之外,使用Dockerfile来定义图像,并使用编排器(Swarm Mode或Kubernetes)运行您的容器。

Dockerfile是“提供”或构build自定义容器的方式。 在Docker文件里,你基本上提供了容器将包含的内容,比如工具,代码等。

但是,您绝对可以使用厨师或者运行已经存在的docker图像。 但为了构build新的图像,您需要使用Dockerfile。

因此,诸如chef / ansible之类的工具可以帮助您configuration容器的运行方式,但是一旦您想构build或configuration自定义映像,就需要使用Dockerfile