Vagrant1.6のDocker Provider
Feature Preview: Docker-Based Development Environments
Vagrant 1.6からDocker providerがサポートされた.つまり,VagrantでVMだけでなくコンテナも管理できるようになった.
この機能はネイティブでDockerをサポートしてないOSXでも使え,この場合は裏側でProxy VM(boot2docker box)が勝手に立ち上がって,その上でコンテナが立ち上がる.つまり,以下のようになる.
1
|
|
OSXの場合,これは今までboot2dockerを使ってやってきたのと変わらない.ただ,Docker providerを使うと,boot2dockerの立ち上げまで面倒を見てくれる.
何が嬉しいのか
VagrantでDockerコンテナを立ち上げる利点はかなりあると思う,
vagrant up
だけで環境を立ち上げられる- 同様のインターフェースでLinuxでもOSXでも動かせる
- コンテナの立ち上げの設定をVagrantfileに書ける
- Proxy VMの設定をVagranfileに書ける
- Vagrantの機能(syncd folder,ネットワーク設定,
vagrant ssh
,provisioner,vagrant share
)が使える - プラグインが書ける
これはそのままVagrantの利点だけど,それをDockerコンテナに持ち込めるのがよい.つまり,Vagrant道をDockerコンテナを使った開発にも適用できるようになる.
自分的には,Vagrantfile
にコンテナの設定などを再現可能な状態で簡単に残せるのがよい.今までOSXでDocker使うときは,boot2docker init
して,VBoxManage modifyvm
でポートフォワードして,export DOCKER_HOST
して,などなど一手間あったが,vagrant up
だけになる.それだけでも嬉しい.
また,v1.6から任意のディレクトリからVagrantのVMを操作できるようになった(Global Status and Control)ので,ほとんどDockerを扱うような感覚で扱える.
使ってみた
OSX上でざっと触ってみた.最新版(1.6.1)をインストールしておく.
1 2 |
|
Dockerfile
まずDockerfile
の準備.ここでは例としてApacheコンテナを立ち上げる.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Vagrantfile
次にコンテナ用のVagrantfile
を準備する.
1 2 3 4 5 6 |
|
やっているのは,
- カレントディレクトリ(
.
)のDockerfileをもとにイメージをビルド - そのイメージからコンテナの立ち上げ
コンテナの立ち上げの際は,Proxy VMの8080ポートをコンテナの80ポートにフォワードする.
Linuxの場合は得に意識する必要はないけど,OSXの場合は,このVagrantfile
はProxy VMから見たコンテナというのを意識しないといけない.ポートフォワードは,Proxy VMからコンテナへのポートフォーワードで,OSXからではない.
後述するがOSXからコンテナに直接アクセスするには,Proxy VMのためのVagrantfile
が必要になる.
vagrant up
あとは,いつも通りに立ち上げるだけ.
1
|
|
これを実行すると,VagrantはProxy VM(boot2docker box)のインストールと起動,Dockerイメージのビルド,コンテナの起動までをよしなにやってくれる.
global statusを見てみると,VMとコンテナの両方が起動しているのが確認できる.
1 2 3 |
|
コンテナの操作には,以下のコマンドが使える.
vagrant reload
でDockerfileの再ビルドを実行するvagrant docker-logs
で立ち上がったコンテナのログを確認する
また,ホスト(OSX)の4243ポートはProxy VMの4243ポートへフォワードされているので,tcp://localhost:4243
を介してDockerコマンドを直接叩くこともできる.
Vagrantfile (Proxy VM)
上の例は,コンテナの起動まではちゃんと動作する.しかし,OSXからコンテナにアクセスするといったことができない.というのもOSXからProxy VMのポートフォワードが設定されていないので,そもそも到達しない.
このようにデフォルトのProxy VMにはまだまだ不都合がありそうなので,自分で設定を触れるようにしておく.Docker providerでは,Proxy VMのためのVagrantfile
を指定することができる.以下のようにvagrant_vagrantfile
を使う.
1 2 3 4 5 6 7 |
|
デフォルトのProxy VMには,以下のVagrantfileが使われいる.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
基本は,このVagrantfileを利用し,設定したい内容を追記する.そして,vagrant_vagrantfile
でこのVagrantfile指定する形にする.
上の例の場合は,このVagranfileに以下のポートフォワードの設定を追記して起動し直せば,OSXからコンテナのindex.htmlにアクセスすることができるようになる.
1
|
|
雑感
他にもvagrant ssh
やsyncd folderも使えそう.sshできれば,chefやpuppetのprovisionerをコンテナに流せるし,syncd folderは,Dockerのvolume機能と相性が良さそう.
ただDockerを普通に操作するのと比べて,少し意識を変えないといけない.その辺,もう少し触ってみて様子をみたい.