Automatically Docker Daemon Boot on Windows Subsystem Linux（WSLにおけるdockerデーモンの自動起動）

# 動機

windows10 homeにwsl2でdockerを導入して、ついでにdocker-composeも積むことで最高の開発環境を作ろうとしたのだが、一度電源を落とすとログオンの度に手動で `daemon` くんを起動し直さなければならないことに気づいた。`docker-compose.yml` で `restart:always` している関係上、できればWin10が再起動してしまってもログオンすればすぐに `daemon` くんには起きていてほしい……！

# TL; DR

cf. [Docker Running Seamlessly in Windows Subsystem Linux](https://medium.com/faun/docker-running-seamlessly-in-windows-subsystem-linux-6ef8412377aa)

**1. `sudo vi /usr/local/sbin/start_docker.sh`**

> ```sh:/usr/local/sbin/start_docker.sh
> #!/usr/bin/env bash
> 
> # The first command will setup cgroups mounts on the subsystem
> # (this only needs to be done once per reboot), and the second 
> # will bring up the docker service using systemd.
> 
> sudo cgroupfs-mount
> sudo service docker start
> ```

**2. 実行権限を付与する**

> ```Console
> $ sudo chmod +x /usr/local/sbin/start_docker.sh
> # Lock down edit privileges
> $ sudo chmod 755 /usr/local/sbin/start_docker.sh
> ```

**3. `sudo vi /etc/sudoers`**

- **最下部**に以下の項目を追記

> ```conf:/etc/sudoers
> # Enable docker services to start without sudo
> yourUserName ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh
> ```

**4. タスクスケジューラでログオン時にwsl上のdockerを起動**

- 全般
    - 「最上位の特権で実行する」にチェック
- トリガー
    - ログイン時　かつ　少し時間差を持って起動する
    - 同時にやると意図せず事故るかもしれないので
- 操作
    - プログラム：`C:\Windows\System32\bash.exe`
    - 引数の追加：`-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"`
- 条件
    - 「AC電源に～」のチェックを外す
- 設定
    - お好みで


**5. 再起動してログオンし直したあと、`sudo service docker status` で動作を確認**

> ```Console
> $ sudo service docker status
>  * Docker is running
> ```

# 私的解釈（自己中心的な解説）

## １．`sudo vi /usr/local/sbin/start_docker.sh`

`start_docker.sh` というシェルスクリプトを `/usr/local/sbin` というディレクトリに置いている。書き込みにはroot権限が必要なことに注意したい。vi で開くと読み込み限定になっているため、`:w !sudo tee %` すればよさそう？（エディタ初心者並感）

## ２．実行権限を付与する

`chmod` コマンドを使用して、`/usr/local/sbin/start_docker.sh` の権限を変更している。オプションに `+x` を用いているので、"eXecution" を追加したことになる。これをただ単に付与するだけじゃなくて、対象ごとに数字で指定するやり方が `chmod OOO` ということになる。
この操作により、`/usr/local/sbin` に置かれているスクリプトをシステム側から実行できるようになる。

## ３．`sudo vi /etc/sudoers`

`/etc/sudoers` には `sudo` 周りのあれこれが設定されている（実行可能ユーザとかコマンドとか）。このファイルへの変更は即座に反映されるため、`:w !sudo tee %` する前に誤字脱字等がないか念入りに確認すること（二敗）。もしミスすると、`sudo` が使えません → 設定ファイルにエラーがあります！となって詰む。
もしそうなってしまったら、パスワードを再設定し直すときと同様に、`powershell` か `cmd.exe` から `wsl -u root` してrootログインする解決法がある（sudo無しで `/etc/sudoers` を変更できるユーザであるrootくんに頼んで修正する）

- 参照：[wsl でパスワードを忘れてしまった際の対処 - Qiita](https://qiita.com/iszk/items/557cd99739ea6cc82941)
 
## ４．タスクスケジューラでログオン時にwsl上のdockerを起動

![autostartDocker001_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/2b3bbb32-524c-11fa-662c-a39a533d2676.jpeg)
![autostartDocker002_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/3e4b53b4-55d2-f439-f8bd-5b47b636ec51.jpeg)
![autostartDocker003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/0e0b65da-b9e1-b8d8-488c-77e4baa16cff.png)
![autostartDocker004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/47986a81-0ef2-3952-a276-08a63deea3b5.png)
![autostartDocker005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/3067e5c9-e501-74fa-031a-d7df7d4cacf0.png)



# おまけ

実は `/usr/local/sbin/start_docker.sh` の内容はdocker起動コマンドに限らずどんなものであれ実行できる（たとえば `service` に登録してあるものなど、常に `sudo` が必要なものすべて）。インタラクティブ実行にならないように注意しつつ、`ssh` や `cron` などをここに追記しておくことで、ほとんど普通のサーバーと変わりない振る舞いをさせることができる。
　上記の工程それぞれでファイル名を `/usr/local/sbin/WSL_autostart.sh` などと変更して、そのファイルに適宜必要なコマンドを追記していくといいだろう。
 
# 参照：

- [Docker Running Seamlessly in Windows Subsystem Linux](https://medium.com/faun/docker-running-seamlessly-in-windows-subsystem-linux-6ef8412377aa)
- [wsl でパスワードを忘れてしまった際の対処 - Qiita](https://qiita.com/iszk/items/557cd99739ea6cc82941)