2

Vagrant 文档描述了如何启动使用Docker 作为提供者的 VM,以及如何使用 Docker 配置 VM。但是,没有关于是否可以将两者结合使用的信息。

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

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

  • 我将拥有一个启动速度非常快的虚拟机,并且几乎可以完美地模仿我的部署环境,
  • 我可以使用PyCharm IDE 的远程解释器功能连接到这台机器上的 Python 解释器,并从代码完成、调试等中受益。

为此,可能需要Docker 中的 Docker 之类的东西,以便基于 Docker 的 VM 可以通过 Docker 配置器启动更多容器。

这种方法通常是否可行,或者在某处是否有可用的工作示例?或者,如果没有,有什么好的替代方法可以达到同样的效果?

4

1 回答 1

0

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

是的,你可以 - 我没有检查最新的 vagrant 版本,但这一直有效到 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)所以 docker 将是可从您的 VM 获得。

好的,所以在这个阶段你有一个虚拟机,docker提供者指向一个提供 docker 的虚拟机。现在你想设置你的 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。

于 2016-07-26T19:56:49.817 回答