Docker 入門　Dockerの説明からhello-worldまで

## Dockerとは
Docker社が提供しているコンテナ型のアプリケーション実行環境
Go言語で書かれている

## コンテナ型?
アプリケーション実行環境の構築には２パターンある。
・ ハイパーバイザー型
・ コンテナ型


###ハイパーバイザー型
ホストと仮想環境をつなげる　役割としてハイパーバイザーというのが存在している。
このハイパーバイザーでCPUの割縁とかを行っている。
ホストOSと仮想マシンが隔離された状態である。
そのため、仮想マシンには任意のOSをいれることができる。(WindowsにLinuxとか)

OSをいれているためファイルサイズも大きく、起動も遅い

###コンテナ型
Docker Engineというものを介して行われる（ハイパーバイザーの代わり）
ゲストOSを持たず、ホストOSのカーネルを使用して特定のプログラムを実行する。
Linux, CentOS等のイメージを入れることができるが、ごっそりOSをいれているのではなく、ホストOSのカーネルを使用して上記OSのコマンドをつかえる　ようにしている
ハイパーバイザー型と異なり、WindowｓでLinuxを動かすようなことはできない。


## ハイパーバイザー型とコンテナ型の比較

###仮想化のオーバーヘッド
オーバーヘッド: ある処理を実行するのに間接的にかかるコスト
####ハイパーバイザー型
* リソース（CPUの使用率等）を大きく使う、起動、停止に時間を要する。

####コンテナ型
* コンテナをアプリケーション実行に必要なものだけを含み、ホストのカーネルを実行するため、動作が早くリソースの使用率を減らすことができる。


###アプリケーション実行の再現性
####ハイパーバイザー型
* 仮想マシンの環境の違いによりアプリケーションで不具合が起こることがある。
 
####コンテナ型
* 特定のアプリケーションを動作させるために必要なものはDockerイメージにまとまっているため、同じコンテナを起動する場合は環境が変わっても動作する

###OSの自由度
####ハイパーバイザー型
* 好きなOSを使用することができる。

####コンテナ型
* コンテナはホストSOのカーネルを使用して動作するため、カーネルをサポートしていないOSをうごかすことはできない

###分離レベル
####ハイパーバイザー型
* ハードウェアレベルでの仮想化が行われているため、マシンに侵入された際も、影響が及びにくい。

####コンテナ型
* ホストOSの１プロセスとして機能するため、分離レベルが引く
* 不用意なパッケージ等のインストールは避けるべき
* Publicで公開しないようにする


##Dockerのインストール
Dockerの公式サイトからダウンロード
https://www.docker.com/

アプリケーションフォルダに移動して、起動させる
<img width="724" alt="スクリーンショット 2018-09-27 0.47.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/253092/d2c36b61-9ef4-dd7a-cb05-fd1537d5570f.png">

ナビゲーションバーにDockerのマークがあったらOK
<img width="450" alt="スクリーンショット 2018-09-27 0.47.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/253092/b18d507a-9663-3c78-7754-4942526f9129.png">

＊　ログイン等の設定もあるが、一旦スキップ。


##hello-workdを表示させてみる

ターミナルにて下記コマンドを実行

```
$docker run hello-world
```

すると、うひゃ～といろいろ出てくる
おめでとうございます！成功です。

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

```
とりあえずもう一度実行してみる

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

さっきより行数が減り、そして処理も早くなった！

これはどういうことか！？
１回目と２回目の差分に注目！！

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
```

hello-worldイメージがローカルにないので、`library/hello-world`からPullしてきてくれています。

逆に２回目は、hello-worldイメージは１回めでローカルにもってきてあるため、上記の時間が削減された。


ということで、

```
$docker run hello-world
```

というコマンドには、
ただ実行するだけでなく、

```
docker pull    イメージの取得
docker create　　　　コンテナの作成
docker start　　　　　　コンテナの起動
```

が含まれてる。
そして、２回目の実行では、pullとcreateの時間がカットされたことになるのです！！


##感想
意外とサクッとコンテナ作れてビビったｗ
なぜDockerが良いのかというのを今後のレッスンを通してより深く理解できたらと思う。

##参考
ゼロからはじめる Dockerによるアプリケーション実行環境構築
https://www.udemy.com/docker-k/