Windows上にDocker環境を構築する

# はじめに

業務でWindows上にDocker環境（Docker Desktop）を一から構築する機会があったので、その際のメモを備忘録としてまとめてみました。

# 前提条件

* WSL2がインストールされていること。
  * Windows11にWSL2を導入する場合は、[こちらの手順](https://dev.classmethod.jp/articles/how-to-setup-wsl2-for-windows11/)が分かりやすいと思います。

# Dockerアカウントの作成

* [pricingのページ](https://www.docker.com/pricing/)から「Personal」の「Get Started now」をクリックします。
* ［Create your account］の画面で、必要な情報を入力して［Sign up］を押します。
  * 今回はGoogleアカウントでDockerのアカウントを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/b0a47320-a88c-d3ab-341a-165d4c370653.png)


# ダウンロードとインストール

* [Docker Hubのページ](https://hub.docker.com/)から［Download for Windows］のボタンを押して、Docker Desktopのインストーラーをダウンロードします
* インストーラーを起動して、デフォルト設定でインストールします。
  * ［Use WSL 2 instead of Hyper-V (recommended)］と［Add shortcut to desktop］にチェックが入っていることを確認して下さい。

![docker_install_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/967333f6-e104-531d-2feb-b0c60481a408.png)


* インストールが成功したら、［Close and restart］を押してOSを再起動します。

# 初期設定

* 再起動後にDockerを起動すると、初期設定のウィザードが開始されます。
* 最初に［Docker Subscription Service Agreement］と書かれた画面が現れるので、［Accept］を押します。

![docker_setup_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/a7c4c531-63eb-1fdc-0ccf-3c39ae9c3866.png)
 
* Dockerの設定はデフォルト設定（Use recommended setting）で［Finish］します。

![docker_setup_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/9b68d0d7-7f3f-acec-4888-40cf93ba3890.png)

* 「Welcome to Docker Desktop」と書かれた画面で［Sign In］を押してサインインします。

![docker_setup_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/1330ad28-c832-c9c3-4e81-c883becf0724.png)

* ここまでの設定が終わると、Docker Desktopが使える状態となります。

![docker_setup_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/92ecae06-f016-619e-7c62-d28ee9f7cd70.png)

## コンテナの作成

* Dockerが正常に動くかどうかを確認するため、試しにコンテナを作って動作確認をします。

### イメージのダウンロード

* PowerShellで以下のコマンドを実行して、Dockerの動作環境のテンプレートとなるイメージをダウンロードします。
  * 今回はブラウザを使って動作確認出来る「httpd」というイメージを使いました。

```powershell:PowerShell
PS> docker pull httpd
```

* ダウンロード完了後に以下のコマンドを実行すると、以下のようにhttpdというイメージが表示されます。

```powershell:PowerShell
PS> docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    ac45b24b92cc   8 weeks ago   167MB
```

* イメージのダウンロードが完了すると、Docker Desktopの［Images］画面にもダウンロードしたイメージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/13c83657-3a0e-bfae-ec5c-c4926776e161.png)


### コンテナの作成と実行

* ダウンロードしたイメージ（httpd）を使って、以下のコマンドで`httpd_test`という名前のコンテナを作成・実行します。
  * `-p`というオプションは「コンテナのポートをホストに公開する」という意味で、`-p 10088:80`という部分は、「ホスト（※ここではWindows機）の10088番ポートをコンテナの80番ポートと紐付ける」ということになります。
  * `-it`というオプションについては、[こちらの記事](https://qiita.com/tacotopas/items/93dfcaa9f4dd6cfe0b95)で解説されています。

```powershell:PowerShell
PS> docker run --name httpd_test -p 10088:80 -it httpd
```

* コンテナの作成・実行が完了後に以下のコマンドを実行すると、以下のようにhttpd_testというコンテナが起動していることが分かります。

```powershell:PowerShell
PS> docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                   NAMES
9abbc1b05840   httpd     "httpd-foreground"   9 minutes ago   Up 9 minutes   0.0.0.0:10088->80/tcp   httpd_test
```

* コンテナの作成・実行が完了すると、Docker Desktopの［Containers］画面にもダウンロードしたイメージが表示されます。
  * この画面で［Port(s)］列の`10088:80`をクリックすると、デフォルトのブラウザが起動してApacheのテストページが表示されます。
  * 直接URLを入力する場合は`http://localhost:10088`となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/169cb6fb-e992-74e9-c226-06d437f6ace2.png)

# 注意点

* ポート番号の紐付けは任意のポート番号を利用できますが...
* 以下のように「**ホストの10080番ポート**をコンテナの80番ポートと紐付ける」形で設定すると、ブラウザから`http://localhost:10080`にアクセスしても **「ERR_UNSAFE_PORT」** と表示されてしまいます。
  * これはChromeやEdgeで起きる現象で、「NAT Slipstreaming攻撃」を防ぐためのセキュリティ強化策だそうです。
  * 10080番ポートを開放する方法もあるようですが、素直に他のポートを使った方が安心だと思います。

```powershell:PowerShell
PS> docker run --name httpd_test -p 10080:80 -it httpd
```

# 参考URL

* [Windows 11 で WSL2 をセットアップしてみた](https://dev.classmethod.jp/articles/how-to-setup-wsl2-for-windows11/)
* [docker runの[ i, t, d ]オプションの意味を調べた](https://qiita.com/tacotopas/items/93dfcaa9f4dd6cfe0b95)
* [Docker CLI (docker) - Docker-docs-ja](https://docs.docker.jp/engine/reference/commandline/toc.html)
* [Chromeで10080につながらない「ERR_UNSAFE_PORT」](https://tech-it.r-net.info/security/411/)