Dockerのインストール手順【WSL2】【Ubuntu 20.04 LTS】


この記事はWSL2を使ったDockerのインストール方法を記載しています。
Docker初学者向けの内容であり、自分もかなり苦労したので、備忘録として残します。

## 注意事項

- この情報は2022年9月2日時点のものです。
- 以下の内容には誤りが含まれる可能性があります。
  - 間違っている部分などがあれば、コメントお願いします。

今回インストールした環境

|項目|バージョン|
|:--|:--|
|OS|Windows 11 Home|
|Docker|20.10.17|
|Linux|Ubuntu（20.04.4 LTS）|

## 事前準備

### WSL2のインストール（既にインストール済みの方は不要）

- [こちらの記事](https://codeaid.jp/blog/wsl2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95/)が分かりやすいです。

:::note info
Windows Homeを使用している方はHyper-V機能が搭載されていませんが、有効化しなくても問題ありません。
どうしても、Hyper-Vを使用したい方は[こちら](https://4thsight.xyz/36873)の記事を参考にしてください。
:::

### Ubuntuをインストール（すでにインストール済みの方は不要）

- PowerShellを起動して以下のコマンドを実行します。

``` 
wsl --install -d ubuntu
```

- Ubuntuが起動したらOKです。任意のユーザ名とパスワードを設定してください。

![Ubuntuダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/688d42d9-158e-5060-c3a7-3aafd34e3a68.png)


## Dockerのインストール

[こちらの記事](https://blog1.mammb.com/entry/2021/10/22/090000?amp=1)を参考にしています。（Dockerインストール時に大変お世話になりました。）
以降の操作はすべてUbuntuターミナルで実施します。

### 1. Ubuntuのリポジトリをセットアップする

- aptパッケージインデックスを更新[^1]し、aptがHTTPS上のリポジトリを使用できるようにパッケージをインストールします。[^2]

```
$sudo apt update

$sudo apt install -y apt-transport-https
```

コマンド実行途中で「Do you want to continue?（Y/N?）」と聞かれるので、yと入力してください。

[^1]: [Dockerの公式ページ](https://codeaid.jp/blog/wsl2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95/)では、apt-getを用いているが、非推奨となっているため、aptを使用
[^2]: [Dockerの公式ページ](https://codeaid.jp/blog/wsl2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95/)には、ca-certificates、curl、gnupg、lsb-releaseもインストールする必要がありますが、Ubuntu-20.04ですでに導入済みのため、不要です。

### 2. Dockerの公式GPGキーを追加する[^3]

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

[^3]: Dockerインストール手順が記載されている記事や書籍の中には、apt-keyやadd-apt-repositoryを使う記事もありますが、apt-key非推奨であり、2022年中ごろで削除予定のため、注意が必要

### 3. リポジトリを設定する

```
$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
```

### 4. Docker Engineをインストールする[^4]

```
$sudo apt update

$sudo apt install docker-ce 
```

[^4]: [Dockerの公式ページ](https://codeaid.jp/blog/wsl2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95/)には、docker-ce-cliとcontainerd.ioも記載されているが、この2つはdocker-ceに依存しているため、記載不要

### 5. dockerのデーモンを起動する

通常のLinuxだと、上記の手順でdockerデーモンは自動的に起動しますが、
WSL2では、Systemdが無効化されています。
以下のコマンドを実行し、Dockerデーモンを手動で起動します。

```
$sudo /etc/init.d/docker start
```

#### それでもPID1が起動しない場合

上記操作を行っても「System has not been booted with systemd as init system (PID 1)」が出る場合は、
[こちらの記事](https://qiita.com/matarillo/items/f036a9561a4839275e5f)を参照してください。（私も以前、ここでハマっていましたが、この記事で解決しました。）

① unshareコマンドで簡易コンテナを作る

```
$sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target 
```

② nsenterコマンドで簡易コンテナの中に入る

```
$exec sudo nsenter --target $(pidof systemd) --all su - $LOGNAME
```

再度デーモン起動 もしくは、hello-worldイメージを実行して起動できればOKです。

### 6. Dockerのインストール確認

- hello-worldイメージを実行し、インストールが正常におこなわれているか確認

```
$sudo docker run hello-world
```

以下のような画面が出れば、インストール成功です。

![docker_helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/5dea8991-6035-a108-98b2-94495c7270d4.png)


### 7. Dockerをユーザ設定で使用できるようにする

Dockerコマンドを使用する時に、「毎回"sudo"って書くの手間がかかるから、省きたいな～」という方は、以下のコマンドして、一般ユーザ（上記で登録したユーザ）をdockerグループに所属させてください。

```
$sudo usermod -aG docker $USERNAME（自身で設定したもの）
```

## 【番外】JenkinsをDocker内で起動してみる

Dockerを使って、Jenkinsを起動します。

```
$sudo mkdir /var/jenkins_home

$sudo chown 1000:1000 /var/jenkins_home

$sudo docker run -p 8080:8080 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
```

コマンド実行後、http:localhost:8080/にアクセスし、以下のJenkins画面が表示されればOKです。

![jenkins画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/efb50062-66bd-b90e-0731-450cef6bf601.png)


## 最後に

今回はwsl2を使ったDockerインストール方法を記載しました。
wsl2を用いると所々ハマるポイントがあるなという印象を持ったので、wsl2についての勉強もしていきたいと思います。

## 参考資料

- WSL2のインストールと更新方法

https://codeaid.jp/blog/wsl2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%9B%B4%E6%96%B0%E6%96%B9%E6%B3%95/

- Install Docker Engine on Ubuntu

https://docs.docker.com/engine/install/ubuntu/

- WSL2でSystemdを使うハック

https://qiita.com/matarillo/items/f036a9561a4839275e5f

- WSL2 Ubuntu に Docker 導入(Docker Desktop for Windows に変えて)

https://blog1.mammb.com/entry/2021/10/22/090000?amp=1

- apt-keyはなぜ廃止予定となったのか

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675