Docker Desktop for WindowsをWindows 10 Homeで使ってみた

## はじめに
こんにちは。ハセガワです。
弥生Advent Calendar 2020の記事として投稿しています。

個人の趣味として自宅でDocker Desktop for WindowsをWindows 10 Homeで使ってみました。
今回は、Docker Desktop for Windowsを使うにあたっての準備や、使ってみた感想などについて記事にしてみました。

## 自宅のWindows 10環境
・Windows 10 Home Edition
・64bit版　（※32bit版だと、WSLが利用できません！）

## 使うことになった経緯
* Dockerを用いた開発への興味<br>

もともと、技術の勉強を兼ねてGoogle Cloud Platform（GCP）にWebアプリをデプロイしておりました。
その際、昨今の流行（？）であるDockerを使ってみたいと思っていました。

* 挫折<br>

家のPCのWindows 10は「Home」エディションであるため、Hyper-Vが使えません。
Windows 10 HomeでDockerを利用するための方法を少し調べたのですが、「環境構築がちょっと面倒くさそうだな・・・」と思い、すこし敬遠していた節がありました。

* 転機

そんな怠惰な私の耳元に「Windowsのバージョン2004からは**WSL2**と**Docker Desktop for Windows**がWindows 10 Homeでも使えますよ。Hyper-Vがなくても使えますよ。」という情報が飛び込んできました。[^1] 
「これは使ってみるしかない！」と。
#### ※WSL2とは
Windows Subsystem for Linux 2の略。
Windows上でLinuxを動かす仕組みのことです。

WSL1とWSL2の違いについては、以下のMicrosoft社のドキュメントに詳細が記載されています。
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions

[^1]: 累積更新プログラムを適用すれば、バージョン1903/1909でもWSL2が利用できます。<br>https://forest.watch.impress.co.jp/docs/news/1272017.html

## 準備
簡単に列挙すると、以下の準備を経てDocker Desktop for Windowsが使えるようになりました。
1. Windows 10のバージョンアップ
2. Docker Desktop for Windowsのインストール
3. WSL2のインストール
※2と3はたまたま逆になってしまった感がありましたので・・・詳細は後述します。

#### 1. Windows 10のバージョンアップ
WSL2が使用できるのはWindows 10のバージョン「2004」からです。[^1]
怠惰な私は、長らくアップデートを放置していたため、バージョンは「1909」のままでした。
「設定」→「更新とセキュリティ」→「Windows Update」を確認すると、新しいWindowsのバージョンが取得可能でしたので、あまりよく確認せず更新しました。
更新後、Windowsのバージョンを確認すると「20H2」になっていました。
**「え？H2ってなに？水素・・・？」**
少し調べてみると、Windows 10 October 2020 Updateとのこと・・・。
つまり、「2004」より新しいバージョンです。
これにて、Windows 10のバージョンアップは無事完了しました。

#### 2. Docker Desktop for Windowsのインストール
以下のサイトからDocker Desktop for Windowsをダウンロードし、インストールしました。
https://hub.docker.com/editions/community/docker-ce-desktop-windows

#### 3. WSL2のインストール
先ほどの手順で、Docker Desktop for Windowsを立ち上げると、以下のメッセージが・・・
![キャプチャa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/c1b25fcf-87d4-80d8-8644-7549a2e42fd7.png)
「そういえば、WSL2をインストールしていなかったな・・・」
順序が若干ごちゃごちゃになってしまいましたが、以下のサイトから「x64マシン用WSL2 Linux カーネル更新プログラムパッケージ」をダウンロードし、インストールしました。
https://aka.ms/wsl2kernel

## Docker Desktop for Windowsを使ってみる
### 起動！
準備もできたので、早速Docker Desktop for Windowsを起動します。
以下のような画面が立ち上がりました。
![capture_ (5).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/8a05e0b7-28b2-4b42-b1c1-9765b40a70d4.png)

こちらは起動中のコンテナの一覧が表示される画面です。今はコンテナが1つも動いていないためこのような表示になっています。
画面左部の「Images」をクリックすると以下のような画面が開きます。
![capture_ (6).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/08e96eae-0611-4143-8cc5-fff91202d632.png)


ここにはDockerイメージの一覧が表示されます。今はイメージが1つも存在しないため、このような表示になっています。

### イメージの作成
イメージの作成はコマンドプロンプトか、Windows PowerShellから行います。
とりあえず、どのように動くのか見てみたかったので、以下のDockerfileを作成しました。
80ポートを開放し、Apacheと.NET CoreのSDKをインストールします。

``` Dockerfile
FROM centos:7
RUN echo "now building..."
RUN yum -y install httpd
EXPOSE 80
RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
RUN yum -y install dotnet-sdk-3.1
```

Dockerfileを置いたディレクトリでコマンドプロンプトを起動し、いざ、Docker Buildを実行します。

``` cmd.exe
作業ディレクトリ>docker build -t testmycontainer .
[+] Building 1.8s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 32B                                                                                0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                        1.8s
 => [1/5] FROM docker.io/library/centos:7@sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e  0.0s
 => CACHED [2/5] RUN echo "now building..."                                                                        0.0s
 => CACHED [3/5] RUN yum -y install httpd                                                                          0.0s
 => CACHED [4/5] RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm           0.0s
 => CACHED [5/5] RUN yum -y install dotnet-sdk-3.1                                                                 0.0s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:6c50ce36ff73cec713b16e6384a8cb7d7ce35db507fb92dee249f77f53396bde                       0.0s
 => => naming to docker.io/library/testmycontainer                                                                 0.0s
```

※この記事の作成のために何度かDocker Buildを実行したため、初回実行の時よりログがシンプルになっています。

Docker Desktop for Windowsでイメージの一覧を確認すると・・・
![capture_ (7).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/9159a9cc-9cd2-3f44-f67d-82fbcf59c424.png)


イメージが作成されたことを確認できました。

### コンテナの起動
先ほど作ったイメージからコンテナを生成し、実行したいと思います。
カーソルをイメージ名の行に合わせると「RUN」のボタンが表示されので、クリックします。
![capture_ (8).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/aaa56d22-0cbc-3ce4-f68d-18095a60a416.png)

すると、コンテナ名やポートの選択画面が表示されるので入力し、「RUN」をクリックします。
![capture_ (9).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/21300b25-84c5-8f0a-bd03-e63a40326d05.png)


そして、画面左部の「Containers/Apps」をクリックし、実行中のコンテナを確認します。
![capture_ (4).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/26618784-7806-bc4f-0d7f-f26d51ae7262.png)

おお！動いている！
一応コマンドのほうでもdocker psコマンドで確認してみましょう。

``` cmd.exe
作業ディレクトリ>docker ps
CONTAINER ID   IMAGE                    COMMAND       CREATED         STATUS         PORTS     NAMES
d1eee1f16576   testmycontainer:latest   "/bin/bash"   2 minutes ago   Up 2 minutes   0.0.0.0:49153->80/tcp    Test
```

ちゃんと動いているみたいですね！

## おわりに
これからはWindows 10 Homeでもローカルで開発したプログラムがDockerで動くかを確認し、リモートの本番環境（個人のお遊びの範囲ですが）でデプロイができるのでとても便利になったなぁと思います。

時間があるときに、デプロイ等の記事も続けてアップしたいと思います！