【学習基盤としてのDocker】Dockerでとっかかろう

次回 [【学習基盤としてのDocker】Docker何するものぞ　ファイルシステム編](http://qiita.com/fireowl11/items/d1cf03aff691f9c0eff9) ≫

# ”とっかかり”のハードル
新しい技術やアプリケーションを見つけると試したくなるのが人情ですが、ライブラリを集めたりインストールしたり、アンインストールしたもののドットファイルやドットディレクトリが残って何だか汚かったり、後のバージョンをインストールする時に邪魔になったり、あれこれ気に病む内に出会った頃のときめきが薄れたり…。
今やそうしたハードルは過去の物になりました。ここでは如何にImmutable Infrastructureが（というよりDisposable Componentsが）とっかかりのハードルを除去するか、仮想化のイメージは何となくわかるけど使った事は無いという人でも簡単に”とっかかれるように”説明していきたいと思います。

* 対象読者：日頃は公私とも根っからのWindowsユーザーでLinux未経験、ただ仮想マシンを使えばWindows上で別OSが動く事ぐらいは知っている人。
* 目標：Windows上のdockerを使ってLinux系OS上で様々な技術を試せる、その導入部分までの誘導。
* 環境：Windows7 Ultimate SP1 64bit。基本的に他エディションでも8でも8.1でも問題無いはず。[32bit？何それ本気？](https://github.com/boot2docker/windows-installer/issues/65)

# docker のインストール

[Install docker for Windows](https://docs.docker.com/windows/step_one/)
"download the Boot2docker for Windows installer"からインストーラをダウンロード、実行します。コンポーネントはここではFullを想定して進めます。PATHやRebootはお好みで。
[![docker-installer.png](https://qiita-image-store.s3.amazonaws.com/0/42843/1379b161-62ec-482a-07f4-e3d7335862cd.png)](https://qiita-image-store.s3.amazonaws.com/0/42843/1379b161-62ec-482a-07f4-e3d7335862cd.png)

PC再起動後、Boot2docker Start を起動するとコマンドプロンプトが起動し、boot2dockerのVMが起動しIPが割り振られた旨のメッセージが流れて、「$」プロンプトが出た所で止まります。ここで `docker run hello-world` でdockerの動作確認ができます。[^1][^2]
`IP address of docker VM:`のIPアドレスは後で使うので控えておいてください。後からコマンドプロンプトで`boot2docker ip`を叩いても確認できますが。

<sub>実はこの時の状況は何気にややこしくて、「"boot2docker started"だし見慣れないプロンプトが出てるからこれがboot2docker(=Linux)環境か…」と思いきやそうではありません。ホストであるWindows環境でMinGWのshシェルが動作しているだけです。</sub>


# MobaXtermを使う

そのままMinGW上で作業を続けても良いのですが、まあなにせコマンドプロンプトですよ。ええ。使い辛いです。折角なのでまともなコンソール／ターミナルアプリを導入しましょう。
MobaXterm自体の紹介はこちらのアツい記事に譲ります。：[MobaXterm を ssh/mosh/X11 クライアントとして使う（Windows）](http://qiita.com/mkasahara/items/c029154b5436913b20e0)
私はWindowsのコンソールは[cmder](http://gooseberrycreative.com/cmder/)、sshクライアントは[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)を使っていましたがMobaXtermを知ってからはこれ一本に絞りました。
閑話休題。boot2docker は起動するとホストOSのポート2022からsshをフォワードします。ユーザはdokerで、`~/.ssh/id_boot2docker` の鍵認証なので
[![b2d.png](https://qiita-image-store.s3.amazonaws.com/0/42843/a3f1eb8b-3ef7-8287-a351-90584727e226.png)](https://qiita-image-store.s3.amazonaws.com/0/42843/a3f1eb8b-3ef7-8287-a351-90584727e226.png)[![b2d2.png](https://qiita-image-store.s3.amazonaws.com/0/42843/42da6c6b-bc70-954e-bf4c-5be1dd7c5970.png)](https://qiita-image-store.s3.amazonaws.com/0/42843/42da6c6b-bc70-954e-bf4c-5be1dd7c5970.png)

こんな感じで接続できます。PCを起動した直後等、boot2dockerが起動していない場合は「Boot2docker Start」を起動する必要が有ります。sshで接続出来たらMinGWの方のウィンドウは閉じてしまってOKです。

# 以上！

後はひたすらgithubリポジトリから触ってみたい技術のDockerイメージを漁り、その起動方法をチェックするのみ。
`docker run -d -p 80:80 nginx` すればブラウザで http://[boot2dockerのIP] でnginxが起動している事が確認できます。
Jenkinsを触ってみたければ `docker run -d -p 8080:8080 jenkins` で http://[boot2dockerのIP]:8080 
RubyのREPLを動かしてみたければ `docker run -i -t ruby`
R言語を齧ってみたければ`docker run -d -p 8787:8787 rocker/hadleyverse` で http://localhost:8787 にRStudio
[![whole.jpg](https://qiita-image-store.s3.amazonaws.com/0/42843/5378efd0-bb5f-ab41-5355-ed98bf8fe641.jpeg)](https://qiita-image-store.s3.amazonaws.com/0/42843/5378efd0-bb5f-ab41-5355-ed98bf8fe641.jpeg)


最早何のインストールも不要。ホストOSにインストールしたのはboot2dockerだけで、他は一切汚れません。docker run 1つで何でも使い放題！

# 一通り触ったら

`docker run`するとその都度新しいコンテナ（仮想マシンのようなもの）が作られます。前回runした物とは別の空間なので前回書き込んだファイルやら何やらは何も残っていません。一度runしたコンテナは`docker stop`で止めて、2度目以降はrunではなく`docker start`で起動することができます。runのパラメータはイメージ名でしたが、stop/startのパラメータはコンテナID（コンテナ名でも可）であることに注意。これらは`docker ps -a`で確認します。

# それから

RStudioやRubyのREPLはともかく、Jenkinsはジョブは作れるもののプラグインとか何も入れてないしnginxに至っては"Welcome to nginx!"しか見てませんね。また、dockerのコンテナ内で行われた変更はどんどんコンテナイメージを太らせるのでストレージの圧迫が馬鹿になりません。その辺りの次の一歩はまた別の記事にて。
***
[^1]: Boot2docker Start で `Waiting for VM and docker daemon to start...` から動かなくなった場合は、スタートメニューからOracle VM VirtualBoxを起動→ boot2docker-vmを選択しメニューの 仮想マシン - 閉じる - ACPIシャットダウン でVMが終了するのを待つ。これで終了できなければ 閉じる - 電源OFF → 終了したらVBoxは閉じて再度Boot2docker Startを起動。これでも駄目な場合はboot2dockerのフルアンインストール・再インストールで上手くいくケースがある…らしいです。

[^2]: docker run hello-world が `Couldn't connect to Docker daemon` や `An error occurred ~~~ containers/create: x509: certificate is valid for ~` で失敗した場合の[Workarroundはこちら](https://github.com/iMerica/boot2docker/blob/7478aa99007241eef0e1d595ec7a8a04b2a1b9fd/doc/WORKAROUNDS.md)。`boot2docker ssh 'sudo /etc/init.d/docker restart'` ですが、恒久策ではなかったりなかなか面倒です。個人での学習用環境と割り切って使うなら `alias docker="docker --tlsverify=false"` でも良いかなと。