WindowsにUbuntu環境を入れてDockerをインストールしてみる

Docker Desktop for Windowsが有料となったので、WindowsのLinuxでDockerをインストールして使用出来るようにします。

# WSLの有効化
WindowsでLinuxを使用出来るように設定を行います。
**管理者権限**でPowerShellを開き、下記コマンドを実行します。


`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart`

![スクリーンショット 2022-08-17 201047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/b4061035-cd55-2c48-bf54-6ff51b62d5a4.png)

仮想マシン プラットフォームを有効化します。

`dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart`

![スクリーンショット 2022-08-17 201145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/040b82a0-e60d-b179-cb6d-4ca6438212a1.png)

上記のコマンドで有効化出来ない場合、**コントロールパネル→関連設定 プログラムと機能→Windowsの機能の有効化または有効化**で表示される画面で「**Linux用 Windows サブシステム**」と「**仮想マシンプラットフォーム**」をチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/7287d6e7-4505-e3ab-fa7d-9262d3749a65.png)

Windowsを再起動してLinux有効化は完了です。


# Ubuntuのインストール
デスクトップメニューの「**MicrosoftStore**」若しくは下記URLをクリックします。
https://aka.ms/wslstore

![スクリーンショット 2022-08-15 143628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/c91f1712-35f4-226d-0126-e5010e5b1574.png)

検索欄にUbuntuを入力し、左の「**インストール**」をクリックしてインストールを進めます。
完了するとUbuntuの入力画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/404eb22f-7f4e-03ae-9b6e-48712bc055d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/3c73565d-570b-a529-fa9d-d18f10e80d53.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ff5cb499-73e7-9db4-29b7-d2e30fd591c5.png)

インストール完了後、Ubuntuのユーザー名を入力します。
![スクリーンショット 2022-08-15 144525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/9db5a838-4c5a-28af-61f2-af20dd1aaad5.png)

パスワードを入力します。
![スクリーンショット 2022-08-15 144557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/3aef5af3-593a-1575-9dd8-68a00695867e.png)


![スクリーンショット 2022-08-15 144716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/9c017bb9-d598-0aa9-b728-6feccf0e837d.png)

これで設定完了です。

# Dockerインストール


先程のUbuntu画面でコマンドを実行していきます。

`sudo su`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5eb4b999-9518-7ec9-8e84-02261e569885.png)

パスワードを再度入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/d643907c-60a3-72ef-6611-6b1234fad4fa.png)

#### コマンド解説

**・sudo su**　Windowsでいう管理者(rootユーザー)に切り替え

`apt  update`
パッケージを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/071a024f-02bf-8bb5-8a09-d7be0f1f22bb.png)


`apt install apt-transport-https ca-certificates curl software-properties-common`
Do you want to continue? [Y/n]が出たら「**Y**」を入力してEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/02e02968-b140-d734-2e7a-37be2a56439a.png)

#### コマンド解説
**・apt**　パッケージ管理コマンドでDebian系ディストリビューションで使用

**・apt-transport-https**　　aptコマンドはhttpsに対応させるのに必要なパッケージ

**・ca-certificates** 　CA証明書を扱うパッケージ。通常curl コマンドで HTTPS 通信しようとするとエラーが発生

**・curl**　URLを用いてファイルを送信または受信するコマンドラインツール

**・software-properties-common**　aptリポジトリを抽象化して扱いやすくするパッケージ(実行コマンドを減らす目的)

`curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/65ed9cb2-95c2-3fea-83c8-52a193d20edc.png)

#### コマンド解説
**・curl -fsSL**　エラー時の挙動時を分かりやすくし、通信失敗するとリトライ

**・apt-key add -**  aptからUbuntu公式以外からパッケージを取得する際に認証する鍵情報を取り込んでおく


`add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"`

Press [ENTER] to continue or Ctrl-c to cancel.が出たらEnterを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/258bdf30-764d-6e06-1faf-78189f726018.png)

#### コマンド解説

**・add-apt-repository**　パッケージを新たに追加

`apt update`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/de729012-6fba-97da-b2c8-4048be74592c.png)


`apt-cache policy docker-ce`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/cfe3adcf-5547-6348-33b7-ca595cf83218.png)

#### コマンド解説

**・apt-cache policy**　特定のバージョンをインストールした際のバージョン確認


`apt install docker-ce`
Do you want to continue? [Y/n]が出たら「**Y**」を入力してEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/91da6b57-3e37-6759-af4a-1fc21a4c2bd8.png)

これでDockerインストール完了です。

# Ubuntuのバージョン更新

今の状態でDockerを起動させると以下エラーが発生してしまいます。
***Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/94ee3361-a532-867f-58c6-cf417c365804.png)

解消するにはUbuntuのバージョンを更新しなければなりません。
Ubuntuを起動した状態で管理者権限のPowerShellを起動します。

`wsl --list --verbose`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/cb387b82-6693-0190-6a0e-2bff51571431.png)

UbuntuのVERSIONが1のため2に変更します。

`wsl --set-version Ubuntu 2`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/36e64cd9-0d1f-e924-1b3a-5ed12adece37.png)

wslを終了します。

` wsl --shutdown`

終了後Ubuntu画面では下記の状態になるので、Enterを押して終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/8f8b7734-95c2-bb4f-85d2-18b1ee452047.png)

これでUbuntuのバージョン更新完了です。

# Docker起動・確認

再度スタートメニューのUbuntuを起動させて以下コマンドを入力します。

`sudo su`
パスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5eb4b999-9518-7ec9-8e84-02261e569885.png)

`service docker start`
`service docker status`

Docker起動コマンドを実行しますが、失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5335c1d9-8b6b-10fc-b65a-48e53bda9284.png)

`dockerd`
iptableでエラーが発生していますが、これはwslのバグです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/31083a34-dae4-5cc4-1cb3-26f05b3baa73.png)

以下コマンド実行後、1を入力して実行します。
`update-alternatives --config iptables`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/d135e055-381f-c75f-e7e2-beaf20229ae8.png)

再度Ubuntuを開き直して、下記コマンドを実行すると正常稼働が確認できます。
`sudo su`
`service docker start`
`service docker status`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5d536f17-d5d7-4518-2b06-9725a9e116c6.png)

`docker version`
バージョンも確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bc468104-3879-2ffd-a247-ce2d62de89b6.png)

これでDocker実行は以上となります。

# WindowsからUbuntuへのファイルアクセス

エクスプローラーのパスに以下を入力すると、WindowsからUbuntuのストレージにアクセス出来ます。

`\\wsl$`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/630b7eb9-4144-c215-8017-26e95fa0bf6d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/3b915495-e2b0-73cb-9ba3-fc7ce5ed7328.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/e4ea1d3d-aed6-d9e0-647a-62bc43ac3f07.png)

# 余談 dockerdの実行
dockerdを実行すると起動に失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/f5904bc5-5768-1898-9222-11b5ff44c6c0.png)

解決策として以下を実行します。
`rm /var/run/docker.pid`
`dockerd`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5f22c3ed-83b8-6b29-6392-4f524be1ba75.png)

再度エラーが発生しているので下記を実行します。
`ps -aux | grep dockerd`
`kill -9 該当ID` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/b895b14f-c3ff-7c21-4d0c-d3af70339ee7.png)

`dockerd`
実行を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ec441c7a-e17c-c062-311b-920e24c6f8f1.png)

# 参考サイト
https://www.aise.ics.saitama-u.ac.jp/~gotoh/HowToEnableWSL.html#toc2
https://vividcode.hatenablog.com/entry/linux/ubuntu-ca-certificates
https://mirahouse.jp/n10/blog/2015/apt-transport-https/
https://hy4yh.hatenablog.com/entry/2018/12/06/183841
https://note.com/npaka/n/n58ce1fac14ef
https://thr3a.hatenablog.com/entry/20191110/1573353587
https://patrickwu.space/2021/03/09/wsl-solution-to-native-docker-daemon-not-starting/
https://github.com/docker/for-linux/issues/517

これで以上となります。
見て頂きありがとうございました。