LoginSignup
9
11

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-01

動機

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

TL; DR

cf. Docker Running Seamlessly in Windows Subsystem Linux

1. sudo vi /usr/local/sbin/start_docker.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. 実行権限を付与する

$ 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

  • 最下部に以下の項目を追記
/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 で動作を確認

$ sudo service docker status
 * Docker is running

私的解釈(自己中心的な解説)

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

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

2.実行権限を付与する

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

3.sudo vi /etc/sudoers

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

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

autostartDocker001_LI.jpg
autostartDocker002_LI.jpg
autostartDocker003.png
autostartDocker004.png
autostartDocker005.png

おまけ

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

参照:

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11