Docker（for Windows）で開発環境の構築を行う

# Dockerとは

説明が下手なのでググってください。とてもわかりやすい説明がゴロゴロあります。

## 導入のメリット

- **開発環境をコマンド一発でかんたんに構築できる**
- 複数人で開発するときに、環境の差が発生しなくなる
- バージョン違いやミドルウエア違いなどの複数の環境を、一つのホストマシン上で実行できる
- 本番環境もDockerで運用してしてしまえば、開発環境と本番環境との差が(ほとんど)なくなる

など

## 用語集

※「正確」より「わかりやすい」説明にしています。

|用語|説明|
|-----|------|
|コンテナ(container)|仮想OS…ではない。あたかも仮想OSが実行されているかのように動くプロセス。コンテナ同士は独立している。|
|Dockerイメージ(image)|コンテナの元となるファイル。イメージからコンテナを実行する。また、コンテナからimageを作成することもできる。|
|Dockerfile|Dockerイメージを作成するためのファイル。DockerfileをBuildすることで、Dockerイメージが作成できる。テキストで記述されており、共有が容易。ベースとなるOSや、そのOS上で実行するコマンドなどを記述しておく。DockerimageからDockerfileも作れなくはないが、|
|DockerHub|GitHubのDocker版みたいなもの。Dockerimageを管理している|

## それぞれの関係（イメージ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394995/195ece96-d9e3-52fe-5380-6db4d606e06f.png)

1. Dockerfileから`build`して、Dockerイメージを作成する（複数のイメージを別名で作成可能）
2. Dockerイメージを`run`して、コンテナを実行する（複数のコンテナを別名で実行可能）
3. コンテナを`commit`して、Dockerイメージを作成する（複数のイメージを別名で作成可能）
4. ローカルにあるDockerイメージを`Push`して、DockerHubにて管理する
5. Dockerファイルや、そのコマンド実行で必要なファイル群をGitHub上で管理して、DockerHubとLinkすることで、GitHubのソースからDockerHub上でDockerimageを作成できる

Dockerイメージは、DockerHub上で公開されているリポジトリから`pull`してくることで、ローカルマシン上で利用できるようにもなります。

# Docker For Windowsの導入
詳しいことは、[Dockerのホームページ](https://hub.docker.com/)、または[日本語ドキュメント](http://docs.docker.jp/windows/step_one.html)を参照してください。
ここでは一通りの手順を簡単に記載します。

## 要件
Windows10で、**Hyper-Vホストが動作する**環境であること（Windows10 homeはNGです）

## 手順
1. [Docker For Windows](https://docs.docker.com/docker-for-windows/install/)をダウンロードしてくる。
2. インストーラを実行する。
3. Hyper-Vが無効となっている場合は有効にする。コントロールパネルの[プログラム]-[Windowsの機能の有効化または無効化]から「Hyper-V」にチェックを付ける。
4. インストール完了を確認する。

```bat:バージョン確認
> docker version
```

出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394995/8cff99e0-5a80-c07a-dbd0-8f6f3064d064.png)
以上です。簡単ですね。

# よく使うDockerコマンド

## Dockerの一覧確認
```docker:dockerイメージの一覧
> docker images
```

```docker:コンテナの一覧
> docker ps [-a]
```
|オプション|説明|
|---|---|
|-a|停止中のコンテナも含めて表示する|


## Dockerイメージの作成（取得）
[日本語ドキュメント(build)](http://docs.docker.jp/engine/reference/commandline/build.html)

```docker:Dockerfileから作成
> cd C:\Users\[Dockerfileがあるフォルダ]
> docker build -t [image名]:[タグ名] .
```
|オプション|説明|
|---|---|
|-t|'名前:タグ' 形式でimageの名前とタグを指定|
|-m|構築コンテナのメモリ上限を指定|

```docker:DockerHubより取得する
> docker pull [DockerHubユーザーID]/[リポジトリ名]:[タグ名]
```
:[タグ名]の指定がない場合は自動的に`latest`タグのimageを取得してくる。

## Dockerイメージからコンテナの作成（実行）
**非常によく使うコマンド。**詳細は[日本語ドキュメント(run)](http://docs.docker.jp/engine/reference/commandline/run.html)を参照すると良い。

```docker:コンテナの作成（実行）
> docker run -it -p 80:80 -v C:\[コンテナにマウントしたいホストマシンのディレクトリ]:[コンテナ内のディレクトリ] --name="[コンテナ名]" [image名]:[タグ名] bash
```

|オプション|説明|
|---|---|
|-d|コンテナをバックグラウンドで実行する。(いきなり接続したくない場合に使える)|
|--ip=""|コンテナのIPアドレスを指定できる|
|-m|メモリ上限の指定|
|--name=""|コンテナに名称をつける|
|-p|コンテナのポートをホスト側に公開|
|--rm|コンテナ終了時、自動的にコンテナを削除する|
|-v|ホストマシンのディレクトリをコンテナにマウントする|

## コンテナの開始、停止
```docker
> docker start [コンテナID]
> docker stop [コンテナID]
```
[コンテナID]の部分は、[コンテナ名]でもOK。

## コンテナへの接続、離脱
```docker:コンテナへの接続
> docker attach [コンテナID]
```
[コンテナID]の部分は、[コンテナ名]でもOK。

```docker:コンテナからの離脱
キーボード操作 ctrl + P, ctrl + Q
```
離脱すると、ホストマシンのコマンドに戻ってくる。

## コンテナからDockerイメージを作成する
[日本語ドキュメント(commit)](http://docs.docker.jp/engine/reference/commandline/commit.html)

```docker
> docker commit [コンテナID] [イメージ名]:[タグ名]
```

## Dockerイメージやコンテナの削除
```docker:イメージの削除
> docker rmi [イメージID]
```
```docker:コンテナの削除
> docker rm [コンテナID]
```
[イメージID][コンテナID]は、それぞれ[イメージ名:タグ][コンテナ名]でもOK。

## その他
```docker:既存imageのタグを変更する
> docker tag [コンテナID] [イメージ名]:[タグ名]
```
[コンテナID]の部分は、[コンテナ名]でもOK。

# 参考
- [Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/)
- [Docker Hub](https://hub.docker.com/)