Windows PC上にWSL2+Dockerの環境を構築

# はじめに
最近ではDockerの利用はもう当たり前になってきましたね。ですが、Docker Desktop for Windowsはライセンスが有償化してしまったこともあり、ライセンスを購入したりクラウドに環境立てたりするほどではないけど、ちょっとした調査検証や開発はローカルPCでささっとやってみたいというケースはよくあると思います。私の会社の貸与PCは基本Windowsなので、WSL2でUbuntuの環境を用意してそこでDockerを動かすことにしました。

# システム環境
- PC: Windows 10 or 11
- WSL2: Ubuntu 20.04

# 構築手順
## 1 WSL2の環境準備
### Ubuntu20.04のインストール
Windows Powershellを管理者モードで開き、以下のコマンドを実行します。
```powershell:Powershell画面
wsl --install -d Ubuntu-20.04
```
`Ubuntu 20.04 LST`というウインドウが起動するので、ユーザ名とパスワードを入力します。（ちなみにこの記事の中ではユーザ名を`ubuntu`としています。）

### WSL2のネットワーク関連設定
ネットワーク関連の設定が一番厄介でした。WSL2を再起動したら設定が変わっていてインターネットへアクセスできなくなったりとか。いろいろ試しましたが、私は下記の方法で設定しました。

/etc/resolv.confファイルを削除して、空ファイルを再作成します。
```sh
sudo rm /etc/resolv.conf
sudo touch /etc/resolv.conf
```

一旦Powershell画面でWSLをシャットダウンする。
```powershell:Powershell画面
wsl --shutdown
```

WindowsのスタートメニューからUbuntu 20.04 LSTを起動し、以下のコマンドを実行します。
```sh
sudo rm /etc/resolv.conf

sudo tee /etc/resolv.conf <<EOF
nameserver 8.8.8.8
EOF
```

/etc/wsl.confファイルを新規作成します。

**Windows10ユーザーの場合**
```sh
sudo tee /etc/wsl.conf <<EOF
[network]
generateResolvConf = false
EOF
```
**Windows11ユーザーの場合**

Windows11を利用している場合、wslを再起動すると/etc/resolv.confが自動的に消されてしまう現象がみられます。その回避策ため、次のコマンドを実行します。
```sh
sudo tee /etc/wsl.conf <<EOF
[network]
generateResolvConf = false

[boot]
command="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
EOF
```

インターネット接続できるかどうかを確認します。
```sh
host google.com
```

## 2 Ubuntuの初期設定
以降は、Ubuntuへの各種設定、インストールになります。
- Docker、Docker Composeをインストールします。その他Pythonや、私が仕事でよく利用するAWS CLIなども一緒にインストールしています。
- WSL起動時にDocker daemonが起動するように設定しています。

```sh
# パッケージの更新
sudo apt update
sudo apt -y upgrade

# タイムゾーンの設定
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# Dockerインストール
sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    zip

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
"deb [arch=amd64 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

sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io

# DockerComposeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

sudo usermod -aG docker ubuntu
sudo service docker start
sudo service docker status

# AWS CLIインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
rm awscliv2.zip
rm -r ./aws

# sudoパスワード省略設定
sudo visudo
### visudoの画面が表示されるので、最終行までスクロールした後、次の1行を追記する。
ubuntu ALL=NOPASSWD: ALL
### 追記後、`ctrl+o`、`Enter`、`ctrl+x`で保存・終了する。

# ~/.bashrcを読み込むための設定
tee -a ~/.profile <<EOF

if [[ -f ~/.bashrc ]] ; then
    . ~/.bashrc
fi
EOF

# Dockerの自動起動設定
tee -a ~/.bashrc <<EOF

if test \$(sudo service docker status | awk '{print \$4}') = 'not'; then
    sudo service docker start
fi
EOF

# pythonインストール
sudo apt update
sudo apt install -y --no-install-recommends \
    python3-dev \
    python3-venv \
    python3-pip
sudo apt clean && sudo rm -rf /var/lib/apt/lists/*
sudo ln -s /usr/bin/python3 /usr/bin/python
python -V
```

## 3 開発環境の整理
その他、アプリの初期設定をします。
- gitの設定（`git config --global`コマンド）
- AWS CLIの設定（`aws configure`コマンド）
- Python仮想環境の作成（`python -m venv`コマンド）
- VSCode環境の準備
    ローカルPCのVSCodeで、拡張機能の`Remote - WSL`をインストールします。
    その後、`Ubuntu 20.04 LST`画面で以下のコマンドを実行すると、新たなVSCodeが起動します。
    ```sh
    code .
    ```
    新たに起動したVSCodeにはローカルPCのVSCodeに入っている拡張機能はインストールされていない状態なので、必要なものを手動でインストールします。


# おわりに
今のところこの環境でも問題なく作業できています。