目指せ文系からの一流エンジニア！初心者のDocker勉強会

はじめまして、私は文系学部に通っている大学４年の@sivertigoと申します。
まったくもってプログラミングは未経験ですが、あるIT企業から内定をいただいたため、ITエンジニアになるための勉強をはじめました。先輩から勉強会という形でたくさんのことを学ばせていただいているので、せっかく学んだことを忘れないよう、備忘録として残しています。
自分の理解が間違っていたらご指摘ください。。。

第一回（5/12）の勉強会ではざっくり言うと
・dockerとは何者なのかを勉強して、
・dockerを公式サイトからインストールし、
・docker machineをつかってみて
・ubuntuをdockerを使って立てて
・vimをインストールし
・rubyの簡単なコードを動かすところまで行いました。

以上が今回の記事の内容となります。


***
#dockerとはなんぞや？
![Kobito.meazo9.png](https://qiita-image-store.s3.amazonaws.com/0/117369/96b49def-8caa-c17c-61cb-be06d1cf1e6f.png "Kobito.meazo9.png")

dockerとは、ひとことで言うと仮想環境を簡単に立てることができる便利ツールのようです。<br>
正直学ぶ前まではとっつきにくい超難しいツールなんだと思ってました。<br>
だって、コンテナとかイメージとか仮想化とか、語感からして難しそうで・・・。<br>

実は仮想環境については少しだけ事前知識はありました。先輩(@sadayuki-matsuno)にmacbookを貸していただく前まではオラクル社が開発しているVirtual Boxを使ってwindowsからubuntuを使えるようにしてプログラミングの勉強をしようかなと考えて、試行錯誤をしておりました。<br>
でも、自分の愛用のノートパソコンだとうまく立ち上がらず、失敗する原因もよくわからないまま全てを諦めました。笑<br>

そんなVirtual Boxとdockerは何が違うのでしょうか。
その違いを表したイメージ図を以下のサイトに確認しました。

![Kobito.6J5OdT.png](https://qiita-image-store.s3.amazonaws.com/0/117369/9afc721e-47d7-b56f-42a1-a90708a6a7a7.png "Kobito.6J5OdT.png")
引用元URL:[【Docker入門】コンテナ型仮想化技術Dockerを使ってみた](http://lab.sonicmoov.com/development/docker-tutorial/)
<br>dockerは右のコンテナ型にあたりますが、ライブラリ、ミドルウェア、アプリをまとめて立ち上げるイメージですかね。手間がかからなさそうな印象を受けます。（あまりよくわかっていません。）
***
#docker利用のメリット
　さて、dockerを利用するとどのようなメリットがあるのでしょうか。
　docker導入のメリットについては以下のQiitaに掲載された記事がよく書かれているため、参照しました。


こちらによるとメリットは以下のとおり。
>* <dl><dt>同一性</dt>
<dd>複数人で開発する際に、環境の差が生まれない。</dd>
* <dl><dt>カプセル化</dt>
<dd>アプリケーション込みの環境をコンテナというカプセルに隠蔽することができる。<br>
コンテナという単位に対するテストが可能に。<br>
コンテナを捨てる・再生成するのが容易。</dd>
* <dl><dt>ポータビリティ（一貫性とも）</dt>
<dd>開発に使ったコンテナをCIでテストできる。</dt>
CIでテストしたコンテナをサーバーにデプロイできる。<br>
デプロイしたコンテナをスケールできる。<br>
</dl>

[開発におけるDocker導入のメリット](http://qiita.com/minodisk/items/5ffd20588b995523756f"開発におけるDocker導入のメリット")<br>
　特に開発環境の差異が原因で起こるエラーがなくなることが大きいメリットのような印象を受けました。これは、将来エンジニアになってから重宝するに違いないですね！勉強のやる気もグンと上がります！！
***



#dockerをインストールする
　今回自分が使っている環境はOS X 10.10.5です。dockerをos xにインストールする方法については、公式文書を参考にしました。
https://docs.docker.com/engine/installation/mac/
<br>
これに従いながらDocker Toolboxのページに飛んで、mac用のDownloadボタンから押して素直にインストールしました。
それからiTermを開いてどうにかこうにかすると

![Kobito.su90yF.png](https://qiita-image-store.s3.amazonaws.com/0/117369/d4652560-4ac5-c6c9-e451-d684e8a37bcb.png "Kobito.su90yF.png")

こんなかんじの画面が開きました。（上記画像は公式サイトからの引用）これでdockerが使えるようになりました。
<br>
ためしにdocker -vとdocker-machine -vを打ってみてバージョン確認をすると、きちんと返ってきます。
![スクリーンショット 2016-05-13 17.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/117369/58069c8d-40af-5d3f-2b9c-202bb30d49be.png "スクリーンショット 2016-05-13 17.56.08.png")
***
これで、iTerm(bash)からdocker-machineやdockerのコマンドが打てるようになりました。


#Docker machineとDockerの違い
ここまでで、docker-machineとdockerという二種類の別のコマンドが出てきました。
その二つは何が違うんだろうと疑問に思いますよね。以下、私が初学者なりに解釈してまとめてみました。間違いがありましたらご指摘ください。


* docker<br>
　実際にコンテナを作ったり、イメージを使ったり作ったりするツール。
<br><br>
* docker-machine<br>
　dockerが動くような仮想マシンを作って、管理するためのツールです。docker-machineコマンドを使ってdockerを実行させるサーバや仮想マシンを管理します。dockerはlinux上で動く仕様になっているため、MacやWindowsユーザーの場合、直接dockerだけをインストールしても使用することができません。linux以外のOSで動かすためにはdockerが動くための仮想マシンを立ててその上に仮想OSを立てる必要があるみたいです。

<br>なのでdockerを使う前にdocker-machineを使う必要があります。

#Docker machineで仮想マシンをつくる
　ということで、docker-machineコマンドを使ってdockerを動かすための仮想マシンを作っていきたいと思います。

まず、何も操作していない状態でdocker-machine lsコマンドを打ってみます。<br>
そうすると、現在のdockerマシン一覧が表示されます。

```このコマンドを打つ
docker-machine ls
```

![Kobito.iHbOWl.png](https://qiita-image-store.s3.amazonaws.com/0/117369/dab98b72-e3ab-9ec9-d2bb-9dc76ab38b5d.png "Kobito.iHbOWl.png")

ここでは自分がすでに作っていた'default'という名前の仮想マシンがありますが無視してもらって結構です。何も作成しない状態であれば、<br>

```
NAME        ACTIVE   DRIVER       STATE     URL    				SWARM   DOCKER    ERRORS
```

とだけ表示されるはずです。ここでは、何もマシンが作成されていないことを確認しました。<br>
<br>次に新しくdocker machineを作成していきます。

docker-machine createのコマンドを使います。これを打ち込むと新しく仮想マシンが作成されます。ここでは仮想環境をvirtualboxを利用して構築しています。名前はなんでも良いのですが、今回は私がよく使う名前sivertigoで作っています。


```このコマンドを打つ
docker-machine create --driver virtualbox sivertigo
```

![Kobito.kIlffT.png](https://qiita-image-store.s3.amazonaws.com/0/117369/49367659-65a8-89ad-02cb-0ec57d7cefc9.png "Kobito.kIlffT.png")


これで、sivertigoという名前でマシンが作成されました。もう一度lsコマンドでマシンのリストを確認してみます。

```このコマンドを打つ
docker-machine ls
```

![Kobito.5Cc3S6.png](https://qiita-image-store.s3.amazonaws.com/0/117369/f7d937ad-272b-5ffc-cce6-d22c09ea5af9.png "Kobito.5Cc3S6.png")


下の方に新しく"sivertigo"という名前の仮想マシンができていますね。<br>ただ、作っただけではこのマシンはきちんと動いてくれません。きちんと作成した仮想マシンとホストマシンを連携させるように環境を設定しなければなりません。

```このコマンドを打つ
docker-machine env sivertigo
```

![Kobito.mEEHiZ.png](https://qiita-image-store.s3.amazonaws.com/0/117369/9b8d7946-552f-d727-c3be-01f5f79fa91b.png "Kobito.mEEHiZ.png")


これでdockerが動くときにsivertigoマシンに呼びかけるように設定するにはどうすればいいか表示されました。一番最後の行に書いてあるevalコマンドを打つことでこの４行の設定を一気に行います。

```このコマンドを打つ
eval $(docker-machine env sivertigo)
```
これで環境設定は終わりです。


#Linux(ubuntu)をdockerにいれる
これで、ようやくdockerを使えるようになりました。ここからdockerを使うためにイメージをインストールしてコンテナを作っていきますが、一旦ここで初期段階ではイメージもコンテナも何もないことを確認しましょう。

```このコマンドを打つ
docker ps 			#コンテナをリストで表示する
docker images　		#イメージをリストで表示する　
```

![Kobito.FiysFA.png](https://qiita-image-store.s3.amazonaws.com/0/117369/8d3c70d2-4095-a606-e9fa-9d39b734aef0.png "Kobito.FiysFA.png")


以上、イメージもコンテナも何もありません。

#イメージって？コンテナって？

ここまでで、docker machineを使えるようにしただけではイメージもコンテナも何もないことを確認しました。


ここでド文系な私が思うことは一つ。
**コンテナとかイメージとか言われても全く想像がつかない・・・。**
<br>ということで簡単に今回私が先輩に習ったコンテナとイメージのイメージを書いておきます。
以下ではOSのubuntuをイメージとしてコンテナを作る例を図示しています。

![Kobito.a0PdDS.png](https://qiita-image-store.s3.amazonaws.com/0/117369/4557aca0-e739-0a87-c024-893572afabda.png "Kobito.a0PdDS.png")


こんな感じであってますでしょうか。
**イメージ**はコンテナを作るための元になるデータで、
**コンテナ**はイメージから作られたインスタンスです。<br>


一つのイメージから複数のコンテナを作ることができるってかんじです。
コンテナをまたイメージとして固めることもできるらしいのですが、その辺はまだ私が全く使用しておらず理解してないので割愛させていただきます。

(ちなみにどんなイメージがあるのか気になったので調べてみました。参考にどうぞ。)
[docker認定イメージ一覧](http://www.ossplaza.com/oss_info/docker/docker_image_list.html)

***

#Dockerで最新のubuntuを使うには
ここからは、ubuntuのイメージをダウンロードしてきて、それをもとにコンテナを一つ作ろうと思います。

工程としては、
・ubuntuイメージをdockerにpull(ダウンロード)する
・ubuntuイメージを元にコンテナをrun（起動）する
といった感じです。
***
#dockerにubuntuイメージをpullする

```このコマンドを打つ
docker pull ubuntu:latest
```

![Kobito.cKIA39.png](https://qiita-image-store.s3.amazonaws.com/0/117369/2786a0b1-f828-563d-1093-829b0d872552.png "Kobito.cKIA39.png")


これでubuntuが使えるようになったはずです。
きちんとubuntuのイメージがpullされたかどうかを再度docker imagesコマンドで確認します。

```このコマンドを打つ
docker images
```

![Kobito.uuPlC7.png](https://qiita-image-store.s3.amazonaws.com/0/117369/a2fe228f-a894-7871-9153-f6158072332c.png "Kobito.uuPlC7.png")


これで、正常にubuntuイメージが作成されてリストに表示されていることがわかりました。
***
#イメージからコンテナを作成する

次は無事取得できたイメージを使ってコンテナを作成していきます。

以下のコマンドを入力することで最新のubuntuイメージを元に、"SAMPLE"という名前のコンテナが作成されます。

```このコマンドを打つ
docker run -d -it --name SAMPLE ubuntu:latest /bin/bash
```

![Kobito.z3VgZ5.png](https://qiita-image-store.s3.amazonaws.com/0/117369/9f059c1a-7d03-c0f5-5f52-844fb4b08aa9.png "Kobito.z3VgZ5.png")



このコマンドはどういうことかというと

```
docker run [オプション] [--name ｛コンテナー名｝] ｛イメージ名｝[:｛タグ名｝] [コンテナーで実行するコマンド] [引数]
```

という中身になっています。オプションには`-i``-t``-d`が使われています。

>```【参考】オプションコマンドの意味
d: バックグランドで実行
i: コンテナの標準入力を開く
t: ttyを確保する
p: ポートフォワード
```
引用元Qiita記事:[Dockerでコンテナ作成/起動/停止/自分用Image作成](http://qiita.com/tomy103rider/items/bf4042ad2082a23f393b)

そして、コンテナを作成したことを確認するために`docker ps`でコンテナ一覧を確認します。

```このコマンドを打つ
docker ps
```

![Kobito.yApIG7.png](https://qiita-image-store.s3.amazonaws.com/0/117369/597b9682-4ae0-5250-a364-0528e48cacca.png "Kobito.yApIG7.png")

<br>
こんな結果になります。CONTAINER IDはテキトーに作成されるようです。

***
#作成したコンテナに接続して使ってみる

SAMPLEコンテナができました。
次はコンテナに接続してみます。
以下のコマンドを打つと、作成したコンテナの中に入ることができます。

```このコマンドを打つ
docker exec -it SAMPLE /bin/bash
```

![Kobito.0n4Wyw.png](https://qiita-image-store.s3.amazonaws.com/0/117369/06c720c9-efdc-ef90-13a0-bb761988d1c2.png "Kobito.0n4Wyw.png")


こんな感じでコンテナの中に入れましたか。
この中はもう既に仮想のubuntuOSで動いてるサーバーです。好き勝手いじり放題。
<br>
同じ方法で作成したコンテナであれば、ほかの人と開発環境を同じにできるので、
コードを書いたときに「あれっ、なんでそっちでは動くのにこっちでは動かないの？」なんてことがありません。<br>こうしてコンテナを作って作業をするメリットは実際に開発やテストをしているエンジニアにとっては言わずもがなですが、
**環境の違いに気を配るなんて、IT初心者にとってはなおさら至難の技。<br>環境の違いによる無駄な苦労がなくなるのは本当に助かります！！最高です！！**

***
#vimをコンテナ内でインストールしてみる

次に入ったコンテナの中でvimというエディタをインストールして使ってみたいと思います。v
Linux上で何かソフトウェアをインストールするには　`apt-get install ソフト名`というコマンドを使います。それに従ってコマンドを打ってみましょう。

```このコマンドを打つ
apt-get install vim
```
![Kobito.XAtK9K.png](https://qiita-image-store.s3.amazonaws.com/0/117369/22921da4-dda3-eb68-c89a-ecfb403a660c.png "Kobito.XAtK9K.png")


はい、打ち込みましたがエラーがでました。
`E: Unable to locate package vim`と言っています。
このエラーは以下のコマンドを打ってアップデートをすることで解消できるようです。
（なぜ解消されるのかは私自身は全く理解しておりません。どなたか教えてていただけると幸いです。）

```このコマンドを打つ
apt-get update
```

```このコマンドをもう一度打つ
apt-get install vim
```
こんなかんじになります。
![Kobito.VgVdUL.png](https://qiita-image-store.s3.amazonaws.com/0/117369/067b8590-afd7-8b76-fd54-2dc2019c7b6d.png "Kobito.VgVdUL.png")

こんな感じで無事にvimがインストールされたと思います。
***
#rubyをコンテナ内で動かしてみる
今回の勉強会でやったことの仕上げです。rubyをインストールして使ってみます。
先ほどと同様にrubyも`apt-get install`を使ってインストールします。

```このコマンドを打つ
apt-get install ruby
```
![Kobito.TB7WM1.png](https://qiita-image-store.s3.amazonaws.com/0/117369/73145982-77f3-ef8a-bf72-54c2622e506d.png "Kobito.TB7WM1.png")

こんな感じでインストールが進んでいきます。完了するはずです。できたかどうか確認するために

```このコマンドを打つ
ruby -v
```
を打ってみてください。

![Kobito.Q0hyvc.png](https://qiita-image-store.s3.amazonaws.com/0/117369/ad8517ee-3add-c574-2040-d4a4e48db75d.png "Kobito.Q0hyvc.png")

きちんと返ってきました。現時点(2016/5/18)で最新バージョンのrubyがインストールされました。

試しに自分のホームディレクトリ上にsampleディレクトリを作成し、
その中にsample.rbというファイルを作って実行してみます。

```このコマンドを打つ
cd 					#ホームディレクトリに移動
ls 					#ホームディレクトリに何もないことを確認
mkdir sample 		#sampleという名前のディレクトリを作る
ls					#sampleディレクトリに何もないことを確認
cd sample 			#sampleディレクトリに移動
vim sample.rb		#sample.rbという名前のファイルをvimエディタで作成＆編集する
ls 					#sample.rbが作成できたことを確認
ruby sample.rb		#rubyでsample.rbを実行
```
![Kobito.7aNYff.png](https://qiita-image-store.s3.amazonaws.com/0/117369/5737eb3f-2fbe-1c14-f6dc-ef8743aa8fba.png "Kobito.7aNYff.png")

こんな感じになるとおもいます。ちなみに、"sample.rb"の中身はこんな感じです。

![Kobito.jOEvnx.png](https://qiita-image-store.s3.amazonaws.com/0/117369/7147d63c-da0e-bf8d-d5c4-5b5bf0870ae9.png "Kobito.jOEvnx.png")

***
#コンテナへの接続を切る
```このコマンドを打つ
exit
```

![Kobito.azuhpp.png](https://qiita-image-store.s3.amazonaws.com/0/117369/4f8b821e-3c49-f43b-4fd8-c8800552621f.png "Kobito.azuhpp.png")
これでいつものローカルサーバーの中に戻りました。
以上、Docker勉強会の内容まとめでした。