Docker on WSL2 without Docker Desktopを構築し、VSCode Remote-Containersで接続する

# はじめに
Docker Desktopが既に有償化され、猶予期間も2022年1月末までとなっています。
without Docker Desktopな環境を構築してみて、改めてDocker Desktopの素晴らしさを実感しましたので、WindowsでDockerを使う人は基本的にDocker Desktopを使用する事をお勧めします。
有償化対象だけどどうしても支払いが難しい（Docker Desktopが使えない）という方のみ、以下をお読み下さい。

## この記事を読んで出来ること
- Windwos上で、Docker Desktopに頼らずにDockerを使用できる
- コマンドプロンプト上でdockerコマンドを使用できる
- Windows上のVSCodeからDockerコンテナに接続できる

## この記事を読んでも出来ないこと
- Dockerサービスの自動起動はしない

頑張れば自動起動もできるらしいですが、私はWindowsを起動する度に手動でDockerサービスを起動させてます。

# 0.前提条件
- WSL2でUbuntu 20.04がデフォルトのディストリビューションとして使用できること

コマンドプロンプトで`wsl -l -v`と打ってもらって、以下のように出力されればOKです。

```
C:\Users\user> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2

```

STATEは`Stopped`でも良いですし、`Ubuntu-20.04`以外のディストリビューションが入っていても構いませんが、VERSIONが2のUbuntuに`*`が付いているようにして下さい。
この条件を満たしていない方は、以下Microsoft公式ドキュメントを参考に条件を整えて下さい。
https://docs.microsoft.com/ja-jp/windows/wsl/install

- VSCodeと拡張機能：Remote-WSL, Remote-containersがインストールされていること

Dockerを実行するだけなら無くてもいいのですが、本稿の価値は半減します。

- プロキシ環境下にいる場合、Ubuntu 20.04のプロキシ設定がされていること

bashの環境変数（~/.bashrc）とaptの設定（/etc/apt/apt.conf.d/xxxx）あたりが必要です。
以下の記事などを参考に、必要な設定をして下さい。
https://qiita.com/sachioksg/items/289e40d69382b1d09811

# 1.Dockerのインストール
WSL内での作業です。
基本的には公式の手順（リポジトリを使う場合）に沿って行います。
https://docs.docker.com/engine/install/ubuntu/
https://docs.docker.com/engine/install/linux-postinstall/

## リポジトリのセットアップ

```bash
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

## dockerパッケージのインストール

```bash
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

## dockerサービスの起動（※ここだけ公式手順にない）
※dockerサービスの起動は環境構築時だけでなく、Windowsを起動する毎に行う必要があります。

```bash
$ sudo service docker start
```

## root以外のユーザがdockerコマンドを使えるようにする

```bash
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
```

上記実行後にWSLからログアウト、ログインし直します。

## プロキシ環境下の方はプロキシ設定
`/etc/default/docker`で設定できるようです。
設定後にdockerサービスの再起動が必要です。

# 2.Docker Composeのインストール
不要な方はこの章を読み飛ばして下さい。
WSL内での作業です。
Docker Composeも公式の手順でインストールします。
https://docs.docker.com/compose/install/

v2も出ていますが、2022年1月現在、v1.29.2がstableだそうですので、それをインストールします。

```bash
$ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o ~/docker-compose
$ sudo cp ~/docker-compose /usr/local/bin/
$ sudo chmod +x /usr/local/bin/docker-compose
```

# 3.Windows上でdockerコマンドを使えるようにする

Windows上で以下の`docker.cmd`というバッチファイルを作成し、パスを通します（Windowsの環境変数`Path`に追加）。

```docker.cmd
@echo off
wsl -- docker %*
```

同様に、以下の`docker-compose.cmd`というバッチファイルを作成し、パスを通します。

```docker-compose.cmd
@echo off
wsl -- docker-compose %*
```

これで環境構築は完了です。
コマンドプロンプトで`docker run hello-world`を実行し、DockerからHelloしてもらえたら成功です。

```
C:\Users\user> docker run hello-world
```

# 4.VSCodeのRemote-containersを使ってみる
Docker on WSL2で実行中のコンテナに、Windows上のVSCodeから接続します。
なんでもいいのでコンテナを走らせておいて下さい。

## Remote-WSLなVSCodeを開く
WSL内で"`code`"コマンドをオプション無しで実行するか、コマンドプロンプトで"`wsl code`"を実行するか、（通常の）VSCodeのCommand Paletteから"`Remote-WSL: New WSL Window`"を実行します。
新たなVSCodeウィンドウが開いて、左下に"`><`"ではなく"`>< WSL: Ubuntu-20.04`"と表示されていればOKです。

## Remote-containersなVSCodeを開く
上記Remote-WSLなVSCodeのCommand Paletteから"`Remote-containers: Attach to Running Container...`"を選択し、所望のコンテナを選択します。
さらに別のVSCodeウィンドウが開いて、左下に"`>< Container xxxx`"と表示されていれば成功です。

# 補足
## プロキシ設定について

WSLの設定とDockerサービスの設定は前述の通りですが、Dockerコンテナの設定は別途必要になります。（イメージのビルド時含む）
環境変数の設定はWSLの`~/.docker/config.json`で行えるようです。
https://qiita.com/dkoide/items/ca1f4549dc426eaf3735
aptの設定（/etc/apt/apt.conf.d/xxxx）も環境変数を参照する感じでやると良いと思います。