Windows端末にWSL2＋Dockerをインストールする【躓きポイントも解説】

## はじめに
業務で初めてWindows端末にWSL2＋Docker環境を構築する機会がありました。
手順書は用意されていたものの、「そもそもWSL2って何？」「なぜこのコマンドを実行するの？」「PCを壊してしまったらどうしよう…」と戸惑いながら、多くの情報を調べつつ作業を進めました。

この経験は今後他の現場やプロジェクトでも活かせると感じたため、
改めて個人PCでも手順をおさらいする意味で、環境構築をやり直してみました。

本記事では、その際の手順やポイントを整理し、備忘録としてまとめています。

### 目次
- [1. WSL2とは？](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#1--wsl2%E3%81%A8%E3%81%AF)
- [2. 全体の流れ](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#2--%E5%85%A8%E4%BD%93%E3%81%AE%E6%B5%81%E3%82%8C)
- [3. WSL2の有効化（Windows側の準備）](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#3--wsl2%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96windows%E5%81%B4%E3%81%AE%E6%BA%96%E5%82%99)
- [4. Ubuntuのインストールと初期セットアップ](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#4--ubuntu%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E5%88%9D%E6%9C%9F%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
- [5. 【任意】プロキシ設定](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#5--%E4%BB%BB%E6%84%8F%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E8%A8%AD%E5%AE%9A)
- [6. Dockerのインストールと動作確認
](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#6--docker%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)
- [7. よくある躓きポイントQ&A](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#7--%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%BA%93%E3%81%8D%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88qa)
- [おわりに](https://qiita.com/n-okutomi/items/c90a5e8a5413ea50b8ff#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)

### 作業環境
- Windows 10 Home バージョン22H2
- WSLバージョン 2.4.13.0
- Ubuntu-24.04

:::note info
本記事では「Windows端末にWSL2＋Dockerをインストールし、`docker run hello-world`が実行できるところまで」を対象としています。
Dockerを用いたコンテナ作成や、アプリケーション開発に活用する方法については、別記事でまとめる予定です。
:::

## 1.  WSL2とは？
### 概要
**WSL2（Windows Subsystem for Linux 2）** は、Windowsの中に軽量なLinux環境（仮想的なLinux部屋）を構築できる仕組みです。

簡単に言えば、
**「Windowsの中にもう一台、Linuxマシンを持つイメージ」** になります。

- コマンドライン（ターミナル）を開けば、すぐにLinuxの操作が可能
- ファイル共有もシームレス（Windows ⇔ Linux間）
- 仮想マシンに比べ、非常に軽量で起動も速い

```
+------------------------+
|    Windowsパソコン      |
|                        |
|  +------------------+  |
|  |   Linux環境       |  | ← これがWSL2（Ubuntuなど）
|  +------------------+  |
|                        |
+------------------------+
```
### なぜWSL2を使うの？
近年の開発現場では、Linux環境を前提とするツールやソフトウェアが主流となっているそうです。
例）Docker・各種クラウド開発ツール・最新のWebアプリケーション開発環境など

しかし、私たちが日常的に使用している業務PCはWindowsであることが多く、
"Windows単体ではLinux向けツールがそのまま動かない"という問題に直面します。

これを解決するために、**WSL2を導入し、Windows上でLinux開発環境を手軽に利用できるようにする**というのが主な理由となります。

また、WSL2環境は、仮想的なLinux領域として動作しているため、
**万が一トラブルが発生しても、ディストリビューション単位で簡単にリセット・再作成が可能** です。

PC本体のWindowsには影響を与えないため、「もし失敗したらどうしよう」という不安を抱えずに、安心して試行錯誤できる環境を構築できる点も大きなメリットであると感じています。


## 2.  全体の流れ
本記事では以下の順序で環境構築を進めます。

- Windowsの設定でWSL2・仮想化機能を有効化
- Ubuntu（Linux）をインストール
- 【任意】プロキシ設定
- Dockerのインストールと動作確認

## 3.  WSL2の有効化（Windows側の準備）
- タスクバーで「Windowsの機能の有効化または無効化」を検索して開きます。

- 以下の項目にチェックを入れ、「OK」を押してPCを再起動します。
  - Linux用Windowsサブシステム
  - 仮想マシンプラットフォーム
  - Hyper-V

:::note info
これらはWSL2やDockerを動かすために必要な仮想化関連機能です。
「Hyper-V」が表示されない場合は、Windows Homeエディションをご利用中かもしれません。その場合でもWSL2は利用可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/6053b760-e37f-4dde-9d89-6f095e00f102.png)


## 4.  Ubuntuのインストールと初期セットアップ
- PowerShellを「管理者権限」で起動する。
※スタートボタン（Windowsマーク）を右クリックし、「Windows PowerShell(管理者)」を押下すれば起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/c0441f9f-8c89-4f80-a4af-683b626eb975.png)

- PowerShell起動後、以下のコマンドを実行する。
```bash
wsl --install -d Ubuntu-24.04
```

`wsl --install` : WSL環境とLinuxディストリビューションのセットアップをまとめて実施。
`-d Ubuntu-24.04` : 利用したいディストリビューション（Ubuntu最新版）を指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/e308c59c-1b08-4a8d-af78-e1e5511148b9.png)


- インストール完了後、Ubuntuのターミナルが立ち上がり、「ユーザー名」と「パスワード」を設定するよう求められるので、画面に従い入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/9956e342-5be5-482a-b5c8-14f43adfef51.png)

- 念のためUbuntuがインストールされていることを確認する。
```bash
wsl -l -v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/2448a0e3-fa34-4a16-a02a-039ebef2124e.png)

:::note warn
この「VERSION」が 1 になっている場合、WSL1でインストールされています。WSL1では `systemd` が動かず、`Docker` も正常に動作しません。
その場合は以下のコマンドで WSL2 に変換しましょう。
:::
- バージョン1から2に変換する
```bash
wsl --set-version Ubuntu-24.04 2
```
- 変換後、再度下記コマンドを実行し「VERSION」が2になっていることを確認する。
```bash
wsl -l -v
```

## 5.  【任意】プロキシ設定
勤務先や学校等、ネットワーク制限がある場合にのみ必要な設定です。
制限がない場合は本手順はスキップしてください。

- 以下コマンドを実行し、wslを起動する。
```bash
wsl
```
- 以下コマンドを実行し、プロキシ設定ファイルを編集する。
```bash
sudo nano /etc/apt/apt.conf.d/proxy.conf
```
`nano` : 初心者向けのテキストファイル編集コマンド。
※`vi`コマンド（vimコマンド）に慣れている方は、`vi`を使って編集しても可能。
※パスワード入力を求められた際は、手順4で設定したユーザーのパスワードを入力すること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/2c5f10ed-b193-496d-b0f9-ba6aa8220f1f.png)

- proxy.confファイルに下記を設定。（保存: Ctrl+O、終了: Ctrl+X）
```plaintext
Acquire::http::Proxy "http://プロキシアドレス:ポート";
Acquire::https::Proxy "http://プロキシアドレス:ポート";
````
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/701d3ba9-197a-49fb-a593-a794536e6a1e.png)

- 以下コマンドを実行し、上記で設定したプロキシ設定ファイルが保存されているかを確認。
```bash
cat /etc/apt/apt.conf.d/proxy.conf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/68565456-fcab-4083-982e-a0d6bbbc4b55.png)


:::note warn
インターネット通信が制限されている場合、aptやnpm等が正しく動作しないため、プロキシ設定が必要となります。
:::

## 6.  Dockerのインストールと動作確認

### Dockerインストール
- wslを起動する。
- 下記コマンドを実行し、Docker公式スクリプトをダウンロード かつ 管理者権限で実行する。
```bash
curl -fsSL https://get.docker.com -o get-docker.sh && sudo -E sh get-docker.sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/3b773902-7ec1-461c-8d36-ceffc6d2ccb7.png)



### dockerグループへのユーザー追加
- 自分のユーザーをdockerグループに追加し、sudoなしでdockerコマンドを実行できるようにします。
```bash
sudo usermod -aG docker $USER
```

### WSL再起動
- 設定変更を反映させるため、WSLを再起動する。
```bash
wsl --shutdown
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/6b15d068-2659-43c7-945e-0e5e491b3adc.png)


### Docker動作確認
- wslを起動する。
- 下記コマンドを実行し、Dockerが正しくインストールされたかを確認する。
※`hello-world`はサンプルコンテナです。
```bash
docker run hello-world
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762672/243ffd65-cdd9-4f1e-9318-77a2abe28764.png)


## 7.  よくある躓きポイントQ&A
Q. `docker: command not found`エラーが出る
A. WSLの再起動（`wsl --shutdown`）を忘れていないか確認する。

Q. aptやnpmのダウンロードが失敗する
A. プロキシ設定が必要な環境か確認する。

Q. WindowsファイルにLinux側からアクセスしたい
A. `/mnt/c/Users/（ご自身のユーザー名）/`配下からアクセス可能。

Q.  `docker run hello-world`を実行後、Dockerの「サーバー側（＝デーモン）」が起動していない、または接続できないと怒られる
```
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
A. 以下の点を確認すること。
- WSLの再起動（`wsl --shutdown`）は完了しているか
- `sudo usermod -aG docker $USER`で自分のユーザーをdockerグループに追加したか
- Dockerデーモン（`sudo dockerd`）が起動しているか

### 【体験談】私がハマったポイント
- 私自身、個人用PCで構築した際、`docker run hello-world`がうまくいかず、、
さらにDockerデーモンの起動を確認した際に、以下の問題に遭遇しました。
```
failed to start daemon: Error initializing network controller: ...
iptables: Failed to initialize nft: Protocol not supported
(exit status 1)
```
> デーモンの起動に失敗しました： Error initializing network controller: ...
iptables： nftの初期化に失敗しました： プロトコルがサポートされていません
(終了ステータス 1)
- このエラーは、WSL内でiptablesが正しく初期化されなかった場合に発生するもので、Dockerネットワークの初期化ができず、デーモンの起動に失敗したことを意味します。

### なぜこうなったの？
- 最初は「設定ミスかな」と思い、プロキシ設定やユーザーグループ設定（`usermod -aG docker $USER`）を見直しましたが、解決しませんでした。
- そこで調査を進めたところ、このエラーの根本原因は、**systemdが無効な環境ではDockerデーモンが正常起動できないことにある**と判明しました。
- さらに`wsl -l -v`コマンドでWSLのバージョンを確認すると、自分のUbuntuが「VERSION 1」で動作していたことが判明しました。
 ```
   NAME            STATE           VERSION
* Ubuntu-24.04    Stopped         1
 ```
- WSL1では、内部的にsystemdが起動しないため、どう頑張ってもDockerデーモンは正常に動きません。
※WSL2ではsystemdをオプションで有効化できるが、WSL1ではそもそも機能がない

### 解決策
- まず、WSL自体を最新版にアップデートしました（`wsl --update`）
- そのうえで、UbuntuのバージョンをWSL2に変更しました。
```
wsl --set-version Ubuntu-24.04 2
```
- 変換後、下記コマンドを実行しsystemdが有効であること（出力されること）を確認。
```
ps -p 1 -o comm=
```
- これによりDockerデーモンの起動も成功し、`docker run hello-world`も正常に動作するようになりました。

## おわりに

WSL2＋Docker環境の構築は、初めて取り組む際には戸惑うことも多かったですが、
それぞれのコマンドや手順の意味を理解しながら進めることで、確実に環境構築ができるようになりました。

本記事が、これから同じように環境構築をされる方のお役に立てば幸いです。
次回はDocker Composeを使ったコンテナ管理についてまとめる予定です。