[WSL / docker] Docker を install できない！ wsl のバージョンが原因でGPG key作成に失敗していた

# 1. 概要

## 1-1. 対象者 / 前提条件

- 使用しているのはwindows上のWSL環境
- dockerインストールしたいのに、その手前のGPG key取得でエラー、もしくは`apt update`でエラー発生

## 1-2. 起きたこと

Dockerをインストールする際、以下の公式サイトに記載の手順に従うと思うのですが、

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

`2. Add Docker’s official GPG key:`の部分でエラーになった。

> 2． Add Docker’s official GPG key:
> ```bash:bash
> $ sudo mkdir -p /etc/apt/keyrings
> $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
> ```

このままだとDockerがインストールできないんじゃぁ~

これを解消できたので、方法を記載しておく。

# 2. エラー内容

エラーはこんな感じ。
今はもう発生していないので再現できないが、大体こんな感じの文言が出ていたと思う。

```bash
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
```

※エラー文言は、[類似のエラーに遭遇している方の投稿](https://stackoverflow.com/questions/72167566/wsl-docker-curl-60-ssl-certificate-problem-unable-to-get-local-issuer-certi)からコピーしています。

ちなみに、このままの状態で`apt update`すると以下のようなエラーになった。

```bash:bash
$ sudo apt update
Hit:1 https://download.docker.com/linux/ubuntu focal InRelease                                                                  
Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease                                                                          
Err:1 https://download.docker.com/linux/ubuntu focal InRelease               
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:4 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Fetched 336 kB in 2s (156 kB/s)    
Reading package lists... Done
Building dependency tree       
Reading state information... Done
2 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://download.docker.com/linux/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
W: Failed to fetch https://download.docker.com/linux/ubuntu/dists/focal/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

最後の3行がエラー部分。


# 3. 対策

上記エラー解消までの手順は以下の通り。

1. 現状確認
2. 「仮想マシンプラットフォーム」の有効化
3. カーネル コンポーネントの更新
4. wslのバージョンを変更 (1→2) 

2, 3が未実施の場合、以下のエラーが発生します。

- 仮想マシンプラットフォームが無効状態のとき (2未対応時)

```powershell:powershell
> wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。
詳細については、https://aka.ms/wsl2-install を参照してください
```

- カーネル コンポーネントが未更新のとき (3未対応時)

```powershell:powershell
> wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
```

使っているマシンによっては、2, 3は既に対応済みで不要な可能性があるので、2, 3については、上記エラーが出た場合のみ対応すればよいと思います。


## 3-1. 現状確認

windowsホスト上から`powershell`を起動して、wslのバージョンを確認します。

```powershell:powershell
PS C:\Users\Seiya_Sasaki> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         1
```

私のwslはversionが1でした。

※もし既にversionが2なのに、この問題が発生しているのであれば、エラーの原因は別にあると思いますので、他の記事をあたってください。


## 3-2. 「仮想マシンプラットフォーム」の有効化

※未実施の場合のみ、以下の▶マークをクリック！

<details>
<summary>ここをクリック</summary>

windows11の場合の「仮想マシンプラットフォーム」の有効化方法を記載しておきます。

まず、タスクバーにある、虫眼鏡アイコンクリック。

![2022-10-16_13h20_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/7394340d-0fef-ddbd-d87f-bff72550f598.png)

次に、出現したポップアップウィンドウ内の検索窓に「windowsの機能」と入力し、「windowsの機能の有効化または無効化」を選択。

![2022-10-16_13h22_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/07e17989-df40-e039-5aa1-32a51fb37ed5.png)

「Windows の機能」と書かれたWindowが現れたら、下にスクロールしていくと「仮想マシン プラットフォーム」という項目があるので、チェックをつけましょう。

![2022-10-16_13h29_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/3649c26f-d772-2435-d79f-6d6a315f8922.png)

そして、OKボタンを押します。

もしかしたら、ここで再起動を促されるかもしれません。

</details>


## 3-3. カーネル コンポーネントの更新

※未実施の場合のみ、以下の▶マークをクリック！

<details>
<summary>ここをクリック</summary>

まず、powershell上に表示される、カーネルコンポーネント更新が未実施の場合の参照先（[https://aka.ms/wsl2kernel](https://aka.ms/wsl2kernel)）を開きましょう。

すると、以下のような画面に飛ぶので、

![2022-10-16_13h36_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/f78373f6-135e-8110-8f0e-156196c4941a.png)

「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」と記載されたリンクをクリックして`wsl_update_x64.msi`をダウンロードします。
これを実行すると、カーネルコンポーネントが更新されます。

もしかしたら、この後再起動を促されるかもしれません。

</details>


## 3-4. wslのバージョンを変更 (1→2) 

wslバージョンの変更は、windows powershellから行います。
以下のコマンドを実行していきましょう。

※`Ubuntu-20.04`と書かれている部分は、自身のLinux Distribution名で置き換えてください。

```powershell:powershell
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         1

> wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

> wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
この操作を正しく終了しました。

> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

これでwslのバージョン変更は完了！


# 4. Docker install 再チャレンジ

再度GPG keyの作成を試みます。

以降は、wslを起動して**Linux仮想マシンの中でコマンドを実行**していきます。

```bash:bash
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
File '/etc/apt/keyrings/docker.gpg' exists. Overwrite? (y/N) y
```

`File '/etc/apt/keyrings/docker.gpg' exists. Overwrite?`という表示が出るのは、一度作成に失敗してゴミファイルが残っている場合のみす。
この場合は`y`と入力し、`Enter`キーを押下して上書き(overwrite)してしまいましょう。

さて、docker公式に従って、次の手順も実行していきましょう。

```bash:bash
$  echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update
Get:1 https://download.docker.com/linux/ubuntu focal InRelease [57.7 kB]                           
Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease                                                  
Get:3 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages [18.5 kB]
Hit:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease                
Hit:5 http://security.ubuntu.com/ubuntu focal-security InRelease
Hit:6 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Fetched 76.2 kB in 1s (69.7 kB/s)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
2 packages can be upgraded. Run 'apt list --upgradable' to see them.
```

ここまででエラーがなければ大丈夫です。

というのも、**DockerのGPG keyがうまく作成できていない場合、`sudo apt update`に失敗してしまう**ためです。

念のため、Docker関連のパッケージを`apt`が認識できているかを確認します。

```bash:bash
$ sudo apt search docker-ce
Sorting... Done
Full Text Search... Done
docker-ce/focal 5:20.10.18~3-0~ubuntu-focal amd64 [upgradable from: 5:20.10.9~3-0~ubuntu-focal]
  Docker: the open-source application container engine

docker-ce-cli/focal 5:20.10.18~3-0~ubuntu-focal amd64 [upgradable from: 5:20.10.9~3-0~ubuntu-focal]
  Docker CLI: the open-source application container engine

docker-ce-rootless-extras/focal 5:20.10.18~3-0~ubuntu-focal amd64
  Rootless support for Docker.
```

`docker-ce`や`docker-ce-cli`を認識できているので大丈夫ですね。
このままapt installもできるはずです。

# 5. 感想

GPG keyが作成できない原因は、iptablesやfirewallの設定の関係で、curlの3 way handshakeに失敗するなどのエラーが発生していたたのようなのですが、その更に根本的な原因は、wslのバージョンが1だったことでした。

~~こんな古いマシン普段使わないから、まさかwslバージョンが1だとは思わなかった~~
いや～勉強になります()


# 6. 補足 (VPN接続中のapt updateエラー)

ちなみに、VPNに接続しているときは、`apt update`した際に、また別のエラーが発生したので、参考までに掲載しておきます。

```bash:bash
$ sudo apt update
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease                                                       
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease                                             
  Temporary failure resolving 'security.ubuntu.com'
Err:3 https://download.docker.com/linux/ubuntu focal InRelease                                               
  Temporary failure resolving 'download.docker.com'
Err:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done        
Building dependency tree       
Reading state information... Done
2 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Failed to fetch https://download.docker.com/linux/ubuntu/dists/focal/InRelease  Temporary failure resolving 'download.docker.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

どうやら、VPNによっては`apt update`を妨げるような設定がなされていることがある模様。


# 7. 参考資料

## 7-1. Docker公式

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

## 7-2. wslのバージョンアップデート方法

https://qiita.com/TsuyoshiUshio@github/items/2530876fc81e8afd7c82

この方はDockerのインストールはできたものの、起動できなかったようです。

私たちはそもそもDockerをインストールできていないのですが、いずれの問題も、wslのバージョンを上げることで解消できました。


## 7-3. StackOverflowの記事（別の原因で本件と同じエラーが発生していた模様）

この方は、Windows PCのFirewallの設定が会社によって書き換えられていたらしい。
その結果、SSL証明書がwslやcurlの意図しているものと異なるものに置き換えられてしまい、本記事と同じエラーに遭遇していたとのこと。

https://stackoverflow.com/questions/72167566/wsl-docker-curl-60-ssl-certificate-problem-unable-to-get-local-issuer-certi

wslのversionが2なのに同じエラーが発生している場合は、この方のような対処法を検討してもいいかもしれない。

## 7-4. 『3-2. 「仮想マシンプラットフォーム」の有効化』について

3-2. 「仮想マシンプラットフォーム」の有効化の方法は、この記事を参考にしました。

https://qiita.com/matarillo/items/98d7452967987fe5d633#%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86

## 7-5. 「3-3. カーネル コンポーネントの更新」について

3-3. に記載したカーネルコンポーネントの更新方法は、以下の記事を頼りにしました。

https://qiita.com/quzq/items/3de595e14426d0352fc4