如何使用Vagrant、ansible和docker使Linux开发人员的机器尽可能接近生产

如何使用Vagrant、ansible和docker使Linux开发人员的机器尽可能接近生产,docker,vagrant,ansible,Docker,Vagrant,Ansible,很抱歉没有明确的标题,这是我想要实现的 使用docker运行我的web应用程序(一个容器用于数据库,一个容器用于缓存,一个容器用于php fpm+代码) 在生产中,由于我没有流浪者,我希望标准ansible与docker模块能够提供环境 由于我的开发人员拥有linux机器和vagrant support docker作为提供商,我希望这些docker容器在没有VM的情况下直接在我们的开发人员机器上运行(因为我们有很多项目,每个项目保留一个VM很快就会耗尽RAM,我们需要经常停止/关闭机器,特别

很抱歉没有明确的标题,这是我想要实现的

  • 使用docker运行我的web应用程序(一个容器用于数据库,一个容器用于缓存,一个容器用于php fpm+代码)
  • 在生产中,由于我没有流浪者,我希望标准ansible与docker模块能够提供环境
  • 由于我的开发人员拥有linux机器和vagrant support docker作为提供商,我希望这些docker容器在没有VM的情况下直接在我们的开发人员机器上运行(因为我们有很多项目,每个项目保留一个VM很快就会耗尽RAM,我们需要经常停止/关闭机器,特别是在维护阶段)
  • 我们在Mac/Windows上有一些开发人员,所以我们仍然需要vagrant来提供抽象层“vagrant up”,以创建一个简单的开发环境
我知道如何为一台机器和一台机器使用“流浪者+易变供应” 我知道如何将ansible与docker模块一起使用,以按照中的示例创建完整的环境

但它将在虚拟机中运行

我知道如何使用Vagrant在一个Vagrant文件中创建多台机器

Vagrant.configure(2) do |config|
  config.vm.define :dbmachine do |dbmachine|
    dbmachine.vm.provider = "docker" do |d|
       ...
    end
  end
  config.vm.define :cachemachine do |cachemachine|
    cachemachine.vm.provider = "docker" do |d|
       ...
    end
  end
end
但是在生产/阶段,因为我没有vagrant,所以我不再有描述体系结构的东西

那么,有没有办法将这些东西结合起来以满足我的需要呢?

请注意:

  • 并非所有组件都需要固定。例如,您的数据库不是经常发布新版本的数据库。而这并不是你会在运行中添加更多实例或减少的事情。其他组件缓存/代码等可能是很好的停靠候选者。免责声明:

  • 流浪汉和码头工人是替代品。你应该使用其中一个,而不是两个。Vagrant构建了一个完整的虚拟机(在VMWare/或virtualbox等平台上),docker构建了一个轻量级虚拟机(称为容器),旨在全心全意地运行一个进程。在接下来的几点中,我假设你更喜欢使用docker而不是vagrant
  • Mac/Windows开发者最好使用Docker for Mac和Docker for Windows在他们的开发者机器上安装应用程序。它可以运行docker容器。我建议在virtualbox中使用一个完整的linux虚拟机,可以在上面运行ansible和docker。(您可以在这里使用vagrant自动安装带有ansible和docker的linux虚拟机,但它只适用于正在虚拟机上工作的mac和windows开发人员。)
  • 使用而不是使用文件来构建/描述应用程序的环境。如果您更喜欢ansible剧本,而不是dockerfile,dockerfile基本上是shell命令,那么您可以使用ansible来设置docker容器。好吧,它们是做同样事情的两种方式——但是ansible确实有更好的语法和特性。在Dockerfile中调用ansible playbook以获取“资源调配任务”。在为“部署任务”构建容器之后,您还可以调用另一个ansible playbook。厨师也是ansible的好选择
  • 要使用ansible,您需要在非开发(qa/prod)环境中使用一台控制机器和一组目标机器。Ansible将能够通过SSH连接到目标机器,并启动docker容器。如果您编写了一个用于停止容器、提取最新图像并启动它的剧本,那么您就有了一个很好的自动化部署过程。在devbox本地,您可以通过启动/停止本地运行的docker容器来测试ansible脚本

  • 流浪汉和码头工人是替代品。=>嗯,一个人可以使用docker on vagrant作为供给者或提供者。为了不在docker中运行数据库,我的想法是,拥有数据库的docker可以更快更容易地维护数据库,因为这样我可以控制部署哪个版本的postgresql等。3)是的,好主意。1)在vagrant中运行docker就像在VM中运行VM一样。它只对那些运行windows和mac的用户有意义。2) 虽然您可以使用vagrantfile来设置docker主机(一台可以运行docker实例的机器),但我认为ansible更适合这项工作,因为它可以设置docker主机,并对其进行维护/更新/部署等。Hanks我实际上已经按照您所说的那样做了,我写了一篇关于它的文章,它的工作非常出色,因为流浪汉有一个码头补给员。也就是说,您将不会使用virtualbox,而是使用docker来托管您的流浪服务。如果您一次只处理一个或两个项目,并且可以强制所有开发人员在其开发人员机器上遵循相同的设置,那么同时使用VM和docker可能会有点过头。但是在某个时刻,Docker想要在Linux主机上对您的网络接口做的事情开始变得一团糟。在某些情况下,将其封装到特定于项目的VM框(vagrant handled)实际上非常有用。YMMV和所有的爵士乐。
    Vagrant.configure(2) do |config|
      config.vm.define :dbmachine do |dbmachine|
        dbmachine.vm.provider = "docker" do |d|
           ...
        end
      end
      config.vm.define :cachemachine do |cachemachine|
        cachemachine.vm.provider = "docker" do |d|
           ...
        end
      end
    end