是否可以使用Docker作为提供者和配置者运行Vagrant?

时间:2016-07-26 15:31:08

标签: docker vagrant vagrant-provision

Vagrant文​​档介绍了如何启动使用Docker as provider以及how to provision a VM using Docker的VM。但是,没有关于是否可以同时使用两者的信息。

我之所以这样做是因为我正在开发一个Python Web应用程序,无论如何都将通过Docker部署。它带有一些依赖项(通过Dockerfile安装的系统和Python库)以及在另一个容器中运行的Redis数据库。

如果我现在可以根据我的Python / Webapp Dockerfile创建一个带有Docker提供程序的Vagrant VM,并为该机器配置更多容器(例如Redis),那么

  • 我的虚拟机速度非常快,并且几乎可以完美地模仿我的部署环境,
  • 我可以使用PyCharm IDE's remote interpreter functionality连接到本机中的Python解释器,并从代码完成,调试等中受益。

为了实现这一点,可能需要Docker in Docker这样的东西,以便基于Docker的VM可以通过Docker配置器启动更多容器。

这种方法一般是否可行,或者某处有可用的工作示例?或者如果没有,那么实现同样的目标可能是一个很好的替代方案吗?

1 个答案:

答案 0 :(得分:0)

  

是否可以使用Docker作为提供者和配置者运行Vagrant?

是的,你可以 - 我没有检查最新的流浪汉版本,但这是工作直到流浪汉1.8.1

你想要的主要是在运行多个docker容器时旋转一个VM(运行ubuntu或coreOS,如果你想快速旋转并运行最小)。

当您运行vagrant docker提供程序时,您仍然可以管理自己的Vagrantfile。

因此您需要主要的Vagrantfile(通常作为项目的根目录)

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  ...
  config.vm.provider "docker" do |docker|
    docker.vagrant_vagrantfile = "host/Vagrantfile"
  end
  ...
end

然后在你的host/Vagrantfile中,您会有类似

的内容
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Create and configure the VM(s)
Vagrant.configure(2) do |config|

  config.vm.hostname = "docker-host"

  # Spin up your own box (or one from Atlas)
  # and then provision it with Docker
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "docker"

  ...
end

这是另一个典型的Vagrantfile指向将被旋转的框(如果你想要最小的操作系统,它可以是ubuntu,centos或coreOS)并且它将提供docker(即如果没有安装,则安装docker)在盒子上)所以你的VM可以使用docker。

好的,所以在这个阶段你有一个VM docker提供商指向一个提供docker的VM。现在您要设置2个容器

在您的主Vagrantfile中,您将添加2个容器,例如

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  ...
  config.vm.provider "docker" do |docker|
    docker.vagrant_vagrantfile = "host/Vagrantfile"
  end
  ...
  config.vm.define "python" do |python|
    python.vm.provider "docker" do |docker|
      ...
      docker.image = "xxx"
      docker.ports = [80:80]
      docker.name = "python-system"
    end
  end
  config.vm.define "redis" do |redis|
    redis.vm.provider "docker" do |docker|
      ...
      docker.image = "xxx"
      docker.ports = [80:80]
      docker.name = "redis"
    end
  end
end

这将启动你的2个docker提供者/容器python和redis。