Dockerハンズオン

![docker.png](https://qiita-image-store.s3.amazonaws.com/0/108367/d4c73035-aa9f-854b-8c4e-3e7d56c7b18d.png)

#記事の背景
認知度が高まっているdockerについて概要を理解し、実際に動作する様子をハンズオン形式で体験するためのもの
Dockerそのものの説明は参考記事がいっぱいあるので割愛します！！

#Docker概要
## Dockerとは？
Dockerは仮想化技術の中の１つである「コンテナ型仮想化」を実現する仕組みのこと

## 仮想化技術？
仮想化技術には３つの種類がある

- ホスト型
- ハイパーバイザ型（TEOSはコレ）
- コンテナ型

図解で詳しく解説されてる記事は[こちら](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#%E4%BB%AE%E6%83%B3%E5%8C%96%E6%A6%82%E8%A6%81)

##Dockerのメリット
- コンテナを共有することで誰でも同じ環境を構築できる
- OSが不要なのでホスト型より動作が軽い
- 多くのコンテナイメージが提供されている
- ホスト型に比べてお手軽にセットアップできる

###参考記事
[【図解】Dockerの全体像を理解する -前編-](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)
[いまさらDockerに入門したので分かりやすくまとめます](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)

#Dockerを動かしてみる

##Docker Desktopのインストール
Docker社はWindowsやMacなどのコンシューママシンでもDocker環境を構築できるようにデスクトップ版アプリを提供している
https://www.docker.com/products/docker-desktop

今回はMac版をインストールする
https://hub.docker.com/editions/community/docker-ce-desktop-mac
※ダウンロードにはDocker Hubのアカウントが必要なので未登録の人は登録しましょう

dmgファイルがダウンロードされるのでインストールする

##Docker Desktopの起動
インストールされたDocker DesktopはLaunchpadに入っているのでそれをクリックして起動する
<img width="181" alt="スクリーンショット 2019-04-04 10.04.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/108367/ca51d0a3-e2bf-b917-1e8e-50540bec34f8.png">

起動すると上部のクイックバーにDockerが追加される
<img width="249" alt="スクリーンショット 2019-04-04 10.05.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/108367/9ee331ce-cf3e-a06d-e172-b89568f6e9b8.png">

preferenceでいろいろ設定できる。proxy環境下であればここで先に設定しておく必要がある
<img width="505" alt="スクリーンショット 2019-04-04 10.07.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/108367/85511ff5-6165-567f-6e25-edc31bd0fa3f.png">

###Dockerが動いていることを確認する
Docker Desktopが正しく起動しているかを確認するために以下のコマンドを実行する

```
$ docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 18.09.2
...
```

正しく起動していれば起動しているdockerの情報が出力されるが、起動できていない場合には下記のようなエラーメッセージが表示される

```
$ docker info
Error response from daemon: Bad response from Docker engine
```

## Nginxを起動する
Docker Engineの起動が確認できたところでさっそくDocker Imageを利用してNginxを起動してみる
以下のコマンドを実行するだけで簡単にNginxが起動できる
Docker Imageが保持されていない場合はダウンロード処理が実行される

```
$ docker run --name hogehoge -d -p 8080:80 nginx
```
--name:　任意のイメージ名を指定する
-d:　デタッチモード　コンテナ実行時にバックグラウンドで起動する事ができる
（deamonのような常駐のプログラムでつかう)
-p　ホストのポート番号：コンテナのポート番号：　Webで叩くポート番号は実はコンテナのポート番号と紐付いてますよ。という宣言。

### 実行結果
`localhost:8080` にアクセスしてみるとこんな風にNginxが起動できていることが確認できる
<img width="1226" alt="スクリーンショット 2019-04-09 16.02.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/108367/15063405-e617-2bb5-2eb4-8e35e2e61778.png">

## Nginxを終了する
さきほど起動したNginxを終了してみよう
`-d` のコマンドを用いて起動したため、コンソール上には何も表示されていないことになっている
Nginxのプロセスが起動していることを確認するために以下のコマンドを実行する

```
$ docker ps
```

###実行結果
実行してみると`STATUS`の表示で`UP`と表記され起動中であることがわかる

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
2feb4351fdb6        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up About a minute   0.0.0.0:8080->80/tcp   hogehoge
```

次にプロセスを停止するためにコンテナ停止のコマンドを実行する

```
$ docker stop hogehoge
hogehoge
```
ここで再度プロセスを確認してみるとさきほど起動していたプロセスがなくなっていることがわかる

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 
```

unixのプロセスと同様に`-a`オプションを用いて存在するプロセスを確認してみると、nginxのプロセスがきちんと停止していることが確認できる

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
2feb4351fdb6        nginx               "nginx -g 'daemon of…"   6 minutes ago       Exited (0) 2 minutes ago                                       hogehoge
```
もちろん画面も停止している
<img width="1217" alt="スクリーンショット 2019-04-09 16.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/108367/e73a1a76-49e4-c45b-c439-4f0287b71f71.png">

##カスタムイメージを作成するには？
前項ではnginxのDocker Imageをダウンロードしてきてそのまま実行することで起動を確認した
基本的にこのコンテナ内の資材を編集することでnginxをカスタマイズしていくことができるがそこで設定した情報はそのコンテナの中に閉じてしまうため、Dockerのメリットで記述した「**コンテナを共有することで誰でも同じ環境を構築できる**」から離れてしまう
そこで**Dockerfile**を利用することでカスタマイズしたDocker Imageを作成する方法がある

###Dockerfileとは？
公開されているDockerイメージに加えて必要なパッケージやアプリ、各種設定を含んだDockerイメージを自分で作成して使用するために記述する設定ファイルのこと

###Dockerfileの作成
下記記事のなかでDockerfileの作成からビルド、Docker Hubへの登録までの一連の流れが確認できるため割愛
[Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)

#終わりに
Docker Hub上には様々なコンテナイメージが存在しており、今回のように簡単に起動できるものも多くあるのでぜひ手元でいろいろ試してみましょう

**docker-compose**による複数の組み合わせ環境の実現などはまたどこかの機会で。。。