コンテナ型仮想化 Docker
前々回のエントリーで Immutable infrastructure について触れた際、それを実現するための技術である Docker というワードを出しました。今回はその Docker について触れたいと思います。
Dockerとは
コンテナ型仮想環境を簡単に管理し利用することのできるソフトウェアです。仮想環境といっても VM を用意しハイパーバイザ型のような物理マシンの構築をするのではなく、OS 環境上に複数のユーザ空間を作り出すことによって仮想的に実行環境を作り出します。Docker は LXC(Linux Containers)によって複数の空間を作ることを実現しています。そのためコンテナ型仮想化はハードウェアレベルでの仮想化に比べ、すぐに新しい環境を作り出すことができます。新しい環境をすぐに構築できるので、デモやちょっとした開発用にさくっと構築していらなくなったら破棄することも柔軟に行えるので、ごちゃごちゃすることもないですね。
行ったこと
OS X で Docker を利用します。Docker は LXC ベースのため OS X 上では動きません。そのため、Vagrant を用いて OS X に VM 環境を作り、その VM 内で Docker を動かします。
使ったもの
- Mac OS X
- Vargant
- Docker
Dockerを動かす
Vagrantで仮想マシンを立ち上げる
github リポジトリから Vagrantfile をダウンロードし、ローカルマシンである OS X のワークディレクトリに配置します。そのディレクトリで vagrant up コマンドで Vagrantfile を読み込み VM を起動します。
vagrant up
ローカルマシンと VM を同期するマウントポイント /vagrant を有効にするために再起動します。
vagrant reload
再起動が完了したら vagrant ssh でログインしましょう。
※ vagrant についてはこちらのエントリーに記載しています。
コンテナを立ち上げる
Docker を操作します。Docker の操作は docker コマンドを通じて行います。コンテナを立ち上げるには docker run を実行すれば立ち上がります。試しに docker run で立ち上げた後に「Hello, World!」を表示させてみます。
vagrant@precise64:~$ docker run ubuntu /bin/echo Hello, World Unable to find image 'ubuntu' locally Pulling repository ubuntu 5ac751e8d623: Download complete 9f676bd305a4: Download complete eb601b8965b8: Download complete 9cc9ea5ea540: Download complete 9cd978db300e: Download complete 511136ea3c5a: Download complete f323cf34fd77: Download complete 6170bb7b0ad1: Download complete 321f7f4200f4: Download complete 1c7f181e78b9: Download complete 7a4f87241845: Download complete Hello, World
いろいろ出てきました。初回実行時のためOSイメージがリモートからダウンロードされています。ダウンロード完了後に「Hello, World!」と表示されます。
コンテナを立ち上げるにあたって docker run のあとに ubuntu と指定しています。これはイメージの名前で、コンテナを立ち上げるのにそのコンテナのベースになるOSイメージが必要です。今回の実行では ubuntu のイメージを利用して立ち上げています。
コンテナを操作する
コンテナが立ち上がったのでコンテナ内に nginx をインストールしてみます。今いる VM からコンテナ内に切り替わるには -i オプションと -t オプションをつけて /bash を実行します。
vagrant@precise64:~$ docker run -i -t ubuntu /bin/bash root@bd75ac8f78ec:/#
これでコンテナ内部に入ったので nginx をインストールしてみたいと思います。
sudo apt-get install -y nginx-full
実行するとずらずらとインストールが開始されます。
イメージ(テンプレート)保存する
ここまでで OS イメージからコンテナを立ち上げてコンテナに nginx をインストールしました。この状態でコンテナをイメージとして保存したいと思います。イメージとはテンプレートのようなものです。イメージ保存することで docker run で実体化できます。保存する際は docker commit を実行するだけです。
root@bd75ac8f78ec:/# exit
vagrant@precise64:~$ docker commit 'bd75ac8f78e manato/nginx
今コンテナ内部にいるので一度 exit しそのあとに保存します。docker commit の引数は ”コンテナID” "イメージに付ける名前" となります。
保存されているかは docker images で確認します。
vagrant@precise64:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE manato/nginx latest 795c9d9ba184 13 seconds ago 217.4 MB ubuntu 13.10 9f676bd305a4 7 weeks ago 178 MB ubuntu saucy 9f676bd305a4 7 weeks ago 178 MB ubuntu raring eb601b8965b8 7 weeks ago 166.5 MB ubuntu 13.04 eb601b8965b8 7 weeks ago 166.5 MB ubuntu 12.10 5ac751e8d623 7 weeks ago 161 MB ubuntu quantal 5ac751e8d623 7 weeks ago 161 MB ubuntu 10.04 9cc9ea5ea540 7 weeks ago 180.8 MB ubuntu lucid 9cc9ea5ea540 7 weeks ago 180.8 MB ubuntu 12.04 9cd978db300e 7 weeks ago 204.4 MB ubuntu latest 9cd978db300e 7 weeks ago 204.4 MB ubuntu precise 9cd978db300e 7 weeks ago 204.4 MB
一番上にイメージが作成されていることが確認できます。これでコミットしたイメージからコンテナを起動することができます。
docker run -i -t manato/nginx /bin/bash
まとめ
ハイパーバイザ型のように OS レベルでのサーバ立ち上げだと待ち時間が発生しますが、コンテナ型はさくっと一瞬で作れちゃいます。必要なときにすぐに利用できるのはいいですね。
今回は基本的な部分について触れました。もうちょっといろいろいじってみたいと思います。