2

Vagrant のドキュメントでは、Docker をプロバイダーとして使用する VM を起動する方法と、Docker を使用して VM をプロビジョニングする方法について説明しています。ただし、両方を組み合わせて使用​​できるかどうかについての情報はありません。

私がこれをやりたい理由は、とにかく Docker 経由でデプロイされる Python Web アプリケーションを開発しているためです。いくつかの依存関係 (Dockerfile を介してインストールされるシステムおよび Python ライブラリ) と、別のコンテナーで実行されている Redis データベースが付属しています。

Python/Webapp Dockerfile に基づいて Docker プロバイダーを使用して Vagrant VM を作成し、このマシンに追加のコンテナー (Redis など) をプロビジョニングできる場合、

  • スピンアップが非常に高速で、デプロイ環境をほぼ完全に模倣する VM があれば、
  • PyCharm IDE のリモート インタープリター機能を使用して、このマシンの Python インタープリターに接続し、コード補完、デバッグなどの恩恵を受けることができます。

これが機能するためには、Docker ベースの VM が Docker プロビジョナーを介してより多くのコンテナーをスピンアップできるように、Docker に 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

これは、スピンされるボックス (最小限の OS が必要な場合は ubuntu、centos、または coreOS である可能性があります) を指す別の典型的なVagrantfileものであり、docker をプロビジョニングします (つまり、ボックスにインストールされていない場合は docker をインストールします)。 VM から利用できます。

わかりましたので、この段階で、dockerdocker をプロビジョニングする VM を指すプロバイダーを持つ 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 が起動します。

于 2016-07-26T19:56:49.817 に答える