非管理者ユーザでDocker Desktop WSL2 バックエンドを使用する為にセットアップをしてみた

## はじめに
社内業務として Docker の検証を行う際に、セットアップで思いのほか苦労しました。
個人開発では、私用PCを管理者権限で使用できますが、業務用PCでは、非管理者ユーザでの使用を余儀なくされることも多いはず。そんな方の手助けになればと思い、記事を執筆しています。

素人がトライ＆エラーの末にたどり着いた内容の為、有識者の方のご意見・ご感想もお待ちしております!

### この記事の内容
- 非管理者ユーザで Docker Desktop WSL2 バックエンドを使用する為に、セットアップをする（Windows 環境）
- Dockerの動作確認もかねて、DevContainer を使ってみる

### この記事の対象者
- 非管理者ユーザでDocker Desktop WSL2 バックエンドを使ってみたい方（Hyper-Vバックエンドは言及しません。）
- 非管理者ユーザでWSL2だけでも使ってみたい方（WSL2の導入から記載します。）

### 検証環境
- OS：Windows 10 Pro 22H2
- CPU：AMD Ryzen 5 5560U

:::note warn
タスクマネージャーにて、「仮想マシン：はい」と表示されていることを確認してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/baef43d5-1539-3622-a151-e38e4484150f.png)

### 注意
MS公式手順の ``` wsl --install ```ではエラーが出力されてしまいました。

https://learn.microsoft.com/ja-jp/windows/wsl/install

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/0dac846b-cc88-db78-1dc7-d4928397a140.png)

そのため、従来のWSL有効化手順を参考にして、設定を行います。  

https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

## 導入手順

### WSLの有効化

:::note warn
管理者ユーザで作業すると失敗するケースが有ります。（経験談）
作業するユーザを記載しておりますので、注意してください🙇‍♂️
:::
1. ***非管理者ユーザ***（=WSLとDockerを利用するユーザ）でログインする


1. PowerShellを管理者権限で起動 

1. Linux 用 Windows サブシステムを有効にする  
下記コマンドを実行する。  
``` dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart ```  
実行後、エラーがないことを確認する。

1. 仮想マシンの機能を有効にする  
下記コマンドを実行する。  
``` dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart ```  
実行後、エラーがないことを確認する。

1. Windowsを再起動する
1. ***非管理者ユーザ***（=WSLとDockerを利用するユーザ）でログインする
1. Linux カーネル更新プログラム パッケージをダウンロードする  
下記リンク先のファイルをダウンロードする。  
[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)  

    1. ダウンロードしたファイルを実行する。  
    管理者特権のアクセス許可を求めるメッセージが表示されたら、パスワードを入力し「はい」を選択する。  

    1. 正常に終了したら、「Finish」を選択する。

1. PowerShellを***一般ユーザ***（=WSLとDockerを利用するユーザ）で起動  
管理者権限で行うと、一般ユーザ環境のWSLに設定が反映されません。

1. WSL 2 を既定のバージョンとして設定する  
PowerShell にて次のコマンドを実行する。  
```wsl --set-default-version 2```  

### WSLにLinuxディストリビューションをインストール

:::note info
ここでは「Ubuntu 22.04 LTS」をインストールしますが、任意のディストリビューションを選択可能です。
:::

1. PowerShellを***一般ユーザ***（=WSLとDockerを利用するユーザ）で起動  
管理者権限で行うと、一般ユーザ環境のWSLにインストールされません。

1. Linux ディストリビューションをインストールする  
コマンド```wsl --install -d Ubuntu-22.04```を実行する。

### Ubuntuの初期設定を行う 
インストールが完了すると、自動でWSLが起動する。  
1. 初回起動時のみ、```Installing, this may take a few minutes...``` と表示されるので、暫く待つ。  
1. ```Enter new UNIX username:``` と表示されたら、新規ユーザ名を入力しEnterを押下する。  
1. ```New password:``` に続けて、パスワードを設定する。（確認の為に2回入力を求められる。） 
1. ソフトウェア更新を行う（インターネットへの疎通テストも兼ねる）  
    - ```sudo apt update```コマンドを実行する。  
パスワードの入力を求められるので、設定したパスワードを入力する。
    - 続けて、```sudo apt upgrade -y```を実行する。  
初回は特に時間がかかるので、しばらく待つ。

### WSL上にDockerをインストールする
Dokcer Desktopと連携するために、WSL上のLinuxにもDockerパッケージをインストールします。
※本来この手順は不要な想定ですが、動作確認を行った際にDockerパッケージがインストールされていない旨のエラーメッセージが表示された為、明示的にインストールしています。
（有識者の方、解決策が有れば教えてください。😭）

1. インストールされているDocker競合パッケージを削除
    ```bash
    # （１コマンドであることに注意）
        for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
    ```

1. Dockerの apt リポジトリを追加

    ```bash
    # Add Docker's official GPG key:
    $ sudo apt update
    $ sudo apt install ca-certificates curl
    $ sudo install -m 0755 -d /etc/apt/keyrings
    ```
    ```bash
    # （１コマンドであることに注意）
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    ```

    ```bash
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    ```

    ```bash
    # Add the repository to Apt sources:
    # （１コマンドであることに注意）
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    ```
    ```bash
    sudo apt update
    ```

1. 最新版のDockerをインストール

    ```bash
    # （１コマンドであることに注意）
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    ```
1. Dockerが動作するかを確認
    ```bash
    sudo docker run hello-world
    ```
    このコマンドはテストイメージをダウンロードし、コンテナ内で実行します。コンテナが実行されると、確認メッセージを表示して終了します。

### WSL上のDockerを非rootユーザで起動可能とする

WSL上にインストールされたDockerはroot権限が必要となるため、一般ユーザの所属グループを変更します。

1. ``` docker ``` グループを確認する。

    ```bash
    $ cat /etc/group | grep docker
    docker:x:999:
    ```

1. ユーザの追加

    ```bash
    $ sudo gpasswd -a USERNAME docker
    ```

1. ```exit```コマンドでUbuntuを終了する。 

1. PowerShell上で ```wsl --shutdown``` コマンドでWSLを終了する。 

1. WSL を起動し、``` sudo ``` なしで```docker``` コマンドの動作確認する。
    ```bash
    docker run hello-world
    ```

### Docker Desktop の導入 
下記サイトを参照して、インストールを進める。  
 [Docker Desktop WSL 2 backend on Windows](https://docs.docker.com/desktop/wsl/#download)  
1. インストーラーをダウンロードする。  
[Docker Desktop for Windows](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?_gl=1*b1vway*_ga*MTczNTI5NTU3NC4xNzEyNDY5MzI5*_ga_XJWPQMJYHQ*MTcxNzUwMDI5OS40LjEuMTcxNzUwMDMwMi41Ny4wLjA.)
1. インストーラーを管理者権限で実行する。  
デフォルト設定のまま進む。（「Use WSL2 instead of Hyper-V」のチェックを確認する。）
1. 終了すると再起動を求められるため、各種アプリケーションを終了し、「Close and log out 」を選択する。  

### 非管理者ユーザを「docker-users」グループに追加
1. ***管理者ユーザ***でログインする

1. Dockerの初期設定画面は、一度閉じる

1. コンピュータの管理を開く  
```Win+X```もしくはWindowsメニューを右クリックする。 

1. 「ローカルユーザーとグループ→グループ→docker-users」をダブルクリック→「追加」をクリック

1. 一般ユーザ（=WSLとDockerを利用するユーザ）のユーザ名を入力し、「名前の確認」をクリック  
「ドメイン名￥ユーザ名」と変換されたら、「OK」をクリック  
![image-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/66d4c268-b6c3-06ca-c7e2-40febe722dac.png)

1. 「適用」→「OK」の順にクリック

1. 再起動し、非管理者ユーザでログイン

### Docker Desktopの設定
1. インストールが完了したら、Windows の 「スタート」 メニューから Docker Desktop を起動する。
1. 「Accept」をクリック
1.  Use recommended settingsを選択し、「Finish」をクリック  
1. 「Continue without signing in」をクリック→「Skip survey」をクリック
1. Docker Desktop画面の右上にある歯車マークをクリックし、設定画面を開く
1. 「General」内の「Use the WSL 2 based engine」が有効化されていることを確認する。  
![image-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/4c074319-b2a1-d583-efb3-ef75adfa002e.png)
1. 「Resources」→「WSL Integration」内の```Enable integration with my default WSL distro```が有効化されていることを確認する。  
そして、インストール済みの WSL 2 ディストリビューションから選択・有効化する。    （今回は```Ubuntu-22.04```）
1. ```Appky&restart```をクリック
1. 設定を反映させるために、Dokcerを終了する。  
画面左下より、Docker Engineを停止できる。 
![image-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/6eaa0a3c-efa2-93f5-b75c-39ddba5283c8.png)

### VS Code + DevContainer拡張機能を導入する（動作検証用）

1. VisualStudio Codeをインストール  
    - リンク先よりインストーラーを入手し、指示に従いインストールをする。  
    [Download Visual Studio Code](https://code.visualstudio.com/Download)
    - PATHの反映にはOS再起動が必要なため、再起動を推奨

1. VS Code拡張機能のインストール

    1. 日本語化パッケージ（任意）
    [Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
    1. WSL 連携拡張機能
    [WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
    1. Docker 拡張機能
    [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
    1. DevContainer 拡張機能
    [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)

### 動作確認
Python 開発環境設定ドキュメントに含まれている、Django 用の Hello World チュートリアルのソース コードを使用します  
1. WSL ターミナルを開き、任意のフォルダで次のように入力します。  
    ```bash
    mkdir -m 777 ~/testDevContainer/
    cd ~/testDevContainer/
    git clone https://github.com/mattwojo/helloworld-django.git
    ```

1. プロジェクトフォルダを開く  
```cd helloworld-django```  

1. VS Code でプロジェクトを開く  
```code .```  

1. フォルダを信頼するか聞かれるため、「Yes」を選択する。
1. VS Code インスタンスの左下隅にある「青色のリモート インジケーター」を確認して、WSL Linux ディストリビューションに接続していることを確認する。
![image-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/2346147c-fd61-512d-fb4a-084c67634487.png)
1. リモート インジケーター(WSL:Ubuntu-22.04の表示部分)をクリックし、「コンテナーで再度開く（Reopen in Container）」を選択する。
※本手順は負荷が高く、処理に時間を要する（5分～10分）ため、他のアプリケーションを終了することを推奨。

1. VS Code の新しいインスタンスが開き、新しいイメージの構築が開始される。  
※初回ビルドには時間を要する。  
ビルドが完了すると、コンテナーが開始される  
左下のリモートインジケーターの表示が「DevContainer:Python 3」と表示され、各種ファイルが表示されると処理は完了となる。  
![image-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676845/14e22cf9-ffb7-a429-6130-41ea646a97bc.png)

1. ```Ctrl + @```でターミナルを開き、ターミナル右上にある「+」マーク横の「Launch Profile...」から```bash```を選択する。  
1. ```uname```と入力してオペレーティング システムを確認し、```python3 --version```と入力して Python のバージョンを確認する。  
    ```bash
    vscode ➜ /workspaces/helloworld-django (master) $ uname
    Linux
    vscode ➜ /workspaces/helloworld-django (master) $ python3 --version
    Python 3.11.4
    ```
1. ```manage.py```をエディタで開き、F5キーでデバッグを開始する。  
1. [http://127.0.0.1:8000/](http://127.0.0.1:8000/)をブラウザで開き、```Hello World! Django is running!```と表示されれば、設定は完了となる。  


## さいごに
私用PCでDockerを導入した際は、管理者権限でごり押しができたのですが、非管理者ユーザという要件が加わった途端に難航しました・・・

ニッチな記事だと思いますが、どなたかのお役に立てれば幸いです！
（重ね重ね、有識者の方のご意見・ご感想おまちしています🙇‍♂️）