Dockerをインストールする

# Dockerとは？

コンテナ型仮想計算機環境LXCをベースに，差分ファイルシステムAUFSと，イメージ・プロセス管理コマンドdockerを組み合わせた，仮想計算機環境です．実行する仮想計算機の環境構築のためにDockerfileというファイルを作成しておくと，自動的に環境が構築されてプロセスが立ち上がります．

VagrantがVirtualBoxなどをベースに，環境構築の仕組みとしてChefなどを用いて，汎用的な仮想計算機環境を提供する一方，Dockerは使い捨ての仮想環境を提供することが得意です．

# インストール

ここでは，Ubuntu Server 12.04.2 LTS 64bitをベースにDockerをインストールする手順を示します．Ubuntu Serverは，インストールしたての素のままの状態とします．

## 基本コマンドのインストール
```sh
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install ssh git build-essential libssl-dev
```

## rubyのインストール（パッケージをインストールしても良いです）
```sh
$ 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です．

```sh
$ 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というファイルを作成しています．

```sh
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を立ち上げてファイルを確認してみましょう．

```sh
$ 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との差分のみを別の領域に保存しています．つまり，差分イメージから起動すれば，先のファイルは残っていることになります．

それでは，差分イメージを探してみましょう．

```sh
$ 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）が表示されています．このようにして，過去の実行履歴が全て残されています．

過去の実行イメージ（コンテナ）の続きを実行するためには，コンテナをイメージに昇格させることが必要となります．

```sh
$ sudo docker commit 7d36 suda/ubuntu
950d606becdbe80cb3f0e64af018944babbf328a8a2e6cfe92f1118cf305dc48
$
```

イメージは以下のように確認できます．

```sh
$ 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の存在を確認できました．すなわち，続きを実行できたことになります．

```sh
$ 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→・・・を繰り返せば，通常の（所謂スーパーバイザ型の）仮想計算機と同じように扱うことができます．

まだまだ長くなりそうなので，今日のところはここまでにしておきます．