最近、良く聞くDockerをOS Xで使う時に、使用するツールとその役割について整理してみました。後半は思ったことをまとめました。
[UPDATE] 2014.3.21 図が不正確だったので、削除しました。
Docker
Dockerはコンテナ型と呼ばれる仮想化を行うミドルウェア。コンテナ型の仮想化はOS XでWindowsを仮想マシンで動かすという仕組みとは違って、Linuxカーネルの機能を使って、ハードウェア部分やカーネルは仮想化せずに、共有して、その上の部分を仮想化する。
当然、OS Xでは直接は出来ない仕組みなので、仮想PCを使って、Linuxを動かし、その上でDockerを使うということが必要になる。そこで利用するのが、VirtualBox。VirtualBoxはハードウェアごと仮想化する完全な仮想マシンを作る。VirtualBox上でLinuxを動かし、その上でDockerを使い、コンテナ型の仮想化を行う。
Vagrant
VirtualBoxが仮想マシンなので、Vagrantは必須ではない。Vagrantの役割は、VirtualBoxをバックエンドにして、仮想マシンの作成と実行、削除などを行う管理ソフト。Vagrantはテキストファイルで仮想マシンの設定や仮想OSの設定などを書き、その設定に従って仮想マシンを作り、稼働させてくれる。
これにより、仮想マシンの設定をGitなどで管理することができ、開発用のローカルマシンに簡単に展開できる。
Vagrant + VirtualBox以外の仮想マシン
Vagrantは初期のバージョンはVirtualBox専用だったが、現在のバージョンはVMwareなどと組み合わせることも可能になっている。
Vagrantを使うメリット
最大のメリットは、仮想マシンの構成をGitなどで管理できるようになり、開発マシンで仮想マシンを構築する処理を自動化できるということ。自動化できるということは、CI(継続的インテグレーション)などでも仮想マシンを展開させて、テストすることも容易。また、仮想マシンの設定を変更するときも設定ファイルを変更すれば、複数の開発マシンでもすぐに反映が可能。また、この設定変更自体もGitなどで管理しておくことができる。
Dockerのメリット
カーネル部分は共有するので軽量な仮想化で済む。また、カーネルの機能を使っているのと、ハードウェア部分の仮想化が無いため、パフォーマンスもある程度は確保可能であり、メモリなどのリソースも削減できる(本番サーバーやテストサーバーはLinuxにしてVirtualBox部分を省く)。
システム構成を記述したファイルに従って、OSを構築するので、OSの構築処理の自動化が可能になる。
本番サーバーやテストサーバーと同じ環境を、開発マシンにも簡単に展開できる。
クライアントアプリの開発者にとって
サーバーと連携するアプリを開発するときにも、開発マシン内でクライアントの処理とサーバー側の処理が動作する状態を作れるので、デバッグが少し楽になると思われます。
例えば、サーバー側のデータを変更して、クライアント側が正しく動作するかデバッグしたいときや、クライアントから送信したデータが、サーバー側から見て正しいかなどのデバッグを開発マシン内で行えると思います。
テストサーバーは評価部隊が使っていて、開発側から自由にデータを変更できないということがありますが、開発マシン内で開発でデバッグ用のサーバーがあれば、それも変更できます。
アプリ開発者もちゃんと勉強した方が良い技術だと思います。