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

How with Vagrant, ansible and docker to get Linux dev machine as close as possible to production

抱歉 non-explicit 标题这就是我想要实现的目标

我知道如何为 一台 机器使用 Vagrant+Ansible provisioning 和 我知道如何使用带有 docker 模块的 ansible 来按照

中的示例创建一个完整的环境

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

但随后它会 运行 在虚拟机中

我知道如何使用 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

但是在 production/staging 中,因为我没有 vagrant,所以我没有描述架构的东西了

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

几点注意事项:

  1. 并非所有组件 都需要 docker 化。例如,您的数据库不是您会经常发布新版本的东西。它不是您可以添加更多实例或动态减少的东西。其他组件 cache/code 等可能是 dockerizing 的良好候选者。免责声明:there are few reasons to dockerize db as well, but check if it makes sense for you
  2. Vagrant 和 docker 是备选方案。您应该使用一个或另一个 - 而不是两者。 Vagrant 构建了一个完整的 VM(在 VMWare/or virtualbox 等上),而 docker 构建了一个轻型 VM(称为容器),它面向 运行 全心全意地构建一个进程。在接下来的几点中,我假设您更喜欢使用 docker 而不是 vagrant。
  3. Mac/Windows 开发者最好为 Mac 使用 Docker,为 Windows 使用 Docker 在他们的开发者上设置应用程序 mac海恩斯。它可以 运行 docker 个容器。我建议在 virtualbox 中使用一个完整的 linux VM,它可以 运行 ansible 和 docker 在上面。 (你可以在这里使用 vagrant 来自动安装带有 ansible 和 docker 的 linux 虚拟机,但它只会对正在工作的 mac 和 windows 开发人员有用在虚拟机上。)
  4. 为您的应用环境 building/describing 使用 Dockerfile 而不是 vagrantfile 。或者更好的是,你可以使用 ansible 来设置你的 docker 容器,如果你更喜欢 ansible 剧本而不是 dockerfile,它基本上是 shell 命令。据我所知,它们是做同一件事的两种方式——但 ansible 确实有更好的语法和特性。在 Docker 文件中为 "provisioning tasks" 调用你的 ansible 剧本。在为 "deploy tasks" 构建容器后,您还可以调用另一个 ansible 剧本。 Chef 也是 ansible 的一个很好的替代品。
  5. 要使用 ansible,您需要在非开发 (qa/prod) 环境中控制 machine 和一堆目标 machine。 Ansible 将能够通过 SSH 进入目标 machines,并启动 docker 容器。如果您编写了一个用于停止容器、拉取最新图像并启动它的剧本——您就有了一个很好的自动化部署过程。在 devboxes 本地,您可以通过 start/stopping 在本地 运行ning docker 容器测试您的 ansible 脚本。