前提
以下、インフラ?誰かに頼むから大丈夫!
な方への記事です。
正確な説明や比喩よりも、わかりやすさを優先します。
これまであがった課題など
明確に書いていなかったものも含め、こんな課題がありそうです。
初回の仮想化では
* 環境間の差異を完全になくすことはできない1
- ひとつの仮想環境で利用できるOSはひとつに限定されてしまう2
- 仮想環境の中で何が動いているのか、外からはわかりにくい
前々回の構成管理では
- OSによっては構成管理が期待通りに動かない
- 同じ定義書を利用しても、やはり隣の人とまったく同じ環境になる保証がない
- ひとつのプロジェクトで、複数バージョンのソフトウェアを同時に使うのは依然困難
- そもそもプロジェクトごとに定義書作るのは(煩雑さが緩和されず)やっぱり大変
前回のクラウドでは
- サーバは数分で起動するが、数分は決して速くない
- スナップショットからは作業履歴を追いにくい
- サーバスペックは複数種類からの選択で、それでは過剰もしくは不足
- ポータビリティ3が下がるベンダーロックインの心配
- サーバ単位でDisposable Componentsするのは時間的金銭的に非効率
Dockerとはなにか
Dockerは上述の課題、すべてとは言わないまでも、そのかなりを解決します
Dockerがどんなもので、どうやってそれらを解決するのかを見てみましょう。
- Dockerはコンテナ型仮想化、動くプロセスはたった1つ
- イメージを使ってコンテナを起動する Docker
- 起動も停止も一瞬
- gitのようにcommit, push, pullを使った作業の履歴管理ができる
- Dockerイメージは、クラスのように継承できる
- コンテナが利用するCPUやメモリに上限を設け、リソース管理できる
- Windowsを含めた大手OS、クラウド各社がサポートを表明
今回は 3まで見ていきましょう!
1.1 Dockerはコンテナ型仮想化、動くプロセスはたった1つ
もしかしたらみなさんがすでに馴染みのある仮想化ソフト Boot Campや Parallels4、
または 01.仮想化で仮想開発環境としておすすめした Vagrant + VirtualBoxであっても
仮想化といえば、コンピュータそのもの、マシンといわれる単位で行うものでした。
Macの上に Windowsを起動したら、そこで Excelや Wordが使えますよね?
それは、Parallelsなどが Windows端末そのもの
を再現するためです。
一方で Docker。同じ仮想化ツールですが、実は全然違います。
Dockerは、マシンではなく、コンテナ
5を起動します。
コンテナの中では通常、プロセスは一つしか動きません。
つまり、Windowsではなく、Excelだけ
が起動するようなものです。
Vagrant + VitualBoxでは、例えば、起動した唯一の Ubuntuサーバの中で
Nginxや JVM、MySQLといった複数のサービスが動いていたかと思います。
しかしDockerで同じ構成にしようとすると、こんな感じ
$ docker ps
CONTAINER ID STATUS NAMES
48d97913fd70 Up 10 seconds nginx
64ec5a454f68 Up 10 seconds javavm
5e07fef69752 Up 10 seconds mysql
つまり、各サービスごとにコンテナを起動します。
(3つの仮想環境でひとつのプロジェクトを構成します)
1.2 コンテナ型仮想化の恩恵
一見、3つも仮想環境を立ち上げる Dockerは管理が煩雑です。
しかし一方で、以下の問題が解決したようです。
・ひとつの仮想環境で利用できるOSはひとつに限定されてしまう
実は上の nginx
、javavm
、mysql
、
それぞれベースになっている OSが違っていても問題ありません。
仮に
- Nginxを担当する Aさんは 得意な Red Hat Enterprise Linux 7で
- Javaアプリを開発するあなたはなんとなく Ubuntu 14.04で
- MySQLを担当する Bさんは公式と同じ Debian 7.7 Wheezyで
分業しても、全体としては期待通りにちゃんと動作します6。
また、これも解決します。
・仮想環境の中で何を動かしているのか、外からはわかりにくい
さきほどコンテナの一覧を表示したコマンド docker ps
ですが
このコンテナ一覧は、現在動作しているプロセスそのものです
2. イメージを使ってコンテナを起動する
Vagrant + VirtualBoxでも Parallelsでも どんなクラウドでも、
仮想マシンの起動にはテンプレート
7となるデータが必要になります。
例えば Vagrantなら、ここから Box
を探すことになりますし
EC2なら最初に AMI
を選びます。
Dockerの場合は、テンプレートのことを Dockerイメージと呼び、
そこからインスタンス化された環境のことを Dockerコンテナと呼びます。
Vagrantにも boxのサイトがあったように、Dockerにも公式イメージを
管理しているサイトがあります。
Docker Hub Registryです。
ここに掲載されているアプリケーションなら、
いずれもこんな感じでかんたんに起動できます。
$ # docker run [オプション] Dockerイメージ [コンテナ内でプロセスを起動するためのコマンド]
$ docker run -d -v /content:/usr/share/nginx/html nginx
3. 起動も停止も一瞬
コンテナ型ではない仮想化の場合、環境の立ち上げは速くても数十秒かかりました。
しかし Dockerはコンテナ型、起動はほんの一瞬です。1秒かかりません8。
$ # docker run [オプション] Dockerイメージ [コンテナ内でプロセスを起動するためのコマンド]
$ docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=pw55 mysql:5.5
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pw56 mysql:5.6
$ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=pw57 mysql:5.7
MySQL Serverをローカルにインストールすることもなく
一瞬
で MySQL5.5、MySQL5.6、MySQL5.7サーバが同時に
起動しましたね!
ということは、
・複数バージョンのソフトウェアを同時に使うのは依然困難
これが解決したようです。
そして、起動と停止が一瞬ということは
・サーバは数分で起動するが、数分は決して速くない
これも解決です。
今回のまとめ
Dockerを使うことで、仮想化や構成管理を使う以上に、
よりかんたんで柔軟な開発、リリース作業ができそうじゃないですか?
次回は Dockerの特徴、後半をお届けします。