WSL2 + Ubuntu 20.04 + Docker 環境構築手順

# 1. Docker Desktop をアンインストール
WSL2 + Ubuntu 20.04 インストール済みの場合、Ubuntuをアンインストール
※スタートメニューから右クリックでアンインストール可能

# 2. WSL2 + Ubuntu 20.04 インストール
Microsoft Store からUbuntu 20.04 LTSインストール

# 3. Ubuntu 20.04 on WSL2
3.1. プロキシ設定
```
export HTTP_PROXY=プロキシURL
export HTTPS_PROXY=プロキシURL
```
```
$ sudo vi /etc/apt/apt.conf
Acquire::http::Proxy "プロキシURL";
Acquire::https::Proxy "プロキシURL";
```
3.2. DNS設定
```
$ sudo vi /etc/resolv.conf
nameserver {DOSでnslookupで表示される既定のサーバーのIPアドレス}
```
3.3. 次回起動時にresolv.confの再設定を不要にする
```
sudo apt-get install resolvconf
sudo mkdir -p /etc/resolvconf/resolv.conf.d
sudo vi /etc/resolvconf/resolv.conf.d/base
nameserver {DOSでnslookupで表示される既定のサーバーのIPアドレス}
```

# 4. Linuxシステムアップデート
```
sudo apt update && sudo apt upgrade -y
```

# 5. Linuxbew の動作に必要な curl, git, ruby をインストール
・zlib1g-dev, libssl-dev, libbz2-dev, libsqlite3-dev, libffi-dev, liblzma-dev は Python ビルドに必要
・add-apt-repository コマンドを使うために software-properties-common もインストールしておく
・https通信を可能にするために apt-transport-https, ca-certificates もインストールしておく
```
$ sudo apt install -y vim curl git ruby \
    zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev libffi-dev liblzma-dev \
    software-properties-common apt-transport-https ca-certificates build-essential
```


# 6. Linuxbrew (Linux版の Homebrew パッケージマネージャ) 導入
Linuxbrew を使うことで最新の開発ツール等を導入しやすくなる
```
# PATHを通す
$ echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.bashrc
$ echo 'export HTTP_PROXY=プロキシURL' >> ~/.bashrc
$ echo 'export HTTPS_PROXY=プロキシURL' >> ~/.bashrc
$ source ~/.bashrc

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```

# 7. Linuxbrew で各種開発ツールを導入
curl や git などは、最新版を使う方が良いため、改めて Linuxbrew で導入しなおす
```
$ brew install curl git wget gcc zlib libzip bzip2 readline openssl pkg-config autoconf
```
Linuxbrew で anyenv 導入
```
$ brew install anyenv
$ anyenv install --init
Do you want to checkout ? [y/N]: <= y
```
anyenv 初期化スクリプトを .bashrc に記述
```
$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```
anyenv update plugin の導入
```
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ anyenv update

$ anyenv -v
anyenv 1.1.1
```
# 8. anyenv を使って pyenv 導入
pyenv を使うことで、複数バージョンの Python 環境を構築できる
```
$ anyenv install pyenv
$ exec $SHELL -l
```
pyenv で Python 3.9 をインストール
```
$ pyenv install 3.9.10
```
pyenv では 2系 と 3系 を同時に指定できる
python  => 3.9.10
```
$ pyenv global 3.9.10
```
現在選択されているバージョンを確認
```
$ pyenv versions
* 2.7.18 (set by /home/user/.anyenv/envs/pyenv/version)
* 3.7.7 (set by /home/user/.anyenv/envs/pyenv/version)

$ python3 --version
3.9.10
```

# 9. pip パッケージマネージャを更新しておく
```
$ pip3 install --upgrade pip setuptools
$ pip3 --version
pip 20.1.1 from /home/user/.anyenv/envs/pyenv/versions/3.7.7/lib/python3.7/site-packages/pip (python 3.7)
```
# 10. AWS CLI を導入
```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```
Credentialsの設定
```
aws configure


AWS Access Key ID [None]: ********
AWS Secret Access Key [None]: ********
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
# 11. Docker (Community Edition) インストール
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
$ sudo apt update && sudo apt install -y docker-ce
```
dockerデーモン起動
```
$ sudo service docker start
```

・WSL2 では、デーモンをスタートアップに登録することができない
・スタートアップに登録したい場合は、Windowsのタスクスケジューラに登録する必要がある
参考: https://qiita.com/Ningensei848/items/75adeb29bb143633d60c
・Windows再起動の度に sudo service docker start すれば良いだけなのでスタートアップ登録までは行わない

・WSL2 には cgroup 用ディレクトリがデフォルトで作られていないため作成しておく
これをしておかないと Docker でプロセスのグループ化が必要になったときにエラーが起きる
```
$ sudo mkdir -p /sys/fs/cgroup/systemd
$ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
```

# 12. dockerプロキシ設定（設定を追記する）
```
$ sudo vi /etc/default/docker 
# Set Proxy
export http_proxy='プロキシURL'
export HTTP_PROXY="${http_proxy}"
export https_proxy="${http_proxy}"
export HTTPS_PROXY="${http_proxy}"
export no_proxy='127.0.0.1,localhost'
export NO_PROXY="${no_proxy}"
```
プロキシ設定確認
```
sudo service docker restart
sudo docker info | grep -i proxy
```
# 13. サービスをUbuntu起動時に実行させる
```
echo 'sudo service resolvconf start' >> ~/.bashrc
echo 'sudo service docker start' >> ~/.bashrc
```
# 14. Dockerを sudo なしで実行可能にする場合
※ カレントユーザーをdockerグループに所属させた上で docker.sock へのグループ書き込み権限を付与すればよい
```
$ sudo gpasswd -a $USER docker
$ sudo chgrp docker /var/run/docker.sock
$ sudo service docker restart
```
WSL再起動しないと反映されない(PowerShell)
```
PowerShell$ wsl.exe --shutdown

参考：
[WSL2 + Ubuntu 20.04 + Docker 環境構築]
https://qiita.com/amenoyoya/items/ca9210593395dbfc8531