【Docker for Windows】環境構築しながら学ぶWSL／Dockerの全体像

# はじめに
WindowsでDockerを使用するにあたり、以下のような疑問を持つことがありました。
* WSLのインストールが必要とあるが、それはどこで動作しているのか？
* Ubuntuコンテナを作成できるが、環境構築時にインストールしたUbuntuとは別物なのか？

これらの疑問は、WindowsにおけるDockerの使用はWSLの環境構築が前提となるため、**全体像**が複雑になりイメージしづらいことが原因だと考えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/a36f27f0-8805-db9e-ef83-dd333febeebc.png)

上図は「WindowsでDockerに必要な環境構築を行い、コンテナを動かしている様子」です。

以下では、実際の環境構築手順に沿って、それぞれの操作では上図のどこにあたる部分を整備しているのか紐解き、最終的に先ほどの図を目指す構成で進めます。

## 対象読者
* WindowsでDockerの環境構築を行いたい方
* 環境構築の手順で、それぞれ何をしているのか知りたい方
* WSLとDockerの関係や、全体像を知りたい方

## この記事でやらないこと
* Dockerの概要
* Dockerの操作方法

# 環境構築手順
前提として、DockerはLinux上でしか動かせないため、WindowsやMacでDockerを使用するには**何かしらの方法でLinux環境を用意する**必要があります。

仮想化ソフトを使用して用意することもできますが、WindowsではWSL（Windows Subsystem for Linux）を使用する方法が一般的です。

よって、WindowsでDockerを使用するには、大きく2つのステップを踏む必要があります。

1. WSLのインストール
1. Dockerのインストール

## WSLのインストール
<img width="85%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/5f4ac2f8-6449-b681-265f-9f651b3889b4.png">

WSLのインストールとして必要な手順は以下の4つです。
①仮想マシンの機能を有効にする
②WSLを有効にする
③Linuxカーネルをインストールする
④Linuxディストリビューションをインストールする（任意）

これらは個別にGUIまたはコマンドで設定するか、`wsl --install`を実行して①～④まで一度に設定する方法があります。

今回は個別に実行していきます。

### ①仮想マシンの機能を有効にする
・コントロールパネル ＞ プログラム ＞ Windowsの機能の有効化または無効化
Virtual Machine Platformにチェック
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/b8bfc2ba-48ca-c9ab-7c8a-bcc7b69819e3.png">

**実行結果**
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/d4d38609-6784-8860-6308-6b8791af1d03.png">

### ②WSLを有効にする
・コントロールパネル ＞ プログラム ＞ Windowsの機能の有効化または無効化
Linux用Windowsサブシステムにチェック
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/e98d241d-10b9-55ba-6951-c72c638a9539.png">

**実行結果**
<img width="55%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/d9af4998-e46a-8ae7-1385-a0bded9f2190.png">

### ③Linuxカーネルをインストールする
以下URLより、インストーラをダウンロードし実行
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

**実行結果**
<img width="55%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/d1cb747a-28c1-7289-5590-52334046f0f4.png">

:::note info
これにより、Microsoftが提供するWSL用のLinuxカーネルがインストールされます。
:::

### ④Linuxディストリビューションをインストールする（任意）
ⅰ) WSL2を既定のバージョンとして設定する
PowerShellを起動し、以下を実行
```powershell
wsl --set-default-version 2
```

ⅱ) Linuxディストリビューションをインストールする
Microsoft Storeを開き、任意のディストリビューション（画像はUbuntu）をインストールする
<img width="65%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/306b1045-ad7f-c438-56ef-3b00e8771f3b.png">

**実行結果**
<img width="55%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/3b14b5f8-9324-ea2f-d2bd-29b537b8be0b.png">

ちなみに、ここでインストールしたUbuntuは、スタートメニューから実行、または`wsl -d Ubuntu`で実行することができます。

:::note info
本手順は、Dockerを動かすという目的だけであれば**不要**となっています。

というのも、一般的にLinuxはカーネルとユーザーランドという部品で構成されています。

<img width="30%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/b8c33669-63ff-f7c8-5fe6-f559065cbd76.png">

先の手順でカーネルはインストール済みであり、後述する手順でDocker用のユーザーランドをインストールします。
よって、Dockerの環境構築という点においては、本手順は必須ではありません。
:::
:::note info
Microsoft Storeでインストールできるディストリビューションは、WSL用に提供されたユーザーランドを指します。
:::

## Dockerのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/ff424c60-6839-acd5-1499-be5c5adeb07b.png)

Windows用Dockerのインストールとして必要な手順は以下のみです。
①Docker Desktop for Windowsをインストールする

### ①Docker Desktop for Windowsをインストールする
ⅰ) 以下URLより、インストーラをダウンロード
https://docs.docker.com/desktop/setup/install/windows-install/

<img width="65%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/efbb6787-cffe-8c49-074e-73c73f85f1dc.png">

ⅱ) インストーラを実行する
特段選択するようなものもなく、ポチポチ進んでOKでした。
（デスクトップにショートカットを作るかのチェックがあるくらい）

**実行結果**
<img width="90%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/543bc637-396b-a54f-b0c2-58f0f213267e.png">

### インストールしたコンポーネント
本手順にてインストールした各コンポーネントについて、それぞれの役割を簡単に整理します。

**docker-desktopユーザーランド**がDocker関連のコンポーネントを実行する領域であり、
**docker-desktop-dataユーザーランド**はイメージやコンテナ、ボリュームなどのデータを格納する領域です。

また、Dockerの実行環境である**Docker Engine**ですが、中でも中核的な存在である**Dockerデーモン**が、ユーザーからのリクエストを**Docker CLI**経由で受け付けて、コンテナやイメージの管理を行います。

# コンテナ実行中の様子
ここまでで環境構築が完了したので、最後に実際に動かしている様子を見ていきます。

Dockerを使って何がしたいかと言うと、コンテナと呼ばれる隔離された環境を用意して、その中であれこれしたいわけです。

例えば、以下コマンドを実行すると、nginxコンテナが立ち上がります。
```powershell
docker run nginx
```

<img width="85%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/24c68730-6992-5d0d-65ac-8bcd41ef1327.png">

図にすると、このようにDocker Engine上にコンテナが立ち上がります。
コンテナには**ベースイメージ**と呼ばれる、必要最小限なユーザーランドのようなものが含まれています。

:::note info
Debianベースイメージを使用していることはDocker Hubで確認できます。

<img width="65%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/c2dceceb-2e5b-6a46-13f2-1cc0dd536aec.png">

https://hub.docker.com/layers/library/nginx/latest/images/sha256-b23ab5e22da91fcd70ee5fe343a7a76992bf79ca27297010fb16e40e2c29edf1
:::

<img width="85%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/70ea3969-ad5d-e227-78e1-532410461f20.png">

これにより、**OSはLinux（Debian）、ミドルウェアとしてnginxを用意した環境が、WSLに内包された形で動いている**わけです。

# おわりに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/a36f27f0-8805-db9e-ef83-dd333febeebc.png)

WSLやDockerに触れていると、今自分が行っている操作がどこで行われているのか分からなくなることがあります。
本記事が、少しでもイメージを具体化する手助けとなれば幸いです。

# 動作環境
* Windows 11 Home（24H2）
* WSL2（2.1.5.0）
* Docker 27.4.0
* Docker Desktop 4.37.1

# 参考
**WSLのインストール**
* 個別
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

* wsl --install
https://learn.microsoft.com/ja-jp/windows/wsl/install