コンテナ型仮想化 Docker

前々回のエントリーで Immutable infrastructure について触れた際、それを実現するための技術である Docker というワードを出しました。今回はその Docker について触れたいと思います。

Dockerとは

コンテナ型仮想環境を簡単に管理し利用することのできるソフトウェアです。仮想環境といっても VM を用意しハイパーバイザ型のような物理マシンの構築をするのではなく、OS 環境上に複数のユーザ空間を作り出すことによって仮想的に実行環境を作り出します。Docker は LXC(Linux Containers)によって複数の空間を作ることを実現しています。そのためコンテナ型仮想化はハードウェアレベルでの仮想化に比べ、すぐに新しい環境を作り出すことができます。新しい環境をすぐに構築できるので、デモやちょっとした開発用にさくっと構築していらなくなったら破棄することも柔軟に行えるので、ごちゃごちゃすることもないですね。

行ったこと

OS X で Docker を利用します。Docker は LXC ベースのため OS X 上では動きません。そのため、Vagrant を用いて OS XVM 環境を作り、その VM 内で 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 レベルでのサーバ立ち上げだと待ち時間が発生しますが、コンテナ型はさくっと一瞬で作れちゃいます。必要なときにすぐに利用できるのはいいですね。

今回は基本的な部分について触れました。もうちょっといろいろいじってみたいと思います。