Docker (ver20.10.12)インストール for WSL2

WSL2上にFESSの環境を構築しようと思い立った。そこで本記事ではまずUbuntu20.04(WSL2)に対してDockerの環境を構築する備忘録を記す。

環境構築する上でいくつかの記事を参照した。参照し、環境構築を進める上でWSL特有のエラーに直面した。本記事ではそれらの対処法についても触れている。いろいろとエラーメッセージを見た上で対処したのだが、それらエラーメッセージに関しては混乱を避けるために本記事では触れていない。詳細なメモは個人のGitHubに残した。
（Docker Desktopが有償化されたので、ある程度需要があるかな？　2022/02/11）

WSL上にFESSを構築する記事はこちら
https://qiita.com/YUKI-SOKENDAI/items/bfcbf5f264cc28588d5b

# 目次
1. [開発環境](#開発環境)
1. [インストール](#インストール)
   1. [インストール手順](#インストール手順)
   1. [インストール前の準備](#インストール前の準備)
   1. [genieのインストール](#genieのインストール)
   1. [Dockerのインストール](#Dockerのインストール)
   1. [Dockerの起動と動作確認](#Dockerの起動と動作確認)
1. [セットアップ用シェルスクリプト](#セットアップ用シェルスクリプト)
1. [おわりに](#おわりに)
1. [参考記事](#参考記事)  

# 開発環境
- Windows10 home
- Ubuntu 20.04 on WSL2

# インストール
## インストール手順
1. インストール前の準備
1. genieのインストール
1. Dockerのインストール
1. Dockerの起動と動作確認

## インストール前の準備
https経由でapt-getするための事前準備。

```bash
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
```
Dockerをapt-getでインストールするためにインストールリストを追加している？。

```bash
sudo 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-get update
sudo apt-cache policy docker-ce
```

## genieのインストール
Dockerをインストールする前にgenieをインストールする。
これはDockerをWSL2上で起動する際に重要となる。Dockerを起動する際はsystemctl(sytemd)がPID1にセットされている必要があるようだ。しかし、デフォルトではPID1にセットされておらず、起動時にエラーとなる。そこでgenieを先にインストールしとく。
genieをmakeする際に.NET関連のコマンド・パッケージが必要となる。そのため、環境構築は以下のような流れで進めていく。

1. 依存しているパッケージ(.NETなど)のインストール
1. genieのインストール & make install

### 依存しているパッケージ(.NETなど)のインストール 
apt-getをしても.NETのインストールが出来ない（恐らく、インストールのリストに.NETがない）。
apt-getのインストールリストに.NET関連を追加する。

```bash
## install daemonize
sudo apt-get install -y daemonize
## install .NET package
sudo apt-get install -y gpg 
wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget https://packages.microsoft.com/config/ubuntu/20.04/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
```
.NETのリストが追加されたのでapt-getでinstallする。

```bash
sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y dotnet-runtime-6.0
sudo apt-get install -y dotnet-sdk-6.0
sudo apt-get install -y dotnet-sdk-5.0
```

### genieのインストール
genieをgithubからcloneする。

```bash
sudo apt-get install -y make
git clone https://github.com/arkane-systems/genie.git
```

clone後にgenieディレクトリへ移動し、makeする。
makeのオプションコマンドはMAKEFILEに書かれているので、中身を見ると良い。
install-localというオプションがあるので、makeで実行。
インストールにミスったら"make clear"してから、再度"make install-local"すれば良い。

```bash
cd genie
sudo make install-local
sudo apt-get install -y systemd-container
```

genieのmake installが完了したら、以下のコマンドを実行。
ターミナル立ち上げる度に実行する必要があるため.bashrcに追加しとくと良い。

```bash
genie -s
```
systemdがPID1になっているか確認する。

```bash
ps aux
```
PID1にsystemdというのがセットされていればOK。デフォルトでは/initがセットされている。

## Dockerインストール

```bash
sudo apt-get install -y docker-ce
```

## Dockerの起動と動作確認

```bash
sudo systemctl status docker
```

# セットアップ用シェルスクリプト
以上の行程を一連のシェルスクリプトにまとめました。

```bash
## 01 : docker installation for WSL ubuntu 20.04 LTS
## written by Y.Abe (2022/02/07)

# update first
echo -e "\n\n*** Update system before installing docker"
sudo apt update

echo -e "\n\n*** Docker installing prepareation"
# preparation for apt-get to install via https
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# add GPG key of docker repository(public)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# add docker repository to APT source
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# update package data base (from added repository via Docker repository??)
sudo apt-get update
# check installed from Docker repository
apt-cache policy docker-ce

# Finally: docker install
echo -e "\n\n*** Start Docker installation"
sudo apt-get install -y docker-ce
echo -e "*** End Docker installation process"

# check booting docker
echo -e "\n\n*** Check booting docker"
sudo systemctl status docker
#-> maybe faild booting docker


# setup for well booting docker on WSL
## install daemonize
sudo apt-get install -y daemonize
## install .NET package
sudo apt-get install -y gpg 
wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget https://packages.microsoft.com/config/ubuntu/20.04/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list

sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y dotnet-runtime-6.0
sudo apt-get install -y dotnet-sdk-6.0
sudo apt-get install -y dotnet-sdk-5.0

# install genie
sudo apt-get install -y make
git clone https://github.com/arkane-systems/genie.git
cd genie
sudo make install-local
sudo apt-get install -y systemd-container # Ubuntu18.04 no need this command
esho "*** Finish setup genie\n\n"


# asign systemd to PID1
echo -e "***\n\nBefore switch PID1"
ps aux
genie -s
echo "genie -s" >> ~/.bashrc
echo -e "***\n\nAfter switch PID1"
ps aux

# check booting docker again
echo -e "\n\ncheck docker booting again"
sudo systemctl status docker
#-> maybe succeeded booting docker

```

# おわりに
本記事ではWSL2上のUbuntu 20.04にDockerのインストール、環境構築を行う備忘録を残した。Dockerはバージョン20.10.12を使用した。
本記事にて示した方法に不備、間違いがあればじゃんじゃんコメントください。

# 参考記事
1. Ubuntu20.04 に Docker を導入する
   - https://qiita.com/nanbuwks/items/0ba1d13b3cd27e5c6426
1. Ubuntu 20.04へのDockerのインストールおよび使用方法
   - https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja
1. 【WSL2】systemctlが動かない問題をきちんと解決する
   - https://shikiyura.com/2020/06/execute_systemctl_on_wsl2/
1. Ubuntu に .NET SDK または .NET ランタイムをインストールする
   - https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu
1. APT のトラブルシューティング(.NETのパッケージがaptで見つからない)
   - https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu#apt-troubleshooting