Docker事始め（Mac編）


## Dockerやってみるか。

AWSのElasticBeanstalkもDockerのコンテナでのデプロイに対応したことだし、そろそろDockerをちゃんと使ってみないとなぁと思いまして。

ちょっと前までは、Chefがガンガン流行ってて、インフラアズコードだねーと、インフラの設定はコードに書いておくのが流行りだったので、
実行環境の細かい設定ができないElasticBeanstalkってちょっと時代じゃないよな、って勝手に思ってたのです。失礼ながら。
(例えばRuby2.1で実装したアプリをElasticBeanstalk上ではまたRubyが1.9だったので動かなかったとか。)
そんなことがあったので、もうChef使って自分で実行環境整えてデプロイするのがこれから普通になるのかーと思っていたら、

数ヶ月後、

### [【AWS発表】AWS Elastic Beanstalk for Docker](http://aws.typepad.com/aws_japan/2014/04/aws-elastic-beanstalk-for-docker.html)



おお、お前がこれまで沈黙を保っていたのはこれだったのか。。。時代遅れなんて言ってスマンかった。

コンテナごとデプロイできるってことは、
自分のローカルでDocker上に環境構築したコンテナをポイッとクラウド上にアップロードしてやればデプロイ完了！ってことになってしまうんですよね。

このお手軽感は素敵・・・ちゃんと使うこなせるようになりたい。
ElasticBeanstalkにコンテナでデプロイするまで試したいですが、今回はDockerの環境作ってコマンドぽちぽち打つトコまでやってみます。



## 実行環境

* MacOS X 10.9.2
* VirtualBox 4.3.6
* Homebrew 0.9.5



## インストール/初期設定

念のためHomebrewをアップデートしておきます。

```bash
brew update
brew install boot2docker
```

HomeBrewであればこれでboot2dockerがインストールできるはずです。


```bash
boot2docker init
boot2docker -h
Usage /usr/local/bin/boot2docker {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}

boot2docker up
[2014-04-28 21:49:02] Starting boot2docker-vm...
[2014-04-28 21:49:23] Started.
```


initするとVMイメージのダウンロードが始まります。
あとは、upでVMを起動するだけです。VirtualBoxマネージャーでも起動しているのが確認できると思います。

では、DockerのインストールされたVMへログインしてみます。

```bash
boot2docker ssh
docker@localhost's password: tcuser
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|

```

dockerのパスワードは *「tcuser」* です。


## Dockerコマンドぽちぽちしてみる

```bash
docker pull ubuntu
docker run ubuntu /bin/echo HelloWorld!
```


pullでubuntuのイメージをDLします。少々時間がかかります。
runはその名の通り、DLしたコンテナを実行するコマンドです。


### バージョン情報とかDockerの情報を見る

```bash
docker version

Client version: 0.10.0
Client API version: 1.10
Go version (client): go1.2.1
Git commit (client): dc9c28f
Server version: 0.10.0
Server API version: 1.10
Git commit (server): dc9c28f
Go version (server): go1.2.1
Last stable version: 0.10.0

docker info

Containers: 15
Images: 27
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Dirs: 57
Execution Driver: native-0.1
Kernel Version: 3.13.3-tinycore64
Debug mode (server): true
Debug mode (client): false
Fds: 11
Goroutines: 12
EventsListeners: 0
Init Path: /usr/local/bin/docker
```


versionはその名の通り、docker自体のバージョン情報。
infoはdocker上に存在するコンテナやイメージなどの情報が出力されます。



[Docker index](https://index.docker.io/)からイメージをDLしてみます。
Rubyが入ってるやつがいいな。と思って、検索して出てきた一番DL数の多いイメージを使ってみます。


```bash
docker@boot2docker:~$ docker pull paintedfox/ruby

Pulling repository paintedfox/ruby
6e27bf8e7a3b: Pulling dependent layers
511136ea3c5a: Download complete
6170bb7b0ad1: Download complete
9cd978db300e: Pulling fs layer

~~(省略)~~~
```


さて。
イメージをDLしたり、コマンドを実行する方法はわかってきたので、
次はコンテナに入って色々インストールしたいですね。


```bash
docker search centos
docker pull centos

docker run -i -t centos /bin/bash
```

Dockerは実行が終わるとコンテナを破棄します。
つまり、docker run して実行したコンテナ内でyum install してもそこでの更新内容はそのままでは永続化しません。

どうするかというと、破棄されたコンテナをcommitします。



## コンテナをコミットする

ps -a で破棄されたコンテナ一覧を表示します。

```bash
 % docker ps -a | grep yuto/centos
dd9f0ea87b53        yuto/centos:latest         /bin/bash              12 minutes ago      Exited (0) 18 seconds ago                            sick_pare
91838e9fe69e        yuto/centos:latest         /bin/zsh               12 minutes ago      Exited (1) 12 minutes ago                            stupefied_galileo
ce7f246aff5e        yuto/centos:latest         /bin/bash              16 minutes ago      Exited (0) 12 minutes ago                            jovial_wilson
c50b9806da14        yuto/centos:latest         /bin/zsh               16 minutes ago      Exited (1) 16 minutes ago                            hopeful_ritchie
10b4e36d9b0c        yuto/centos:latest         /bin/bash              17 minutes ago      Exited (127) 17 minutes ago                          agitated_heisenberg
679b45079d48        yuto/centos:latest         /bin/bash              18 minutes ago      Exited (0) 17 minutes ago                            sleepy_torvalds

```

直前まで使っていたコンテナを選んで、commitします。

```bash
 % docker commit -m "installed ruby1.8" dd9f0ea87b53 yuto/centos:ruby
be253673f2fe7fa111b968238be28515af96c2ca6b626f9e135c0b8173762fed
```

イメージを一覧表示してみると、直前にコミットしたイメージが表示されています。

```bash
 % docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yuto/centos         ruby                be253673f2fe        11 seconds ago      561.1 MB
yuto/centos         latest              7139c761e6d8        20 minutes ago      297.6 MB
<none>              <none>              fc6e74639270        20 minutes ago      297.6 MB
<none>              <none>              0232356d9a18        7 days ago          171.3 MB
<none>              <none>              2e68994ad893        7 days ago          169.4 MB
<none>              <none>              3db9c44f4520        8 days ago          183 MB
centos              centos6             0b443ba03958        13 days ago         297.6 MB
centos              latest              0b443ba03958        13 days ago         297.6 MB
jonsharratt/rails   -m                  b83713cae3ff        8 months ago        157 MB
jonsharratt/rails   latest              dc8c65306dac        9 months ago        506.6 MB
dhrp/sshd           latest              2bbfe079a942        10 months ago       321.8 MB
dhrp/sshd           -m                  c8a2228805bc        10 months ago       292.3 MB
learn/tutorial      latest              8dbd9e392a96        12 months ago       128 MB
centos              6.4                 539c0211cd76        13 months ago       300.6 MB
```

コミットしたコンテナを動かしてみます。

```bash
 % docker run -i -t yuto/centos:ruby /bin/bash
bash-4.1#
bash-4.1# su
[root@bf98c35cd07e /]# ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

```

さて。
これでDockerのコンテナにオレオレ実行環境を構築する流れは理解できました。
bash経由でコンテナを実行、終了後プロセスの一覧からタグ付けてCommit。ですね。

さてさて。
でもこの手順、正直めんどいですね？
そんなときこそ **Dockerfile** の出番ですが、今日はこの辺にしておきます。



## 参考

こちらの記事がわかりやすく、非常に参考になりました。

* [仮想環境構築に docker を使う](http://apatheia.info/blog/2013/06/17/docker/)
* [これから始める「DockerでかんたんLAMP環境 for CentOS」](http://knowledge.sakura.ad.jp/tech/1811/)


公式のチュートリアルは実際にコマンドを叩いて教えてくれるんですが、
今回のように何も知らない状態から、Docker使ってこうしたい！と思っていた自分にはちょっと理解しずらかったです。
ただ、コンテナの概念とかしっかり理解する必要があるので、上に挙げたリンクの記事やチュートリアルを触りながら感触をつかんでくのがいいのかもしれません。