Windows環境(WSL2)のDockerを爆速化する方法

## 目的
Windowsホスト環境下(WSL2)のDockerコンテナのファイルアクセスを高速化する

## 動機
これまでMacBookでそれなりにDocker環境によるシステム開発をそれなりに快適に進めてきたのですが、同僚たちのWindows PCでのDockerコンテナがあまりにも緩慢な動きをしていてびっくりしたので、問題を根本的に解決する方法を考えました。

## 原因
2022年11月現在、みなさんはWSL2とDocker Desktopの組み合わせで環境構築されていると思います。しかしWSL2下にあるLinux系のプロセスからのNTFSへのアクセスが極めてパフォーマンスが悪く、WSL2のテクノロジーの上で動作しているDocker Desktopもその影響をもろに受けています。

## 解決方法
DockerコンテナにNTFSへのアクセスをさせなければよい。WSL2にファイル置き場用のLinuxディストロ領域を確保し、そこに開発プロジェクト一式のソースコードを置いてそこからからDockerを立ち上げれば解決する。

## 作業手順

1. WSL2にalpine linux(NAME=alpine)をインストールする
1. Docker Desktopの設定でResource/WSL IntegrationでalpineのチェックをONにしてDocker Desktopを再起動
1. alpineにgit, dockerをapkコマンドでインストールする
1. alpineにLinux版のdocker-composeを直接インストールする
1. alpineの/homeディレクトリ上でgitコマンドを実行し、ソースツリーをcloneする
1. alpine上でdocker-composeを実行し、Docker DesktopにDockerコンテナをセットアップする
1. vscodeなどのテキストエディタを \\wsl$以下の開発ディレクトリで開く

### WSL2にalpine linuxをインストールする

http://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/

から最新版のalpine-minirootfsのtar.gzを入手します。

PowerShell上でwslコマンドを実行し、alpineの環境をインポートする

```bash
> wsl --import alpine c:\data\wsl\alpine c:\Download\alpine-minirootfs-3.16.3-x86_64.tar.gz --version 2
> wsl -l -v
  NAME                   STATE           VERSION
* alpine                 Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
```

これで以下のようなWSL2ゲストがWindows環境に追加されます。

- ゲスト名
  - alpine
- ストレージファイル設置場所(ext4.vhdx)
  - `c:\data\wsl\alpine`
  - 十分な空き容量があればディレクトリはどこでも良い
- Sambaマウント場所
  - `\\wsl$\alpine`

alpine環境には

```bash
> wsl -d alpine
```
で入ることができます。


### Docker Desktopの設定でResource/WSL IntegrationでalpineのチェックをONにしてDocker Desktopを再起動する

Resources
WSL Integration
Configure which WSL 2 distros you want to access Docker from.
Enable integration with my default WSL distro(チェックを入れる)
Enable integration with additional distros:

alpine(チェックを入れる)

ウィンドウ右下の再起動ボタンでDocker Desktopを再起動する

### alpineにgit, dockerをapkコマンドでインストールする

```bash
> wsl -d alpine
# apk add git docker
```

### alpineにLinux版のdocker-composeを直接インストールする

apkパッケージの範囲でちゃんと動作するv2系の`docker-compose` が見つからなかったため、開発元から直接入手してインストールします。

> Note: alpineではDocker Desktopが`WSL Integration`をONにしたときに自動的に設定される `docker`,`docker-compose`がalpineのELFと互換性がないため、このような形で手動セットアップしています。WSL版のUbuntuなどで本記事のセットアップをしているときは、`WSL Integration`をONにした段階で `docker`, `docker-compose` が実行できるようになっているでしょう。

https://github.com/docker/compose/releases

から最新の `docker-compose-linux-x86_64` を探してダウンロードし、

`\\wsl$\alpine\usr\bin` 以下にExplorerで移動させます。
ついで `docker-compose-linux-x86_64` から `docker-compose` にリネームします。
そして実行権限を与えます。

```
# rm /usr/bin/docker-compose
# mv  /usr/bin/docker-compose-linux-x86_64 /usr/bin/docker-compose
# chmod 755 /usr/bin/docker-compose
```

そしてコマンドを実行し、alpine環境下で動作することを確認します。

```bash
# docker-compose
```


### alpineの/homeディレクトリ上でgitコマンドを実行し、ソースツリーをcloneする

```bash
# cd /home
# git clone https://gitlab.com/yourcomany/your_project.git
```

### alpine上でdocker-composeを実行し、Docker DesktopにDockerコンテナをセットアップする

```bash
# cd your_project
# docker-compose up -d --build
```


### vscodeなどのテキストエディタを \\\wsl$以下の開発ディレクトリで開く

alpineのWSL2へのセットアップが成功したとき、

`\\wsl$\alpine\home\your_project`

のパスでExprlorerから見える状態になっています。(Samba/Windowsファイル共有)
したがってこのディレクトリ以下で vscodeなどのテキストエディタを開けば、あとは普通にソースコードを書いてDockerのコンテナのプログラムを実行できるでしょう。

NTFS上のディレクトリを普通にマウントした場合と比べ、処理速度の差に驚くはずです。

## ディレクトリの権限問題の対処

WindowsのディレクトリをDockerにマウントした場合、デフォルトでフルアクセス権限となっているため問題が表面化しないのですが、 WSL2配下のディレクトリをDockerにマウントした場合、普通に権限問題が発生します。なのでDockerコンテナが書き込むディレクトリを 777 権限にするのが手っ取り早いです。例えばこういうコマンドを実行することになるでしょう

(カレントディレクトリ以下の全てのディレクトリを外部ホスト(Dockerコンテナ)から読み書き可能にする)

```bash
# find . -type d|xargs chmod 777
```


以上。