WSL2でDocker環境構築(Docker Desktop有料化対策)

従業員数が250人以上または、収益が1000万ドル以上の企業ではDocker Desktopを無料で使えません。  
ですが、無料でDockerを使うことのできる抜け道?があるようです。  

以下記事をベースに環境構築をしていきます。  
[Windows 10 + WSL 2 でDocker環境を構築する（Docker Desktop有料化対策）](https://blog.ecbeing.tech/entry/2021/09/07/150000)

## WSL2をインストール
**前提条件を確認する**  
* PCの `設定>システム>詳細情報>Windowsの仕様` からWindowsのバージョンを確認。
  * `Windows 10 バージョン 2004 以上 (ビルド 19041 以上) または Windows 11`の場合  
    [WSL を使用して Windows に Linux をインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/install)

  * 古いバージョンの場合  
    [以前のバージョンの WSL の手動インストール手順](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual)

**WSL2のインストール**  
上記リンクの手順に従って、WSL2をインストールする。  
今回LinuxディストリビューションはデフォルトのUbuntuをインストールしている。  
インストールが完了したら、***PCを再起動***。

* PCを再起動したらUbuntuを起動。  
  ユーザの作成を求められるので適当に作成。(ここで作るユーザーはパワーユーザー的なもの。sudoコマンドが使える。)  
  ![ubuntu_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/2ef02b29-a620-d68d-21cb-ab01e06031dc.png)

* Ubuntuで以下コマンドを入力。パッケージの更新とアップグレードをしておく。
  ```terminal
  sudo apt update && sudo apt upgrade
  ```

* 再度管理者権限でコマンドプロンプトを起動して、以下コマンドを入力し、WSLのバージョンが2になっているかを確認。
  ```terminal
  wsl -l -v
  ```
  Ubuntuの`VERSION`が2になっており、左に`*`がついていたらOK。  
  ```
  C:\WINDOWS\system32>wsl -l -v
    NAME      STATE           VERSION
  * Ubuntu    Running         2
  ```
  Ubuntuのバージョンが1になっていた場合、2にアップグレードする。
  ```terminal
  wsl --set-version Ubuntu 2
  ```
  例えばDocker Desktopをインストールしているなど、既定のディストリビューション(`*`がついているもの)がUbuntu以外の場合、変更する。
  ```terminal
  wsl --setdefault Ubuntu
  ```

> **rootユーザのパスワード** (2024/6/16 追記)
> いちいちsudoをつけるのが煩わしいので軽く調べたが、よくわからなかったので適当なものに変更する。
> Ubuntuで操作。
> sudoをつけることでrootユーザのパスワードではなく、上で作ったパワーユーザのパスワードでrootユーザになれる。
> ```
> sudo su -
> ```
> passwdコマンドでrootユーザのパスワードを変更。
> ```
> passwd
> ```

## Dockerインストール
ここからはUbuntuで作業していきます。  
[Install Docker Engine on Ubuntu(docker docs)](https://docs.docker.com/engine/install/ubuntu/)の手順通りにインストールしていきます。  
全部英語なので、以下にコマンド部分を抜粋して書いていきます。
また、以下の操作は上で作ったパワーユーザ(ubuntu)で操作する前提のため、すべてのコマンドの頭にsudoをつけていますが、rootユーザで操作するならsudoはなくてもいけます。

**競合しそうなパッケージをアンインストール。**  
(多分インストールされていないと思いますが念のため。)
```terminal
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

**インストール**  
リポジトリをセットアップ
1. aptがHTTPS経由でリポジトリを使用できるように更新、インストールします。
    ```terminal
    sudo apt-get install ca-certificates curl gnupg
    ```
2. Dockerの公式GPGキーを追加します。
    ```terminal
    # 権限を指定しつつGPGキーをダウンロードするフォルダを作成。
    sudo install -m 0755 -d /etc/apt/keyrings
    # GPGキーをダウンロード。
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    # GPGキーの権限を変更。
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    ```
3. リポジトリをセットアップします。
    ```terminal
    echo \
    "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    ```

Dockerをインストール
1. aptを更新。
    ```terminal
    sudo apt-get update
    ```
2. Docker Engine、containerd、Docker Compose をインストールします。
    ```terminal
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    ```
3. hello-worldイメージを実行して、Dockerエンジンのインストールが成功したことを確認します。
    ```terminal
    sudo docker run hello-world
    ```

> パワーユーザでdockerコマンドをsudoなしで実行できるようにする。
> * `docker`グループに今回操作に使用しているユーザー(上で作った`ubuntu`)を追加する。
>   ```terminal
>   sudo usermod -aG docker ubuntu
>   ```
>
>  一旦ログアウトして、Ubuntuを再起動するとsudoなしでdockerコマンドが使用できるようになっている。

## 作業フォルダを同期する
特に何か設定しなくても双方からフォルダを参照することは出来るが、デスクトップやホームディレクトリから遠いので一工夫すると作業がしやすい。  

**①UbuntuにWindowsの作業フォルダのシンボリックリンクを作る**  
UbuntuからWindowsのデスクトップには`/mnt/c/Users/[Windowsのユーザー名]/Desktop`でアクセスできます。  
しかし、毎回この長ったらしいのを入力してフォルダ移動するのが面倒なので、Ubuntuの`ubuntu`ユーザーのホームディレクトリとWindowsの作業フォルダを繋げましょう。

1. Windowsのデスクトップに作業フォルダ`docker`を作成。  
    ![symbolic_link_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/05515ac5-6637-b08a-ded2-f4189ce87f5a.png)
2. 以下コマンドを入力してシンボリックリンクを作成。
    ```terminal
    ln -s /mnt/c/Users/[Windowsのユーザー名]/Desktop/docker docker
    ```
3. `ls -al`コマンドでシンボリックリンクが作成できているか確認。  
    ![symbolic_link_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/f6afa023-7518-1c26-d640-8bae29bce3f5.png)
    これでUbuntuの`docker`ディレクトリとWindowsデスクトップの`docker`フォルダが同期します。  

**②Ubuntuの作業ディレクトリのショートカットをWindowsに作る**  
WidousからUbuntuのホームディレクトリには`\\wsl$\Ubuntu\home\[Ubuntuのユーザー名]`でアクセスできます。  
ホームディレクトリに作った作業フォルダのショートカットをWindowsのデスクトップに置いておくと便利です。

1. Ubuntuの`ubuntu`ユーザーのホームディレクトリに作業ディレクトリ`docker`を作成。  
    ```terminal
    mkdir docker
    ```
2. Windowsのエクスプローラーで`\\wsl$\Ubuntu\home\[Ubuntuのユーザー名]`にアクセスし、作業ディレクトリ`docker`のショートカットを作成、デスクトップ等に配置する。

**余談**  
Ubuntuから`/mnt/c/Users/[Windowsのユーザー名]/...`でWindowsにアクセスすると遅いと聞いたが、少なくとも`docker compose build`が完了する速度はあんまり変わらなかった。  
コマンドが実行されている間はWindowsの操作が重かったが、こちらも①と②であんまり差が無かった気がする。(こっちは体感だけど)

* ①の方法  
  ![symbolic_link_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/2a522c0b-4650-b53c-f36e-658d0f1c7227.png)
* ②の方法  
  ![symbolic_link_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729481/2e46d4c9-2ad8-6a6f-d7b2-8a1f1d0da1e6.png)

検索して出てくるのは主にフロントエンドのフレームワークの記事だったので、dockerはあんまり変わらないのかも。