話題のDockerを遅ればせながら使ってみました。
開発者なので開発者視点でのDockerの使い方になります。
(実際は1年ぐらい前に書いた記事です。下書き状態で忘れてました。)
ChefやVagrantとDockerの何が違うの?
ChefやVagrantなど巷には色々あるありますが、Dockerと何が違うの?という所が最初は分かりませんでした。
Chef
システム構築を自動化するためのソフトウェアツールあるいは枠組み(フレームワーク)の一種。システムの各種設定を変更したり、アプリケーションやミドルウェア、コンポーネントなどのソフトウェアをインストールしたりする作業を自動化できる。
Vagrant
Vagrantは、開発環境の構築と共有を簡単に行うためのツールです。 どこでも同じ環境を再現できるように仮想マシン環境を管理する機能と、Atlasを通して共有する仕組みが提供されています。
Docker
Linux上で独立した別のLinuxシステムを起動することができる、コンテナ型の仮想化ソフトウェアの一つ
簡単に言うとChefはサーバー設定ツールで、Vagrantは仮想マシンをパッケージング(box化)できるツール。Dockerはコンテナに仮想環境を構築できるツールになります。
Vagrantの仮想マシンとDockerのコンテナの一番の違いは、CPUやメモリ、ディクス使用などのオーバーヘッドがあるかないかです。仮想マシンは仕組み上、OSリソースを再現する為、どうしてもオーバーヘッドが生じますが、Dockerのコンテナの場合はソフトウェアとして実行される為、それらのオーバーヘッドはほとんどないそうです。
DockerはDockerfileというインストールなどのコマンドを一元管理できる機能があり、Dockerfileをビルドするだけでワンライナーで環境構築を行う事も可能です。
現状、DockerとVagrantを組み合わせて使う事はあってもDockerとChefを組み合わせて使うメリットはほとんどないように思います。
Dockerを利用した開発環境構築
下記のような感じでVagrant+Dockerの開発環境を構築しました。
1. Vagrantでcentos用のboxを作成、そのVirtualboxのCentOS7の仮想マシン上にDockerをインストール。
2. DockerのCentOS6用のイメージを取得し、コンテナを作成して実行。そのコンテナ上に開発環境を構築する。その時のインストールしたコマンドをDockerfileに明記。
3. Dockerfileはビルドするだけでワンライナーで動くようにする為、ソースなどのリソースはgitからcloneするようにし、dbの初期設定や初期データ投入などもDockerfileに明記するよう工夫する。
4. ワンライナーでビルドし、起動できるDockerfileが完成。gitにレポジトリを作成したDockerfileを共有する。
5. VagrantのVagrantfileにsshやhttp用のポートフォワード(ホスト機<->Vagrant<->Docker)、共有ファイルの設定やVagrant up時のDockerやコンテナ起動の設定を記述する。
6. ワンライナーでビルドでDockerイメージを作成、作成したイメージからDockerコンテナを作成、起動する
7. Dockerコンテナにeclipse用のdebugなどの設定を追加。
8. Vagrant upするだけでeclipseでデバック実行可能な開発環境の構築が完了。
Dockerを利用したステージング環境構築(CI)
ステージング環境はローカルのCentOS7がインストール済みの端末に下記のような感じで構築しています。
1. CentOS7にDockerをインストール
2. gitからDockerfileをcloneし、ビルドを行い、イメージの作成、コンテナの作成と起動を行う。
(コンテナの起動はsshとhttpのポートフォワードを行い、ソースなどのリソースはボリュームオプションを使用し、ホスト機とファイル共有し、永続化する)
(この状態でホスト機にhttpアクセスするとステージング用のサービスがすぐに確認できる)
3. Jenkinsをインストール。
4. Jenkinsで対象のgitがpushされるとビルド時にDockerとファイル共有しているソースなどのリソースをgitから最新化するシェルを設定。
5. gitの対象リポジトリにpushすると即時にステージング環境に反映される環境が完成。
Dockerの利点
再利用性に優れている
Dockerfileを作ってしまえば、CPUアーキテクチャが同じであれば、同じ環境をすぐに作成する事が可能です。またコンテナのエクスポートやイメージのエクスポート、インポートも容易にできます。
ラズパイなどはCPUアーキテクチャが違うのでそのまま使えません。筆者は開発環境をラズパイに入れて遊んでみようと思いましたが、その事実に買った後に気付きました。
軽量
VMやVurtuialboxに比べると軽量でオーバーヘッドもほとんどありません。
Dockerの習得
基本的にはネットに転がっている情報である程度は分かると思います。私は環境構築まではネットだけの情報で調べながらやってみて、その後、体系的なまとまった知識が欲しかったので書籍を買って勉強しました。
本番運用となれば、現状の知識レベルでは難しい部分はあるとは思いますが、開発で使う分には大丈夫かな、というぐらいにはなれたと思います。
最後に
Dockerfileに記述するだけでワンライナーで環境が全てできるのは、最初は感動物です。やってみて楽しかったですし、Dockerは個人的にプログラマーライクな技術だと思いますので、一度は試してみる事をお勧めします。