Windows 10 Hyper-Vユーザに送るDockerの解説

## この記事は？

Dockerの勉強を始めて1週間、Hyper-Vしか知らない同僚にDocker教えてくれと言われたので書きました。
せっかく勉強したのでQiitaで公開してみます。
誤り指摘やアドバイスがあれば、コメントをお願いします。

## 環境

* Windows10 version.1709
* Docker version 17.12.0-ce, build c97c6d6

## 用語説明

* Dockerイメージ
  仮想ディスク(＝.vhdx)。後述するDockerレジストリでDockerイメージを共有することができる。
  Dockerを使って何か作業する時のベースとなる。

* Dockerコンテナ
  Dockerイメージから差分ディスクを作って起動した仮想PC。
  1つのイメージから複数のDockerコンテナを作ることができ、それぞれの同時実行も可能。

* Dockerレジストリ
  仮想ディスクを共有するための共有フォルダ。
  Docker Hubという公式レジストリもあり、公式イメージとして、CentOSやUbuntuといったLinuxディストリビューションやNginxやHttpd、redisといったアプリケーション単位のイメージがある。
  自分で作ったイメージをアップロードすることもできる。
  オンプレミスなサーバとしても立てることができるらしい。

* Dockerfile
  Dockerイメージを作るためのソースコード。
  無理やりHyper-Vでいうと仮想PC作成後に実行するためのスクリプトファイルみたいもの。
  Hyper-Vで例えると、イメージから仮想ディスクを複製→VM起動→スクリプト実行→シャットダウンまでを一括で行って、新しい仮想ディスク(＝Dockerイメージ)を作ることができる。

## FAQ

* 要するにDockerって仮想PCみたいなもの？
  →仮想PCのようにも使えますが、どちらかというとアプリケーション単位でコンテナを作るほうが良いようです。
   そういう意味では、OSの機能まで含めてサイドバイサイドでアプリケーションを実行できるプラットフォームと呼ぶべきでしょうか。

* Windows on Dockerは？
  →できるようですが、まずはDocker入門としてここでは扱いません。
  タスクバーのDockerアイコンを右クリックすると「Switch to Windows Containers」というメニューがありますので、あとは自分でググってください。
  個人的にはWindows on Dockerはもう少し様子見です。

## コマンド体系

他にあるけど、基本ということで。

![Docker_Basic_Commands.png](https://qiita-image-store.s3.amazonaws.com/0/217768/d9533497-6650-bcee-e744-6ee59081f37a.png)


## 使ってみる

### 事前準備

1. Windows10を用意します。
2. Hyper-Vを有効化します。
3. [Docker for Windows](https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows)をインストールします。
   (Chocolateyパッケージもあったけど、インストール失敗しました(2018-02-13現在)。)
4. Dockerのアカウント作成とログイン・・・は不要だったはず。


### CentOSでbashを起動して、後始末まで

できるだけゴミを残さないようにがんばってみる。

#### 1.公式イメージをダウンロードする

Docker HubからCentOSのDockerイメージをダウンロードします。

```
C:\Users\user> docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Pull complete
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Status: Downloaded newer image for centos:latest
```

#### 2. ローカルのイメージの一覧

ローカルに保存済みのイメージ一覧を表示させます。
先ほどPullしたcentosがあります。

```
C:\Users\user>docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        5 weeks ago         207MB
```

#### 3.コンテナを作って起動

pullしたイメージをベースにコンテナを作って起動します。
起動するプロセス(/bin/bash)も引数に指定します。
-it はインタラクティブに操作する場合に指定します。

```
C:\Users\user> docker run -it centos /bin/bash
```


#### 4. 適当に触る

bashが起動するので、適当に触ります。
ほぼ空のCentOSなので本当に基本的なコマンドしか使えませんが。
終了は、コンテナが終了しちゃいますが、exitで抜けます。
「Ctrl+p」→「Ctrl+q」で終了せずに抜けることもできます。

```
[root@051c55f61ce6 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@051c55f61ce6 /]# ping -c 2 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.024 ms

--- localhost ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1033ms
rtt min/avg/max/mdev = 0.020/0.022/0.024/0.002 ms
[root@051c55f61ce6 /]# exit
exit

```

#### 5. コンテナ一覧

ローカルにあるコンテナ一覧を表示します。
先ほど起動したcentosのbashがあります。
-aをつけると終了済みのコンテナも表示、無しだと稼働中コンテナだけ表示されます。
CONTAINER ID (コンテナID)は重要なのではじめの数文字を覚えておきます。

```
C:\Users\user>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                   PORTS               NAMES
051c55f61ce6        centos              "/bin/bash"         3 hours ago          Exited (0) 3 hours ago                       clever_leavitt
```

#### 6. コンテナ削除

お試しで作っただけなのでコンテナは削除します。
引数はコンテナIDを指定しますが、他と識別できる初めの数文字で良いようです。

```
C:\Users\user>docker rm 05
05

C:\Users\user>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

#### 7. イメージ削除

使わずに残しておくとディスクを圧迫するので、不要なイメージは削除します。
後で使うなら削除しなくても良いですが。

```
C:\Users\user>docker image rm centos
Untagged: centos:latest
Untagged: centos@sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Deleted: sha256:ff426288ea903fcf8d91aca97460c613348f7a27195606b45f19ae91776ca23d
Deleted: sha256:e15afa4858b655f8a5da4c4a41e05b908229f6fab8543434db79207478511ff7

C:\Users\user>docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

```

### Dockerコンテナをサービスとして使う

上の例では、インタラクティブに操作していて、仮想PCのように使っていますが、
Dockerコンテナはサービスとしてバックエンドで起動するほうが一般的なようです。

ポイントは、「docker run -it 」ではなく「docker run -d」を使用します。

チュートリアル的に何か書こうと思いましたが、良い記事があったので、こちらを参考にしてください。

https://weblabo.oscasierra.net/docker-httpd-usage/