hatenob

プログラムって分からないことだらけ

VagrantとDockerのセットアップ

Windows 8.1環境にVagrant+Docker環境を作成した時のメモのようなものです。

Vagrant

VirtualBoxのフロントエンドとして動作するツールで、

vagrant up

とかするとVMが起動できたりするものです。Vagrantfileに構成を書いておくことで、コマンド1つでVMを作ったり消したりが簡単にできるようになり、インフラのCIなんかでよく使われるようです。

Vagrantのセットアップ

セットアップには、VirtualBoxとVagrantをインストールします。
サイトはGoogle先生に聞いてください。

Vagrantは少し前まではgemでインストールするのが主流だったようですが、最近はインストーラが用意されているのでWindows環境でも楽にインストールできました。

ちなみに、VMWareのフロントエンドとして動くバージョンも商用であるみたいです。

VMを起動する

Dockerを入れるので、CoreOSというのを入れることにします。
パッと見、CentOSに見えますが違います。カーネルとなんとかだけの軽量なLinuxOSです。
Gitで取ってくる必要があるので、Windows環境にインストール済みのCygwinを使うことにします。

# git clone https://github.com/coreos/coreos-vagrant/
# cd coreos-vagrant
# vagrant up

ここでエラーが出ました。

incompatible character encodings~

Windows-31Jがどうとか言ってましたが、OS上のユーザ名が日本語文字になっていて、Vagrantのリポジトリ(?)が、%HOME%/.vagrantに作られるので、日本語を含むパスの処理でエラーになった模様です。
手っ取り早く、この.vagrantの格納先を変更することにします。これには、環境変数「VAGRANT_HOME」を設定してやればOKです。
この状態で一度、すでに作られた%HOME%/.vagrantを削除して、もう一度vagrant upをすれば多分大丈夫だと思います。

VMに接続する

vagrant sshで接続できるのですがWindowsでSSH環境をセットアップするのは面倒なので、さっさとCygwinを使います。Cygwin立ち上げて先のcoreos-vagrantまで移動して

# vagrant ssh

で接続完了。

Docker

主流のハイパーバイザ型とは一線を画する、コンテナ型の仮想環境だそうです。詳しくはもっと詳しいサイトをご参照ください。Solarisコンテナなんかと同じ感じなのかな?
コンテナ型の制約として、ホストと同じOSしか動作できないというものがあります。なのでLinuxだとLinuxしか動きません。ただし、ディストリビューションは問われないようです。ホストには軽量なCoreOSを入れておいて、実際に起動するVMにCentOSUbuntuを入れるという使い方を想定しています。

Dockerのセットアップ

先ほど導入したCoreOSにはDocker環境がインストールされているので改めて何かを追加する必要はありません。
元々はUbuntuしかサポートしていなかったみたいですが、最近はRedhat系もサポートしたみたいで、CentoOSにもEPELリポジトリ追加してyumで入れることができました。

VMの起動

Dockerはイメージを用意してそれを元に起動、というようにするみたいで、VMを作ってOSをインストール、というのとはちょっと違うようです。
イメージはベースになるものが公開されているので、例えばCentOS環境であれば下記のようにして簡単に追加できます。

# docker run -i -t centos /bin/bash

これで/bin/bashを起動し、VMのターミナルを起動できるわけですが、初回起動時にこのcentosイメージをdotcloudのイメージリポジトリみたいなところから取得してきます。

Apacheを起動してみる

ApacheHTTPD)を追加して起動してみます。
プログラマブルにVMを作成できるようにDokerfileを書いてみます。

# vi Dockerfile
FROM centos
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]

これをビルドしてDockerイメージを作成します。

# docker build -t nobrooklyn/httpd .
  • tのあとのはイメージの名前です。慣例として[ユーザ名]/[イメージ名]とするようです。
# docker images

で作成したイメージを確認できます。
あとはこれをDetach Modeで起動すればOKです。あと、ポートフォワードの設定も一緒に。

# docker -d -p 8080:80 nobrooklyn/httpd

あとはローカル(この場合はCoreOS)からcurlコマンドなんかで応答を確認できます。

DockerfileのApacheの起動

Dockerfileの最後のCMDで、Apacheをフォアグランドで起動するようにしています。最初素直に

CMD ["service", "httpd", "start"]

と書いたところ、このコマンドをたたいて正常終了でVMが処理完了してしまったのでこんなふうにしています。ちょっと気持ち悪い感じです。

まとめ

Vagrant+Docker環境が用意できました。
Docker自体はまだ開発途上であり、Production環境で使用するのは推奨されないようですが、簡単にVM作ったりできるのでインフラ構成のテスト用として注目されているようです。
ちなみに、Immutable Infrastructureという考え方で、インフラは不変であり、環境変更するときは新たに新しい環境を用意してデプロイするんだよということのようです。
Chefなんかの、構成を柔軟に変更していくという考え方とは少し違うようです。