[deprecated] WSL2にdockerをインストールしてみた

# ご連絡

:::note alert
この記事に記載している情報は古いです。

Ubuntu24.04と、docker-compose-pluginに対応した新しい記事を書いているので、そちらを参考にしてください。
https://qiita.com/hkusaba/items/e5171ab77e3cacf1ddd2
:::

https://qiita.com/hkusaba/items/e5171ab77e3cacf1ddd2

---

# なんでわざわざWSL2に？


「[docker for windows](https://docs.docker.jp/docker-for-windows/install.html)があるのに、なんでまたWSL2使うのん？」という話。

確かに、**docker for windowsはGUIでコンテナやイメージが管理できる**というメリットがあります。。

ですが、**なにかと動作が重い**と感じたことありませんか？ (私や周りの話だとよくある)

そこで、WSL2にdockerを入れてみることにしました！

## WSLのインストール

下記の手順を参考にしつつ、導入しましょう。
https://docs.microsoft.com/ja-jp/windows/wsl/install

* Windowsのコマンドプロンプトを管理者権限で開く

Windows10であれば、`cmd`で検索して、「コマンドプロンプトを」右クリックで「管理者として実行」しましょう。

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246336/cb2c7242-143b-6bf2-6fe0-7ac9bd493561.png)

```bash:コマンドプロンプト(管理者権限)
# WSLのインストール
> wsl --install

# インストールされているWSLのディストリビューションをリストで詳細確認
# 下はdocker for windowsが入っている場合の例
> wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  docker-desktop         Running         2

# インストール可能なWSLのディストリビューションを確認
> wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS


# お好みで好きなディストリビューションをインストール
# 今回はUbuntu18.04を選択
> wsl --install -d Ubuntu-18.04
ダウンロード中: Ubuntu 18.04 LTS
インストール中: Ubuntu 18.04 LTS
Ubuntu 18.04 LTS はインストールされました。
Ubuntu 18.04 LTS を起動しています...

# インストールされたか再度確認する
# WSLのバージョンが1で入っているのがわかる
> wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  Ubuntu-18.04           Running         1
  docker-desktop         Running         2

# ubuntuをデフォルトに指定
> wsl --set-default Ubuntu-18.04

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

# バージョンアップとデフォルトになっているかを再度確認
> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

# WSLのデフォルトバージョンを2に指定
# デフォルトバージョンを設定しておくと、ディストリビューションもv2で入るらしい。。
> wsl --set-default-version 2
```

* Ubuntu18.04のインストール終了後、WSLのターミナルが起動する
    * WSLのデフォルトユーザの設定を求められるので入力
        * ユーザ名とパスワードを設定
        * パスワードは`sudo`で求められるので、忘れないようにする

```bash:WSLターミナル
Installing, this may take a few minutes...
.Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: wsl_user01
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

wsl_user01@DESKTOP-E78LFVQ:~$
```

ついでに、パーミッションのめんどくささを避けるために、WSLディストリビューションのデフォルトのユーザをrootに設定します。

```bash:コマンドプロンプト(管理者権限)
# インストールしたubuntu-18.04のデフォルトユーザをrootに指定
> ubuntu1804 config --default-user root
```

## WSLにdockerをインストール

下記の記事を参考に、WSLにdockerを入れていきましょう。

[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)

[DockerDesktopからWSL2上のみで動くDockerに移行する](https://zenn.dev/taiga533/articles/11f1b21ef4a5ff)

```bash:WSLターミナル(root)
# 古いバージョンのdockerを削除
$ apt-get remove docker docker-engine docker.io containerd runc

# パッケージインデックスの更新とパッケージインストール
$ apt-get update
$ apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# Dockerの公式GPGキーを追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# stableのレポジトリを追加
$ 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

# 再度パッケージインデックスを更新し、DockerEngineをインストール
$ apt-get update
$ apt-get install -y docker-ce docker-ce-cli containerd.io

# hello-worldイメージを実行されることを確認
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/



# docker composeのインストール
$ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# バージョン確認
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c

# dockerの状態を確認
$ service docker status
 * Docker is not running

```

## dockerの自動起動

このままだと、WSL起動のたびにdockerを起動する必要がある。
WSL起動時にdockerも起動するようにしてほしい。。してほしくない？

調べてみると、先駆者がいた。

https://qiita.com/ko-zi/items/949d358163bbbad5a91e

`service docker status | awk '{print $4}')`で、`not`か`running`かを判定して自動起動、なるほど～～～。

早速やってみた。

```bash:WSL(root)
vi ~/.bashrc
```

```bash:.bashrc
if test $(service docker status | awk '{print $4}') = 'not'; then
        sudo /usr/sbin/service docker start
fi
```

管理者権限のコマンドプロンプトで`wsl --shutdown`してWSLを一度落とし、再度Ubuntu18.04の起動時に`service docker status`で確認してみる。

```bash
$ service docker status
 * Docker is running
```

やった～、成功！
ありがとうございます。

# 最後に

これでWSLでdockerを使用する環境が整いました。

以前Docker for windowsでPHP・laravelの開発をする際に、単純な画面遷移や`php artisan tinker`などのコマンド実行が遅いことに悩まされていましたが、WSL2のdockerを使用することでそういった悩みが解消された気がします。

(単純にPC変えた影響もありそうですが。)

皆さんも快適な開発ライフを！