我是Docker和配置管理工具的新手。

最初,我开始编写bash脚本来为开发机器配置Vagrant框,但是现在我切换到使用Chef以便可以使用相同的源来配置开发和生产尝试使它们尽可能相似的环境。

自从我开始使用Chef以来,我开始享受DRY方面的好处,不必在项目之间复制和粘贴shell脚本行,能够使用一个整合的源来配置运行各种linux发行版的计算机的能力,以及使用社区提供的菜谱的便利。当我在Dockerfile中添加RUN命令和后继shell命令时向后退一步,以实现仅通过运行Chef食谱即可实现的目标。只是错过了它),但似乎没有一种简单的方法可以使用厨师食谱来构建Docker容器。为什么会这样?

我知道容器是不可变的,并且配置管理工具通常在整个生命周期内用于重新配置机器,但是如果它们仍然提供很多好处,在容器的最初建造过程中使用过?

评论

在配置服务器/ docker容器/等之后,仍可以不变地使用配置管理工具来对其进行配置。然后,只需不更改配置并部署新的配置即可。同样,具有幂等性的近不变性。

@JamesShewey等幂并不意味着不变。必须滚动不可变的机器才能进行更新。

@MattO。对。但是您可以使用幂等配置管理系统来滚动不可变服务器。一旦卷起的机器恢复联机,配置管理系统就会将系统配置为最终的不变状态-安装软件包,设置配置文件并启动服务等。仅仅因为系统是幂等的,并不意味着它也不会是不变的。只是在决定对配置进行更改时是决定将其烧掉并重新部署,还是将更改推出并更新现有系统只是一个问题。

#1 楼

您需要的工具是Packer,使用Docker作为“构建器”,使用Chef作为“供应器”。然后,您可以将生成的图像添加到您的存储库中并重复使用它,而不必再次打包,直到您的配方更改为止。

#2 楼

这些策略彼此无关。

容器(如Docker)是一种用于部署和隔离应用程序的方法。容器很容易运输,因此备受青睐。在大多数情况下,它们都可以在本地开发和预览,因此将应用程序放入其中是有意义的。这是一个Linux操作系统,该容器的重点是尽可能轻巧高效。如果您开始添加Chef,Ruby,Erlang以及将Chef作为Dockerfile上的预配程序所需的所有其他库,那么您将消除使用容器的麻烦。计算节点。您的配置结束状态通常反映在代码中,并且具有用于维护状态的中央服务器。像vagrant之类的工具允许您使用Chef来配置Vagrant机器,这在很大程度上给开发人员带来了便利。尽管您可以在仅本地模式下使用这些工具中的大多数,但是它们的维护变得非常繁重。这些中央服务器用于自动整理版本控制和依赖性管理之类的东西。

Bash本质上不是退步。例如,许多构建完全不变的图像管道的组织都使用Bash构建其图像。这样可以确保稳定性和可预测性以及工程师之间的通用语言(许多工程师可能来自不同的配置管理背景)。

Immutable与Config Management。完全替换以便更新。配置管理意味着计算机的状态由代理或外部连接(例如与Ansible)维护。Docker容器本质上是不可变的。您不会在其上保留数据,必须对其进行滚动才能进行更新。