Dockerとは?
コンテナ型仮想計算機環境LXCをベースに,差分ファイルシステムAUFSと,イメージ・プロセス管理コマンドdockerを組み合わせた,仮想計算機環境です.実行する仮想計算機の環境構築のためにDockerfileというファイルを作成しておくと,自動的に環境が構築されてプロセスが立ち上がります.
VagrantがVirtualBoxなどをベースに,環境構築の仕組みとしてChefなどを用いて,汎用的な仮想計算機環境を提供する一方,Dockerは使い捨ての仮想環境を提供することが得意です.
インストール
ここでは,Ubuntu Server 12.04.2 LTS 64bitをベースにDockerをインストールする手順を示します.Ubuntu Serverは,インストールしたての素のままの状態とします.
基本コマンドのインストール
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install ssh git build-essential libssl-dev
rubyのインストール(パッケージをインストールしても良いです)
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ . .bashrc
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 2.0.0-p353
$ rbenv global 2.0.0-p353
$ rbenv rehash
lxcとDockerのインストール
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
$ curl -s https://get.docker.io/ubuntu/ | sudo sh
以上でインストールは終了です.
とりあえず動かしてみる
以下のように実行すると,dockerに登録されているイメージをダウンロードして,その環境内で指定されたコマンドを実行します.この場合はイメージ名がubuntuで,起動するコマンドがbashとなります.また,「-i -t」により,インタラクティブモードでの起動となります.つまり,起動したbashを通じて仮想計算機を操作できます.終了は^Dやexitです.
$ sudo docker run -i -t ubuntu /bin/bash
[sudo] password for ubuntu: ←ユーザ名はubuntuとしています.
Unable to find image 'ubuntu' (tag: latest) locally
Pulling repository ubuntu
8dbd9e392a96: Download complete
b750fe79269d: Download complete
27cf78414709: Download complete
root@7d36d4909685:/#
実際に実行してみると,ubuntuという名前のイメージをダウンロードして,bashが起動します.参考までに管理者ユーザ(root)でログインしています.
さて,bash上でファイルやディレクトリを作成して,exitしてみてください.下記の例ではtestとhogeというファイルを作成しています.
root@7d36d4909685:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
root@7d36d4909685:/# touch test
root@7d36d4909685:/# touch hoge
root@7d36d4909685:/# exit
それでは次に再度bashを立ち上げてファイルを確認してみましょう.
$ sudo docker run -i -t ubuntu /bin/bash
root@9ac2f6dba4ec:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux srv sys tmp usr var
root@9ac2f6dba4ec:/# exit
すると,先ほど作成したはずのファイルやディレクトリが存在しません.実はここがDockerのミソで,ubuntuというイメージ名は,いつまでたってもダウンロードした時のままです.それでは先ほど作成したファイルやディレクトリはどこに行ったのでしょうか?
実は,差分ファイルシステムAUFSによって,先ほどのファイルなどは,イメージubuntuとの差分のみを別の領域に保存しています.つまり,差分イメージから起動すれば,先のファイルは残っていることになります.
それでは,差分イメージを探してみましょう.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ac2f6dba4ec ubuntu:12.04 /bin/bash 2 minutes ago Exit 0 clever_pike
7d36d4909685 ubuntu:12.04 /bin/bash 5 minutes ago Exit 0 nostalgic_galileo
$
行頭のコンテナIDに見覚えがあるはずです.これは先ほど起動したbashのプロンプトに現れていた文字列です.また,COMMANDの欄に,実行したコマンド(/bin/bash)が表示されています.このようにして,過去の実行履歴が全て残されています.
過去の実行イメージ(コンテナ)の続きを実行するためには,コンテナをイメージに昇格させることが必要となります.
$ sudo docker commit 7d36 suda/ubuntu
950d606becdbe80cb3f0e64af018944babbf328a8a2e6cfe92f1118cf305dc48
$
イメージは以下のように確認できます.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
suda/ubuntu latest 950d606becdb About a minute ago 128 MB
ubuntu 12.04 8dbd9e392a96 8 months ago 128 MB
$
ここまでくれば,後は作成したイメージを動作させ,ファイルの存在を確認するだけです.無事にtestとhogeの存在を確認できました.すなわち,続きを実行できたことになります.
$ sudo docker run -i -t suda/ubuntu /bin/bash
root@64a49f58b207:/# ls
bin boot dev etc hoge home lib lib64 media mnt opt proc root run sbin selinux srv sys test tmp usr var
root@64a49f58b207:/#
以下,run→commit→・・・を繰り返せば,通常の(所謂スーパーバイザ型の)仮想計算機と同じように扱うことができます.
まだまだ長くなりそうなので,今日のところはここまでにしておきます.