Vagrant,Ansible和Docker如何让Linux dev机器尽可能接近生产

对不起,这里的非明确的标题是我想实现的

  • 让我的Web应用程序与docker一起运行(一个用于数据库的容器,一个用于caching,一个用于php-fpm +代码)
  • 在生产中,因为我没有stream浪,所以我希望docker模块的标准能够提供环境
  • 因为我的开发人员有Linux机器和stream浪者支持docker作为提供者,我希望这些docker容器直接运行在我们的开发机器没有VM(因为我们有很多的项目,保持一个虚拟机项目很快用尽内存,我们需要经常停机/停机,特别是在维护阶段)
  • 我们在Mac / Windows上有一些开发者,所以我们仍然需要stream浪者提供一个“stream浪”的抽象层,让开发者有一个大脑死亡的简单的开发环境。

我知道如何在台机器上使用Vagrant + Ansibleconfiguration,我知道如何使用docker模块创build一个完整的环境,

http://docs.ansible.com/docker_module.html

Vagrant.configure(2) do |config| config.vm.box = "ubuntu/trusty64" config.vm.provision :ansible do |ansible| ansible.playbook = 'provisioning/site.yml' ansible.extra_vars = app_vars ansible.verbose = verbosity_arg end end 

但是它会在虚拟机中运行

我知道如何使用stream浪汉在一个stream浪文件中创build几台机器

 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 

但是在生产/舞台上,由于我没有stream浪,所以我不再有描述build筑的东西了

那么有没有办法将这些东西结合在一起来满足我的需求?

几个注意事项:

  1. 并不是所有的组件都需要被docker化。 例如你的数据库不是你经常发布新版本的东西。 而不是你会增加更多的实例或减lessdynamic。 其他组件caching/代码等可能是dockerizing的好select。 免责声明: dockerize db也有几个原因,但检查是否对你有意义
  2. stream浪者和docker工人是替代品。 你应该使用其中一个 – 而不是两个。 Vagrant构build了一个完整的虚拟机(在VMWare /或者virtualbox等),而docker构build了一个虚拟的虚拟机(称为容器),这个虚拟机是为了全心全意地运行一个进程而devise的。 我会假设你更喜欢在接下来的几点使用docker超过stream浪汉。
  3. Mac / Windows开发者最好使用Docker for Mac,而Docker for Windows在他们的开发机器上设置应用程序。 它可以运行docker集装箱。 我会build议在virtualbox上使用一个完整的linux虚拟机,可以运行它和docker。 (你可以在这里使用vagrant来自动安装linux VM,但是只能用在VM上的那些mac和windows开发者。)
  4. 使用Dockerfile而不是vagrantfile来构build/描述你的应用程序的环境。 或者甚至更好,你可以使用可以设置你的docker集装箱,如果你喜欢ansible的剧本,而不是dockerfile,这基本上是shell命令。 AFAIK他们是做同样的事情的两种方式 – 但ansible有更好的语法和function。 在Dockerfile中调用你的“供应任务”的剧本。 您也可以在为“部署任务”构build容器之后再调用另一个可靠的手册。 厨师也是一个不错的select。
  5. 为了使用可靠的,你将需要一个控制机器和一堆目标机器在非dev(qa / prod)环境中。 Ansible将能够SSH到目标机器,并启动docker集装箱。 如果你写了一个停止容器的剧本,拉取最新的图像,并开始它 – 你有一个很好的自动化部署过程。 本地在devboxes上,你可以通过启动/停止本地运行的docker容器来testing你的脚本。